我对python很陌生,把它当作一种爱好兴趣,并通过一些搜索发现自己从“计算实践”中获得了一系列练习,其中一个要求写作一个ASCII数字,如下所示。
这一切似乎都是一个足够简单的练习,但我似乎无法绕过使用数字绘制这个,练习说明上面的绘图是通过使用数字“1”绘制的。
它还指出,不能或不应该使用0或100以上的数字来创建ASCII绘图。
这是另一个例子:
这里的输入是数字“2”。
我找到了一种方法来显示第一个图像,但不是通过任何方式使用给定的数字,只是在while循环中的一个简单的“else”,所以我可以过滤掉下面的数字或等于0且高于或等于100.
我已经死了。
我的代码如上所述,不使用变量编号来创建第一张图:
while True:
s = input("Give me a number to make a drawing with that is between 0 and 100: ")
if not s.isdigit():
print ("Error, only numbers will make this program run.")
continue #Try Again but with a number this time
if int(s) >= 100:
print ("The number is bigger than or equal to 100 and won't work. \nDo try again.")
continue #try again
if int(s) <= 0:
print ("The number is smaller than or equal to 0 and won't work. \nDo try again.")
continue #try again
else:
print ("%5s" %("*" *3),"\n"'%5s' %("* *"),"\n" '%7s' %("*** ***"),"\n" '%7s' %("* *"),"\n" '%7s' %("*** ***"),"\n" '%5s' %("* *"),"\n" '%5s' %("*" *3))
print ('Want to make another drawing ?')
continue #make another drawing
该练习陈述如下:
大小$ n $的ASCII图由一行或多行组成。在每一行上只允许空格和星号(*),在一行上的每个星号之后不允许有空格,因此你应该以“\ n”或换行符结束。然后是上述例子。
我的新代码示例依赖于变量输入: 此外,在此代码示例中,它设置为在输入为1时触发,当我增加输入数字时,我仍然在“放大”整个绘图时出现问题。
while True:
A = input("Give me a number to make a drawing with that is between 0 and 100: ")
b = "***"
c = "*"
d = " "
if not A.isdigit():
print ("Error, only numbers will make this program run.")
continue #Try Again but with a number this time
if int(A) >= 100:
print ("The number is bigger than or equal to 100 and won't work. \nDo try again.")
continue #try again
if int(A) <= 0:
print ("The number is smaller than or equal to 0 and won't work. \nDo try again.")
continue #try again
else :
range(1,99)
if int(A) == (1) :
print ((d *((int(A))*2)) + b,)
print ((d *((int(A))*2))+ c + d + c,)
print ((d *((int(A))*0))+ b + d + b,)
print ((d *((int(A))*0))+ c + d*5 + c,)
print ((d *((int(A))*0))+ b + d + b,)
print ((d *((int(A))*2))+ c + d + c,)
print ((d *((int(A))*2)) + b,)
continue #try again
但是我仍然得到了一个探索器,其中“增长”了ASCII数字内的空间数量,同时增加了1比2.
因为我对第3行也有问题,因为它需要沿着控制台的两侧表示,它应该与侧面的间距为0,但它必须增加到2的间距数字2。
答案 0 :(得分:14)
考虑1和2之间的区别。尝试手动绘制3和4应该是什么样子来使序列工作。把它想象成一个问题,你会得到一个序列的开始,你必须完成其余的工作。
像:
0 1 1 2 3 5 8 13
如果你没有意识到这一点,那就是Fibonacci序列。一旦找出模式,就可以编写一个任意长的值序列。
考虑一下这个简单的ascii序列:
1)
#
2)
##
#
3)
###
##
#
4)看起来像什么?
或另一个ascii序列:
1)
#
2)
#
# #
#
3)
#
# #
# #
# #
#
什么是(4)?
如果它仍然没有意义,请尝试设计一些自己的递归形状,这些形状与您想要弄清楚的形状有点类似(可能与我的第二个示例相似)。不要担心现在如何编码,只是担心输出应该是什么。然后查看模式并提出算法。
答案 1 :(得分:3)
首先,逐行分析图形以识别不同类型的图案。
我们可以编写一个打印这些模式的函数。
def cap(spacesBefore):
print " " * spacesBefore + "***"
def wall(spacesBefore, spacesBetween):
print " " * spacesBefore + "*" + " " * spacesBetween + "*"
def floor(spacesBefore, spacesBetween):
print " " * spacesBefore + "***" + " " * spacesBetween + "***"
接下来,编写将显示大小为0,1和2的图形的代码。这可以让您深入了解如何显示任何大小的图形。
#size 0
cap(0)
wall(0,1)
cap(0)
print "\n"
#size 1
cap(2)
wall(2, 1)
floor(0, 1)
wall(0, 5)
floor(0, 1)
wall(2, 1)
cap(2)
print "\n"
#size 2
cap(4)
wall(4, 1)
floor(2, 1)
wall(2, 5)
floor(0, 5)
wall(0, 9)
floor(0, 5)
wall(2, 5)
floor(2, 1)
wall(4, 1)
cap(4)
输出:
***
* *
***
***
* *
*** ***
* *
*** ***
* *
***
***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
***
分析用于制作这些数字的代码,一些模式变得明显。对于大小为N的数字:
模式全部以线性速率增长和收缩,然后以线性速率收缩和增长。这意味着我们应该使用两个具有相反条件的for
循环,并为封盖和中心墙添加一些额外的代码。
def draw(N):
cap(2*N)
for i in range(N): #loop from 0 to N-1
wall(2*(N-i), 1+(4*i))
floor(2*(N-i-1), 1+(4*i))
wall(0, 4*N+1)
for i in range(N-1, -1, -1): #loop from N-1 to 0
floor(2*(N-i-1), 1+(4*i))
wall(2*(N-i), 1+(4*i))
cap(2*N)
现在测试代码。
for i in range(7,10):
draw(i)
print "\n"
输出:
***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
***
***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
***
***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
***
答案 2 :(得分:2)
要找到模式,您可以想象turtle将如何绘制它。例如,绘制:
***
* *
***
乌龟可以按照以下说明操作:
作为Python程序:
import turtle
turtle.right(90); turtle.forward(50)
turtle.right(90); turtle.forward(50)
turtle.right(90); turtle.forward(50)
turtle.right(90); turtle.forward(50)
turtle.exitonclick() # leave GUI open until a click
如果我们将“右转”缩写为'r'
并将“前进”缩写为"f"
,则说明为:
'rfrfrfrf'
很容易看出它是'rf' * 4
。遵循相同的程序:
***
* *
*** ***
* *
*** ***
* *
***
说明为'rflfrfrflfrfrflfrfrflfrf'
或'rflfrf' * 4
,其中'l'
代表“向左转”。
描述n
等于0
和1
两种情况的规则是:
("rf" + "lfrf" * n) * 4
,如果n = 0
则为'rf' * 4
,如果n = 1
则为('rf' + 'lfrf') * 4
。要检查公式,您可以为n = 2
绘制公式,并将其与已知答案进行比较:
***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
***
作为Python程序:
from turtle import Turtle
def get_romb_program(n):
assert n >= 0
side = "rf" + "lfrf" * n
program = side * 4 # romb has 4 sides
return program
def draw(turtle, n):
assert 0 <= n < 101
commands = {'r': lambda t: t.right(90), # turn right
'l': lambda t: t.left(90), # turn left
'f': lambda t: t.forward(2)
}
run(get_romb_program(n), turtle, commands)
def run(program, t, commands):
for c in program:
commands[c](t)
n = 2
t = Turtle()
scr = t.getscreen()
scr.xscale, scr.yscale = [101 // (n + 1)] * 2
draw(t, n)
scr.exitonclick()
要将其打印为ascii艺术品,您可以使用AsciiTurtle
代替turtle.Turtle
:
class AsciiTurtle(object):
def __init__(self):
self.path = [(0, 0)]
self.direction = (1, 0)
def forward(self, distance):
x, y = self.path[-1]
for i in range(1, distance + 1):
self.path.append((x + self.direction[0] * i,
y + self.direction[1] * i))
def right(self, angle_ignored): # 90 degree turn right
self.direction = self.direction[1], -self.direction[0]
def left(self, angle_ignored): # 90 degree turn left
self.direction = -self.direction[1], self.direction[0]
def show(self):
minx, maxx, maxy, miny = [f(xy[i] for xy in self.path)
for i in [0, 1] for f in [min, max]]
miny, maxy = -miny, -maxy # upside-down
board = [[' '] * (maxx - minx + 1) for _ in range(maxy - miny + 1)]
for x, y in self.path:
board[-y - miny][x - minx] = '*'
print('\n'.join(''.join(row) for row in board))
n = 5
t = AsciiTurtle()
draw(t, n) # defined above
t.show()
***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
*** ***
* *
***