Python 如何从长字符串中的一组指令绘制路径
3周前刚开始学习python,到目前为止,我基本上能够理解课堂上给出的信息。现在我对上一周的作业感到很不舒服。每天花无数的时间搜索、阅读、索引文档、GitHub和其他源材料,并尝试将其作为代码的一部分。有时候你只是不知道自己到底在找什么,这真的很难 我仍然不知道如何完成这个程序,它类似于海龟图形。 但是我们不允许使用海龟模块 我需要基本上创建一个算法,从一个很长的字符串中绘制一条路径。 (与海龟相似)Python 如何从长字符串中的一组指令绘制路径,python,python-3.x,Python,Python 3.x,3周前刚开始学习python,到目前为止,我基本上能够理解课堂上给出的信息。现在我对上一周的作业感到很不舒服。每天花无数的时间搜索、阅读、索引文档、GitHub和其他源材料,并尝试将其作为代码的一部分。有时候你只是不知道自己到底在找什么,这真的很难 我仍然不知道如何完成这个程序,它类似于海龟图形。 但是我们不允许使用海龟模块 我需要基本上创建一个算法,从一个很长的字符串中绘制一条路径。 (与海龟相似) A:往前走一步 D:右转90度 G:左转90度 T:第一次相遇会使衬里停止。第二次相遇将与衬
- A:往前走一步
- D:右转90度
- G:左转90度
- T:第一次相遇会使衬里停止。第二次相遇将与衬里发生反应
- 我试着用很多方法接近绳子。最后,我从主字符串中使用了a.split(t)来创建许多列表,其中t***t中的所有序列都不会被添加,这看起来很有希望,因为它们都是奇数索引,但我总是以大量冗余结束,并以失败告终
- 我还试图减少main function()的数量,并重新组合更多if-else语句,但我只是不断碰壁
- 我试图解决它,而工作的字符串只,但没有。。。我完全不知所措。如果有人能给我指出一个正确的方向,类似的问题,例子,更多的源材料,甚至修复这段代码的一部分,这样我就能更好地理解
def get_E0(x,y): ###UP
return x, y+1
def get_E1(x,y): ###RIGHT
return x+1, y
def get_E2(x,y): ###DOWN
return x, y-1
def get_E3(x,y): ###LEFT
return x-1 ,y
def get_DADE0(i,x,y): ### Def for every possible left or right turn
for letters in b[i]: ### Trying to work with the sliced list
if letters == 'A': ### For every possible left or right turn
x,y = get_E0(x,y) ### Was hoping to introduce a counter
if i % 2 == 0: ### for each index list in b
get_outAppend(outX,outY,x,y)
b[i] = b[i].lstrip('A')
if letters == 'D':
b[i] = b[i].lstrip('D')
break
return x,y,b
def get_DADE1(i,x,y):
for letters in b[i]:
if letters == 'A':
x,y = get_E1(x,y)
if i % 2 == 0:
get_outAppend(outX,outY,x,y)
b[i] = b[i].lstrip('A')
if letters == 'D':
b[i] = b[i].lstrip('D')
break
return x,y,b
def get_DADE2(i,x,y):
for letters in b[i]:
if letters == 'A':
x,y = get_E2(x,y)
if i % 2 == 0:
get_outAppend(outX,outY,x,y)
b[i] = b[i].lstrip('A')
if letters == 'D':
b[i] = b[i].lstrip('D')
break
return x,y,b
def get_DADE3(i,x,y):
for letters in b[i]:
if letters == 'A':
x,y = get_E3(x,y)
if i % 2 == 0:
get_outAppend(outX,outY,x,y)
b[i] = b[i].lstrip('A')
if letters == 'D':
b[i] = b[i].lstrip('D')
break
return x,y,b
def get_GAGE0(i,x,y):
for letters in b[i]:
if letters == 'A':
x,y = get_E0(x,y)
if i % 2 == 0:
get_outAppend(outX,outY,x,y)
b[i] = b[i].lstrip('A')
if letters == 'G':
b[i] = b[i].lstrip('G')
break
return x,y,b
def get_GAGE1(i,x,y):
for letters in b[i]:
if letters == 'A':
x,y = get_E1(x,y)
if i % 2 == 0:
get_outAppend(outX,outY,x,y)
b[i] = b[i].lstrip('A')
if letters == 'G':
b[i] = b[i].lstrip('G')
break
return x,y,b
def get_GAGE2(i,x,y):
for letters in b[i]:
if letters == 'A':
x,y = get_E2(x,y)
if i % 2 == 0:
get_outAppend(outX,outY,x,y)
b[i] = b[i].lstrip('A')
if letters == 'G':
b[i] = b[i].lstrip('G')
break
return x,y,b
def get_GAGE3(i,x,y):
for letters in b[i]:
if letters == 'A':
x,y = get_E3(x,y)
if i % 2 == 0:
get_outAppend(outX,outY,x,y)
b[i] = b[i].lstrip('A')
if letters == 'G':
b[i] = b[i].lstrip('G')
break
return x,y,b
a = str('AAAAADADAAGAAAAAAAGAADADAAAAADAAAAAAAAATDDAAAGATADAAADADAAATDAAADATAGAAAGAGAAATDADAATAAGAAGAAGAATAAATAAGAAGAAGAATDDAAAGADTADAAADADAAATATAAADADAAADATDAAAAGADTAGAAGATDAGGTAAAAAADAAAAAAAAADAAAAAATGGADTAGAAGATDADTAGAAAGAGATDAAAAAAAAADTAGAGAAAGA')
b = a.split('T')
x = 0 ### starting values for x,y
y = 0
outX, outY = [0], [0] ### List to append coordinates
while True: ### Here I was trying to see if the loops would work as intended
###
x,y,b = get_DADE0(0,x,y) #up
x,y,b = get_DADE1(0,x,y) #right
x,y,b = get_GAGE2(0,x,y) #down
x,y,b = get_GAGE1(0,x,y) #right
x,y,b = get_DADE0(0,x,y) #up
x,y,b = get_DADE1(0,x,y) #right
x,y,b = get_DADE2(0,x,y) #down
x,y,b = get_DADE3(0,x,y) #left
x,y,b = get_DADE0(1,x,y)
x,y,b = get_DADE1(1,x,y)
x,y,b = get_GAGE0(1,x,y)
x,y,b = get_DADE1(1,x,y)
x,y,b = get_DADE2(2,x,y)
x,y,b = get_DADE3(2,x,y)
x,y,b = get_DADE0(2,x,y)
x,y,b = get_DADE1(2,x,y)
x,y,b = get_GAGE0(2,x,y)
x,y,b = get_GAGE3(2,x,y)
x,y,b = get_DADE2(2,x,y)
break
plt.axis('equal') ### Plotting my figure.
plt.axis([0,7,0,10])
plt.plot(outX,outY, color = 'r')
你似乎在作业上下了很大的功夫。您需要的是如何解决此类问题的提示和技巧,因此,我不想立即给出完整的解决方案,而是想提供一种可能的策略,以逐步构建解决方案 与其事先根据笔是上是下来拆分字符串,不如在整个字符串上循环,并在字符串中遇到“T”时处理它们。毕竟,画笔向上或向下的唯一区别是我们是否应该存储当前位置以进行绘图。这意味着代码的主要部分看起来像
for command in a:
# do something with command
这里的命令
可以是移动(“a”)、旋转(“G”或“D”)或线条切换(“T”)。第一个命令“A”将根据海龟的当前位置和移动方向更新海龟的位置,“G”和“T”将更新海龟的移动方向。“切换”命令将更改画笔是向上还是向下。这意味着乌龟的状态可以用三个参数来描述:当前位置,(x,y)
,乌龟移动的方向,(u,v)
,以及一个布尔值来描述笔当前是向上还是向下,是向下。最初,海龟位于(0,0)
,我假设它在正y方向移动,即(u,v)==(0,1)
。钢笔一开始是放下的。考虑到这一点,for循环就变成了
x, y = (0, 0)
u, v = (0, 1)
is_pen_down = True
for command in a:
if command == 'A':
# move forward
elif command == 'G':
# rotate left
elif command == 'D':
# rotate right
elif command == 'T':
# update pen
下一步是确定海龟的新位置和方向
根据作业,“A”将使乌龟向前移动一步。这意味着如果(x,y)
是当前位置且(u,v)
是当前方向,则新位置将是(x+u,y+v)
。方向将保持不变
“D”将海龟向右旋转90度。在矢量表示法中,这意味着新方向将是(v,-u)
。在这种情况下,位置将保持不变
类似地,“G”将海龟向左旋转90度,这意味着新方向将是(-v,u)
使用这些表达式,更新后的for循环如下所示:
x, y = (0, 0)
u, v = (0, 1)
is_pen_down = True
for command in a:
if command == 'A':
x += u
y += v
elif command == 'G':
u, v = -v, u
elif command == 'D':
u, v = v, -u
elif command == 'T':
# update pen
剩下的是转动笔和画线。为此,我们需要在围栏放下时跟踪海龟的位置。这可以通过将当前的x和y位置附加到单独的列表中来实现,就像在代码中,每当笔放下时海龟的位置更新时一样。如果笔向上(即当命令等于“T”且为“pen\u down”
为真)时,应绘制线条,我们应开始新的线条。此外,当循环结束时,如果笔仍在向下,我们应该记住绘制当前行,并显示绘图。这意味着最终计划将类似于:
import matplotlib.pyplot as plt
a = 'AAAAADADAAGAAAAAAAGAADADAAAAADAAAAAAAAATDDAAAGATADAAADADAAATDAAADATAGAAAGAGAAATDADAATAAGAAGAAGAATAAATAAGAAGAAGAATDDAAAGADTADAAADADAAATATAAADADAAADATDAAAAGADTAGAAGATDAGGTAAAAAADAAAAAAAAADAAAAAATGGADTAGAAGATDADTAGAAAGAGATDAAAAAAAAADTAGAGAAAGA'
x, y = (0, 0)
u, v = (0, 1)
is_pen_down = True
outX = [x]
outY = [y]
for command in a:
if command == 'A':
x += u
y += v
elif command == 'G':
u, v = -v, u
elif command == 'D':
u, v = v, -u
elif command == 'T':
if is_pen_down:
# pen about to go up
plt.plot(outX, outY)
outX = []
outY = []
# toggle pen
is_pen_down = not(is_pen_down)
if is_pen_down:
outX.append(x)
outY.append(y)
# after loop, if pen is down plot open line
if is_pen_down:
plt.plot(outX, outY)
plt.show()
我必须说谢谢你,我确实更了解我积累的所有文档,以及我到底去了哪里,去了哪里