87 lines
2.1 KiB
Python
87 lines
2.1 KiB
Python
|
|
# Runestone.Academy thinkcspy course
|
||
|
|
# Chapter 8
|
||
|
|
# Lab
|
||
|
|
|
||
|
|
import turtle
|
||
|
|
|
||
|
|
border = 10
|
||
|
|
|
||
|
|
def writeData(tt, itr, height):
|
||
|
|
tt.goto(0-border, 0-border)
|
||
|
|
tt.up()
|
||
|
|
|
||
|
|
if height >= 100:
|
||
|
|
tt.left(90)
|
||
|
|
tt.forward(height+20)
|
||
|
|
tt.right(90)
|
||
|
|
tt.forward(itr*39)
|
||
|
|
tt.write(str(height), move=False, align='center', font=('Times New Roman', 30, 'normal'))
|
||
|
|
tt.forward(70)
|
||
|
|
tt.write(str(itr), move=False, align='center', font=('Times New Roman', 30, 'normal'))
|
||
|
|
else: # this is here so the last bar actually fills
|
||
|
|
tt.left(90)
|
||
|
|
tt.forward(height)
|
||
|
|
tt.right(90)
|
||
|
|
tt.forward(itr*40)
|
||
|
|
tt.right(90)
|
||
|
|
tt.forward(height)
|
||
|
|
tt.left(90)
|
||
|
|
|
||
|
|
def drawBar(t, height):
|
||
|
|
""" Get turtle t to draw one bar, of height. """
|
||
|
|
t.begin_fill() # start filling this shape
|
||
|
|
t.left(90)
|
||
|
|
t.forward(height)
|
||
|
|
t.right(90)
|
||
|
|
t.forward(40)
|
||
|
|
t.right(90)
|
||
|
|
t.forward(height)
|
||
|
|
t.left(90)
|
||
|
|
t.end_fill() # stop filling this shape
|
||
|
|
|
||
|
|
|
||
|
|
def seq3np1(n):
|
||
|
|
""" Print the 3n+1 sequence from n, terminating when it reaches 1."""
|
||
|
|
count = 1
|
||
|
|
|
||
|
|
while n != 1:
|
||
|
|
count += 1
|
||
|
|
|
||
|
|
#print(n)
|
||
|
|
if n % 2 == 0: # n is even
|
||
|
|
n = n // 2
|
||
|
|
else: # n is odd
|
||
|
|
n = n * 3 + 1
|
||
|
|
#print(n) # the last print is 1
|
||
|
|
#print(count)
|
||
|
|
return count
|
||
|
|
|
||
|
|
|
||
|
|
wn = turtle.Screen() # Set up the window and its attributes
|
||
|
|
wn.setworldcoordinates(0-border, 0-border, 40*50+border, 150)
|
||
|
|
wn.bgcolor("lightblue")
|
||
|
|
wn.tracer(100)
|
||
|
|
|
||
|
|
tess = turtle.Turtle() # create tess and set some attributes
|
||
|
|
tess.color("purple")
|
||
|
|
tess.fillcolor("magenta")
|
||
|
|
tess.pensize(3)
|
||
|
|
|
||
|
|
alex = turtle.Turtle()
|
||
|
|
alex.color("purple")
|
||
|
|
|
||
|
|
maxSoFar = 0
|
||
|
|
|
||
|
|
for i in range(50):
|
||
|
|
start = i + 1
|
||
|
|
result = seq3np1(start)
|
||
|
|
|
||
|
|
#print("Number of iterations to get to '1' from", start, ":", result)
|
||
|
|
|
||
|
|
drawBar(tess, result)
|
||
|
|
writeData(alex, start, result)
|
||
|
|
|
||
|
|
if result > maxSoFar:
|
||
|
|
maxSoFar = result
|
||
|
|
|
||
|
|
print("The max number of iterations was", maxSoFar, "from sequence start", start)
|