import turtle
turtle .tracer ( 1 , 0 )
def createLSystem( numIters, axiom) :
startString = axiom
endString = ""
for i in range ( numIters) :
endString = processString( startString)
startString = endString
return endString
def processString( oldStr) :
newstr = ""
for ch in oldStr:
newstr = newstr + applyRules( ch)
return newstr
def applyRules( ch) : #ПРАВИЛА ИТЕРАЦИИ
newstr = ""
if ch == 'F' :
newstr = '-F+F+[+F-F-]-[-F+F+F]' # Rule 1
elif ch == 'X' :
newstr = 'X+YF+' # Rule 2
elif ch == 'Y' :
newstr= '-FX-Y'
else :
newstr = ch # no rules apply so keep the character
return newstr
stack= [ ] #СПИСОК КООРДИНАТ ЧЕРЕПУХИ
def drawLsystem( aTurtle, instructions, angle, distance) : #ЧТЕНИЕ ПРАВИЛ ЧЕРЕПАХОЙ
for cmd in instructions:
if cmd == 'F' :
aTurtle.forward ( distance)
elif cmd == 'B' :
aTurtle.backward ( distance)
elif cmd == '+' :
aTurtle.right ( angle)
elif cmd == '-' :
aTurtle.left ( angle)
elif cmd == '[' : #НЕ РОБИТ МРАЗЬ
stack.append ( turtle .xcor ( ) )
stack.append ( turtle .ycor ( ) )
stack.append ( turtle .heading ( ) )
elif cmd == ']' :
x= float ( stack.pop ( -3 ) )
y= float ( stack.pop ( -2 ) )
a = float ( stack.pop ( -1 ) )
turtle .setx ( x)
turtle .sety ( y)
turtle .setheading ( a)
def main( ) :
inst = createLSystem( 7 , "F" ) # create the string
print ( inst)
t = turtle .Turtle ( ) # create the turtle
wn = turtle .Screen ( )
t.up ( )
t.back ( 200 )
t.down ( )
t.speed ( 0 )
drawLsystem( t, inst, 22 , 3 ) # draw the picture
# angle 60, segment length 5
wn.exitonclick ( )
main( )
aW1wb3J0IHR1cnRsZQp0dXJ0bGUudHJhY2VyKDEsIDApCgpkZWYgY3JlYXRlTFN5c3RlbShudW1JdGVycyxheGlvbSk6CiAgICBzdGFydFN0cmluZyA9IGF4aW9tCiAgICBlbmRTdHJpbmcgPSAiIgogICAgZm9yIGkgaW4gcmFuZ2UobnVtSXRlcnMpOgogICAgICAgIGVuZFN0cmluZyA9IHByb2Nlc3NTdHJpbmcoc3RhcnRTdHJpbmcpCiAgICAgICAgc3RhcnRTdHJpbmcgPSBlbmRTdHJpbmcKCiAgICByZXR1cm4gZW5kU3RyaW5nCgpkZWYgcHJvY2Vzc1N0cmluZyhvbGRTdHIpOgogICAgbmV3c3RyID0gIiIKICAgIGZvciBjaCBpbiBvbGRTdHI6CiAgICAgICAgbmV3c3RyID0gbmV3c3RyICsgYXBwbHlSdWxlcyhjaCkKCiAgICByZXR1cm4gbmV3c3RyCgpkZWYgYXBwbHlSdWxlcyhjaCk6ICAj0J/QoNCQ0JLQmNCb0JAg0JjQotCV0KDQkNCm0JjQmAogICAgbmV3c3RyID0gIiIKICAgIGlmIGNoID09ICdGJzoKICAgICAgICBuZXdzdHIgPSAnLUYrRitbK0YtRi1dLVstRitGK0ZdJyAgICMgUnVsZSAxCiAgICBlbGlmIGNoID09ICdYJzoKICAgICAgICBuZXdzdHIgPSAnWCtZRisnICAjIFJ1bGUgMgogICAgZWxpZiBjaCA9PSdZJzoKICAgICAgICBuZXdzdHI9Jy1GWC1ZJwogICAgZWxzZToKICAgICAgICBuZXdzdHIgPSBjaCAgICAjIG5vIHJ1bGVzIGFwcGx5IHNvIGtlZXAgdGhlIGNoYXJhY3RlcgoKICAgIHJldHVybiBuZXdzdHIKCnN0YWNrPVtdICPQodCf0JjQodCe0Jog0JrQntCe0KDQlNCY0J3QkNCiINCn0JXQoNCV0J/Qo9Cl0JgKCmRlZiBkcmF3THN5c3RlbShhVHVydGxlLCBpbnN0cnVjdGlvbnMsIGFuZ2xlLCBkaXN0YW5jZSk6ICAj0KfQotCV0J3QmNCVINCf0KDQkNCS0JjQmyDQp9CV0KDQldCf0JDQpdCe0JkKICAgIGZvciBjbWQgaW4gaW5zdHJ1Y3Rpb25zOgogICAgICAgIGlmIGNtZCA9PSAnRic6CiAgICAgICAgICAgIGFUdXJ0bGUuZm9yd2FyZChkaXN0YW5jZSkKICAgICAgICBlbGlmIGNtZCA9PSAnQic6CiAgICAgICAgICAgIGFUdXJ0bGUuYmFja3dhcmQoZGlzdGFuY2UpCiAgICAgICAgZWxpZiBjbWQgPT0gJysnOgogICAgICAgICAgICBhVHVydGxlLnJpZ2h0KGFuZ2xlKQogICAgICAgIGVsaWYgY21kID09ICctJzoKICAgICAgICAgICAgYVR1cnRsZS5sZWZ0KGFuZ2xlKQogICAgICAgIGVsaWYgY21kID09ICdbJzogICAgICAgICAgICAgICAgICPQndCVINCg0J7QkdCY0KIg0JzQoNCQ0JfQrAogICAgICAgICAgICBzdGFjay5hcHBlbmQodHVydGxlLnhjb3IoKSkKICAgICAgICAgICAgc3RhY2suYXBwZW5kKHR1cnRsZS55Y29yKCkpCiAgICAgICAgICAgIHN0YWNrLmFwcGVuZCh0dXJ0bGUuaGVhZGluZygpKQogICAgICAgIGVsaWYgY21kID09ICddJzoKICAgICAgICAgICAgeD1mbG9hdChzdGFjay5wb3AoLTMpKQogICAgICAgICAgICB5PWZsb2F0KHN0YWNrLnBvcCgtMikpCiAgICAgICAgICAgIGEgPSBmbG9hdChzdGFjay5wb3AoLTEpKQogICAgICAgICAgICB0dXJ0bGUuc2V0eCh4KQogICAgICAgICAgICB0dXJ0bGUuc2V0eSh5KQogICAgICAgICAgICB0dXJ0bGUuc2V0aGVhZGluZyhhKQoKZGVmIG1haW4oKToKICAgIGluc3QgPSBjcmVhdGVMU3lzdGVtKDcsICJGIikgICAjIGNyZWF0ZSB0aGUgc3RyaW5nCiAgICBwcmludChpbnN0KQogICAgdCA9IHR1cnRsZS5UdXJ0bGUoKSAgICAgICAgICAgICMgY3JlYXRlIHRoZSB0dXJ0bGUKICAgIHduID0gdHVydGxlLlNjcmVlbigpCgogICAgdC51cCgpCiAgICB0LmJhY2soMjAwKQogICAgdC5kb3duKCkKICAgIHQuc3BlZWQoMCkKICAgIGRyYXdMc3lzdGVtKHQsIGluc3QsIDIyLCAzKSAgICMgZHJhdyB0aGUgcGljdHVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbmdsZSA2MCwgc2VnbWVudCBsZW5ndGggNQogICAgd24uZXhpdG9uY2xpY2soKQoKbWFpbigpCg==