From 1a905029461452816f1ed74c286cadd885a7dff9 Mon Sep 17 00:00:00 2001 From: lolabird Date: Wed, 20 Dec 2023 22:24:30 -0700 Subject: [PATCH] Add currently solved exerises from Chapter 16 --- thinkcspy/Chapter-16-Exercises/gallons.py | 37 +++++++++++++ thinkcspy/Chapter-16-Exercises/hanoi.py | 28 ++++++++++ thinkcspy/Chapter-16-Exercises/hilbert.py | 55 +++++++++++++++++++ .../Chapter-16-Exercises/kochsnowflake.py | 55 +++++++++++++++++++ thinkcspy/Chapter-16-Exercises/mountain.py | 45 +++++++++++++++ thinkcspy/Chapter-16-Exercises/tree.py | 49 +++++++++++++++++ 6 files changed, 269 insertions(+) create mode 100644 thinkcspy/Chapter-16-Exercises/gallons.py create mode 100644 thinkcspy/Chapter-16-Exercises/hanoi.py create mode 100644 thinkcspy/Chapter-16-Exercises/hilbert.py create mode 100644 thinkcspy/Chapter-16-Exercises/kochsnowflake.py create mode 100644 thinkcspy/Chapter-16-Exercises/mountain.py create mode 100644 thinkcspy/Chapter-16-Exercises/tree.py diff --git a/thinkcspy/Chapter-16-Exercises/gallons.py b/thinkcspy/Chapter-16-Exercises/gallons.py new file mode 100644 index 0000000..ec2a494 --- /dev/null +++ b/thinkcspy/Chapter-16-Exercises/gallons.py @@ -0,0 +1,37 @@ +def setState(): + jugA = {"name": "Jug A", "state": 0, "cap": 4} + jugB = {"name": "Jug B", "state": 0, "cap": 3} + target = 2 + + return fillJug(1, jugA, jugB, target) + + +def fillJug(rounds, jugA, jugB, target): + pour = 0 + + if jugA["state"] == target: + print("Target reached") + return + else: + if jugB["state"] == 0: + jugB["state"] += jugB["cap"] #fill jugB + print(rounds, jugA, jugB) + + if jugA["state"] == 0: + pour = jugB["state"] - jugA["state"] + else: + pour = jugA["cap"] - jugA["state"] + + #fill jugA with the contents of jugB + jugA["state"] += pour + jugB["state"] -= pour + print(rounds, jugA, jugB) + + if jugA["state"] == jugA["cap"]: + jugA["state"] = 0 #empty jugA if full + print(rounds, jugA, jugB) + + fillJug(rounds + 1, jugA, jugB, target) + + +setState() \ No newline at end of file diff --git a/thinkcspy/Chapter-16-Exercises/hanoi.py b/thinkcspy/Chapter-16-Exercises/hanoi.py new file mode 100644 index 0000000..d354fa6 --- /dev/null +++ b/thinkcspy/Chapter-16-Exercises/hanoi.py @@ -0,0 +1,28 @@ +def stackTowers(num): + A = [] + B = [] + C = [] + rounds = 0 + + + for i in range(num): + A.insert(0, i+1) + + + def hanoi(num, start, aux, end): + nonlocal rounds + + if num == 1: + end += [start.pop()] + rounds += 1 + print(rounds, A, B, C) + else: + hanoi(num - 1, start, end, aux) + end += [start.pop()] + rounds += 1 + print(rounds, A, B, C) + hanoi(num -1, aux, start, end) + + hanoi(num, A, B, C) + +stackTowers(5) diff --git a/thinkcspy/Chapter-16-Exercises/hilbert.py b/thinkcspy/Chapter-16-Exercises/hilbert.py new file mode 100644 index 0000000..e9525cb --- /dev/null +++ b/thinkcspy/Chapter-16-Exercises/hilbert.py @@ -0,0 +1,55 @@ + +import turtle + +def createLSystem(numIters, axiom): + if numIters == 0: + return axiom + else: + return createLSystem(numIters - 1, processString(axiom)) + + +def processString(oldStr): + newstr = "" + for ch in oldStr: + newstr = newstr + applyRules(ch) + + return newstr + + +def applyRules(ch): + newstr = "" + if ch == 'A': + newstr = '-BF+AFA+FB-' # Rule 1 + elif ch == 'B': + newstr = '+AF-BFB-FA+' + else: + newstr = ch # no rules apply so keep the character + + return newstr + + +def drawLsystem(aTurtle, instructions, angle, distance): + for cmd in instructions: + if cmd == 'F': + aTurtle.forward(distance) + elif cmd == '+': + aTurtle.left(angle) + elif cmd == '-': + aTurtle.right(angle) + + +def main(): + inst = createLSystem(4, "A") + t = turtle.Turtle() + wn = turtle.Screen() + + t.up() + t.back(200) + t.down() + t.speed(9) + drawLsystem(t, inst, 90, 5) + + wn.exitonclick() + + +main() \ No newline at end of file diff --git a/thinkcspy/Chapter-16-Exercises/kochsnowflake.py b/thinkcspy/Chapter-16-Exercises/kochsnowflake.py new file mode 100644 index 0000000..0194425 --- /dev/null +++ b/thinkcspy/Chapter-16-Exercises/kochsnowflake.py @@ -0,0 +1,55 @@ + +import turtle + +def createLSystem(numIters, axiom): + if numIters == 0: + return axiom + else: + return createLSystem(numIters - 1, processString(axiom)) + + +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' # Rule 1 + else: + newstr = ch # no rules apply so keep the character + + return newstr + + +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) + + +def main(): + inst = createLSystem(4, "F--F--F") + t = turtle.Turtle() + wn = turtle.Screen() + + t.up() + t.back(200) + t.down() + t.speed(9) + drawLsystem(t, inst, 60, 5) + + wn.exitonclick() + + +main() \ No newline at end of file diff --git a/thinkcspy/Chapter-16-Exercises/mountain.py b/thinkcspy/Chapter-16-Exercises/mountain.py new file mode 100644 index 0000000..50eb438 --- /dev/null +++ b/thinkcspy/Chapter-16-Exercises/mountain.py @@ -0,0 +1,45 @@ +import turtle +import random + + +def drawTriangle(points,color,myTurtle): + myTurtle.fillcolor(color) + myTurtle.up() + myTurtle.goto(points[0][0],points[0][1]) + myTurtle.down() + myTurtle.begin_fill() + myTurtle.goto(points[1][0],points[1][1]) + myTurtle.goto(points[2][0],points[2][1]) + myTurtle.goto(points[0][0],points[0][1]) + myTurtle.end_fill() + + +def getMid(p1, p2, delta): + return ( (((p1[0]+p2[0]) / 2) + random.uniform(-delta, delta)), + (((p1[1] + p2[1]) / 2) + random.uniform(-delta, delta))) + + +def fractalMnt(points,degree,myTurtle): + colormap = ['floralwhite','brown','darkgoldenrod','olive','maroon'] + + drawTriangle(points,colormap[degree],myTurtle) + + if degree > 0: + mid1 = getMid(points[0], points[1], 10) + mid2 = getMid(points[0], points[2], 10) + mid3 = getMid(points[1], points[2], 10) + + fractalMnt([points[0], mid1, mid2], degree-1, myTurtle) + fractalMnt([points[1], mid1, mid3], degree-1, myTurtle) + fractalMnt([points[2], mid3, mid2], degree-1, myTurtle) + fractalMnt([mid1, mid3, mid2], degree-1, myTurtle) + + +def main(): + myTurtle = turtle.Turtle() + myWin = turtle.Screen() + myPoints = [[-100,-50],[0,100],[100,-50]] + fractalMnt(myPoints,4,myTurtle) + myWin.exitonclick() + +main() diff --git a/thinkcspy/Chapter-16-Exercises/tree.py b/thinkcspy/Chapter-16-Exercises/tree.py new file mode 100644 index 0000000..1877005 --- /dev/null +++ b/thinkcspy/Chapter-16-Exercises/tree.py @@ -0,0 +1,49 @@ +import turtle +import random + +def color(branchlen, t): + t.pensize(branchlen/5) + if branchlen < 15: + t.color("green") + else: + t.color("brown") + + +def getAngle(): + return random.randrange(15, 46) + + +def getLen(t): + return random.randrange(5, 15) + + +def tree(branchLen,t): + if branchLen > 5: + color(branchLen, t) + t.forward(branchLen) + angle = getAngle() + t.right(angle) + tree(branchLen-getLen(t),t) + t.left(angle * 2) + tree(branchLen-getLen(t),t) + t.right(angle) + t.backward(branchLen) + t.color("brown") + + +def main(): + t = turtle.Turtle() + myWin = turtle.Screen() + t.left(90) + t.up() + t.backward(100) + t.down() + t.color("brown") + t.speed(10) + t.pensize(5) + tree(75,t) + myWin.exitonclick() + +main() + +