ASCII艺术与字母

时间:2014-10-13 01:07:45

标签: python python-3.x

我正在尝试创建一个脚本,该脚本将接受用户输入(仅字母)并将ASCII艺术输出给用户。两种输出方法是水平或垂直。我遇到的问题是如何水平打印字典值。

这是我到目前为止所做的:

def convert(string, horv):
    #Dictionary with '#' to create the art, only a and b in here so far
    letters = {"a":"  ##   \n #  #\n#    #\n######\n#    #\n#    #",
           "b":"#####  \n#    # \n#####  \n#    #\n#    #\n#####"}
    #making the word into a list so i can use each letter to call a key in the
    # dictionary
    word_broken = list(string)
    if horv == "1":
        #horizontal is easy
        for letter in word_broken:
            print(letters[letter])
    else:
        #My attempts at tring to print out the art line by line,
        #aka top of a - top of b- middle of a- middle of b so on...
        #ends in failure
        for letter in word_broken:
            b = letters[letter]
            for value in letter:
                split_value = b.split("\n")
                for obj in split_value:
                    print(obj, end="")

#user input
word = input("Word to conver: ")
#Hor or Vert
direction = input("1 for vert 2 for hor: ")
convert(word, direction)

尝试将艺术品分割为\ n标记,然后逐件打印。 任何想法将不胜感激!

P.S。这是我在这个网站的第一篇文章,所以我忘记了一些事情或者没有做正确的事情,请让我知道未来。 谢谢!

3 个答案:

答案 0 :(得分:2)

比你想象的更简单:

letters = {
    "a": [
        "  ##  ", 
        " #  # ",
        "#    #",
        "######",
        "#    #",
        "#    #",
    ],
    "b": [
        "##### ",
        "#    #",
        "##### ",
        "#    #",
        "#    #",
        "##### ",
    ]
}

str = 'abab'
for row in range(len(letters['a'])):
    for letter in str:
        print(letters[letter][row], end="  ")
    print()

基本上,每个字母都是行列表。在每个传递中打印行数,每个字母打印一行。

垂直打印:

for letter in str:
    print("\n".join(letters[letter]) + "\n")

答案 1 :(得分:0)

你的信件定义中存在一个微妙的问题。当你不是\n时,它会变得明显,而是使用列表来表示这一点。请查看以下代码:

In [254]: map(len, letters['a'].split('\n'))
Out[254]: [7, 5, 6, 6, 6, 6]

In [255]: map(len, letters['b'].split('\n'))
Out[255]: [7, 7, 7, 6, 6, 5]

这意味着当您翻转它们时,您的字母不会对齐。为此,您需要确保它们已对齐。让我们使用一个具体的例子(这是一般解决方案):la = letters['a'].split('\n')。我们将把它用于所有后续结果。现在定义一个漂亮的打印功能:def pprint(l): print '\n'.join(l),可以用来快速打印你的信件。使用它,水平打印很容易:

In [257]: pprint(la)
  ##
 #  #
#    #
######
#    #
#    #

对于垂直打印,您需要首先确保所有内容都相同,否则您将错过几行:

In [258]: pprint(map(lambda m: ''.join(m)  , zip(*la)))
  ####
 # #
#  #
#  #
 # #

这是因为并非所有字符串的长度都相同。因此,首先找到最大长度lMax = max(map(len, la)),并在取zip之前使所有内容的长度相同:

In [266]: la1 =[ l.ljust(lMax)  for l in la]

In [267]: pprint(map(lambda m: ''.join(m)  , zip(*la1)))
  ####
 # #
#  #
#  #
 # #
  ####

现在你所要做的就是将函数中的所有内容串起来:)

答案 2 :(得分:-1)

你的水平部分的根本问题是你首先在字母上循环,然后是部分。这将不可避免地导致第一个字母的所有部分在第二个字母的任何部分之前被打印。你需要的是循环的部分,然后是字母。像这样:

  for row_num in range(6): # 6 because the ascii art you've defined has six rows.
    for letter in word_broken:
        b = letters[letter]
        split_value = b.split("\n")
        print(split_value[row_num], end="")
    print("") # Go to the next line

你还需要做另外两件你可能没想过的事情:

  1. 确保所有字母的所有部分都具有相同的宽度。看起来你已经尝试过这样做,但我看到一些部分有6个字符,有些部分有7个。所以我要仔细检查一下。
  2. 以某种方式在字母之间添加一些空格。您可以在字母dictonary中的每个字母中构建一些空格,也可以定义一个空格字母并在给定单词的每个字母后打印。 更新:或将end=""更改为end=" ",例如georg。我比这两个想法更喜欢这个。