The functions you'll write are of two sorts, so I've divided the instructions into two parts. In Part One, the functions are fruitful; that is, they return values. Numbers in particular. In Part Two, the functions won't return values. Instead they'll draw to the screen.
So you'll have two projects, one for Part One, a second for Part Two. The unit test is for Part One only.
To begin Part One, follow this link to CodeHS and fork the project. (You can also grade the unit test from GitHub here.)
Note that the unit test will crash if any of the functions it expects to find aren't defined. So I suggest that you start Part One like this:
def sum_squares():
pass
def factorial():
pass
def sumtorial():
pass
Et cetera. You'll need a skeleton function for each function described below. As you replace the placeholder pass with code, your score on the unit test will (hopefully) increase.
Write a function named sum_squares that takes a list of integers and returns the sum of the squares of those integers. For instance, if we send it the list [1, 2, 3], it will return 14 since 1**2 + 2**2 + 3**2 = 1 + 4 + 9 = 14.
Let me reiterate: this function will be sent a list as its input. This means that you won't need the range function. If that list is named L, then presumably your for loop will begin something like:
for num in L:
A final reminder: you'll need to initialize a variable before the loop begins, and inside of the loop you'll need to update the value of that variable.
Test Cases:
>>> sum_squares([1])
1
>>> sum_squares([1, -9])
82
>>> sum_squares([3, 13, 4, 7])
243
>>> sum_squares([])
0
The factorial of the positive integer n - represented as n! - is the product of all positive integers from 1 to n. For instance, 4! = 1 ⋅ 2 ⋅ 3 ⋅ 4 = 24.
Sumtorials are just like factorials, but instead of multiply we add. So the sumtorial of 4 is 1 + 2 + 3 + 4 = 10.
Write two functions, one named factorial and the other sumtorial. Each should take a positive integer; the first should return its factorial, and the second should return its sumtorial.
Let me stipulate that the factorial of 0 is 1 and that the sumtorial of 0 is 0. (If you're curious why mathematicians say that 0! = 1, please Google it.)
Note that you'll absolutely need the range function here.
Test Cases:
>>> factorial(0)
1
>>> sumtorial(0)
0
>>> factorial(6)
720
>>> sumtorial(6)
21
Write me two functions, one named sum_n_odds, the other sum_odds_to_n. The first - sum_n_odds - should sum up the first n odds. The second - sum_odds_to_n - should sum up all odds less than or equal to n.
What's the difference? sum_n_odds(5) is the sum of the first 5 odds. So it's 1 + 3 + 5 + 7 + 9. sum_odds_to_n(5), however, is the sum of the odds that are less than or equal to 5. So it's 1 + 3 + 5.
Test Cases:
>>> sum_n_odds(7)
49
>>> sum_odds_to_n(7)
16
The first two members of the Fibonacci Sequence are 1 and 1. Each member thereafter is the sum of the previous two. Thus the third member is 1 + 1 = 2, the fourth member is 2 + 1 = 3, etc. Let's follow it out a bit:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
Write a function named fib that takes a positive integer n and returns the nth member of the Fibonacci Sequence.
This one is a little tricky. Here's a hint. You'll loop of course, and as you do so you'll update the values of (at least) two variables. They hold the last two values in the Fibonacci sequence. If we call those variables a and b, then initially a is 1 and b is 1. Then a is 1 and b is 2. Then a is 2 and b is 3. Then a is 3 and b is 5. Etc. Now, you might be tempted to do this inside the body of your loop:
a = b
b = a + b
But that won't work. Don't believe me? Try it. You'll need at least one more line inside the body to fix it.
Test Cases:
>>> fib(3)
2
>>> fib(4)
3
>>> fib(10)
55
The Tribonacci Sequence beings 0, 0, 1 and thereafter each new member is the sum of the previous three. So the sequence continues 1, 2, 4, 7, 13, 24, 44, .... Write a function named trib that takes a positive integer n and returns the nth Tribonacci number.
>>> trib(1)
0
>>> trib(2)
0
>>> trib(3)
1
>>> trib(4)
1
>>> trib(5)
2
>>> trib(6)
4
>>> trib(12)
149
>>> trib(24)
223317
For a given positive integer n, the harmonic series is the sum 1/1 + 1/2 + 1/3 + ... + 1/n. For n = 1, the harmonic series is 1/1. For n =2, it is 1/1 + 1/2. For n = 3, it is 1/1 + 1/2 + 1/3. Etc.
Write a function named harmonic_series that takes a positive integer n and returns the value of the harmonic series for that n.
Test Cases:
>>> harmonic_series(1)
1.0
>>> harmonic_series(2)
1.5
>>> harmonic_series(3)
1.8333333333333333
>>> harmonic_series(12)
3.103210678210678
Below I describe the function I wish you to write in a compact and (I hope) easy-to-understand way. In later chapters, I often use this form of description.
Function name: alt_signs
Parameters(s): a positive integer n
Return value(s): the value of the expression 1 - 2 + 3 - 4 + ... - n. Notice how the signs alternate from positive to negative.
For instance, if the value of n is 7, your function should compute the value 1 - 2 + 3 - 4 + 5 - 6 + 7.
Test Cases:
>>> alt_signs(1)
1
>>> alt_signs(2)
-1
>>> alt_signs(3)
2
>>> alt_signs(12)
-6
I can think of many ways to write alt_signs. It can be done with iteration (that is, with a for loop). It can be done without if you're clever. Please do it iteratively. But if you want a challenge, find a non-iterative solution as well.
Here's a juicy hint for the iterative solution. Run the code snippet below and watch what it prints.
for i in range(7):
print((-1) ** i)
Neat, isn't it?
Here's a lovely little formula that generates approximations of pi. The further we go, the better the approximation.
4 * (1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - ... )
Write me a function named pi_approx that takes a positive integer n, goes out n far into the series in parentheses and then returns the result.
If n is 1, it should return the value of 4 * (1). If n is 2, it should return the value of 4 * (1 - 1/3). If n is 3, it should return the value of 4 * (1 - 1/3 + 1/5). Etc.
Test Cases:
>>> pi_approx(1)
4.0
>>> pi_approx(5)
3.3396825396825403
>>> pi_approx(12)
3.058402765927333
>>> pi_approx(100)
3.1315929035585537
Here's an example of a geometric series: 1/2 + 1/4 + 1/8 + 1/16. Its initial term is 1/2. It has four total terms. Each term after the first is 1/2 times the previous term.
Here's another geometric series: 1 + 3 + 9 + 27 + 81. Its first term is 1. It has five total terms. Each term after the first is 3 times the previous term.
All geometric series are like this. They have an initial term i. They consist of a certain number of terms n. Each term after the first some is constant r times the previous term. In the first example, i = 1/2, n = 4 and r = 1/2. In the second example, i = 1, n = 5 and r = 3.
A third example. If i = 12, n = 7 and r = -1, we have the series 12 + -12 + 12 + -12 + 12 + -12 + 12.
Write me a function named geometric_series with the parameters i, n and r described above that returns the value of the associated geometric series.
Test Cases:
>>> geometric_series(1/2, 4, 1/2)
0.9375
>>> geometric_series(1/2, 12, 1/2)
0.999755859375
>>> geometric_series(1/2, 36, 1/2)
0.9999999999854481
>>> geometric_series(1/2, 144, 1/2)
1.0
>>> geometric_series(1, 99, -1)
1
>>> geometric_series(1, 100, -1)
0
>>> geometric_series(1, 101, -1)
1
(The first three suggest a beautiful little conclusion. Assume that in 1/2 + 1/4 + 1/8 + ..., we don't actually ever stop; assume, that is, that we sum an infinite number of terms. The first three suggest that that infinite sum will be exactly 1!)
Let's have another example of iterated iteration. Consider the series below:
1 / 1 + 3 / (1 + 3) + 5 / (1 + 3 + 5) + 7 / (1 + 3 + 5 + 7) + ...
Write me a function named iter_iter that takes as input some value n and returns the sum of the first n members of this series. So for an input of 3 it should return 1 / 1 + 3 / (1 + 3) + 5 / (1 + 3 + 5).
Do you see the iterated iteration in this? We have to iterate to get the numerators - first 1, then 3, then 5, etc; and once we have a numerator, we then had to iterate again to get the denominator - first 1, then 1 + 3, then 1 + 3 + 5, etc.
Test Cases:
1.0
>>> iter_iter(2)
1.75
>>> iter_iter(3)
2.3055555555555554
>>> iter_iter(9)
4.118168776769967
>>> iter_iter(18)
5.3993229955820965
This one's a stretch not because the code is hard but because you'll have to read and comprehend some not-so-easy text. My instructions take the form of a story.
Our good friend SB took a vicious blow to the head. He forgot most of the mathematics he knew. But he can add 1's to whatever number you give him. As many as you want. He also knows the positive integers greater than 1. He knows 2, 3, 4 and so on. But that's it. He knows no more. Ask him to add 2 to 3 and he'll have no idea what you mean. Let's help him regain what he's lost.
"SB", we say. "Let us teach you the hyperoperations. First is addition. To add the positive integer n to a is to add 1 to a n times. So a + 2 = a + 1 + 1, and a + 3 = a + 1 + 1 + 1. Etc."
"SB", we continue hopefully. "The second hyperoperation is multiplication. Multiplication is repeated addition. For instance, 3 ⋅ 4 = 3 + 3 + 3 + 3. In general, a ⋅ n is a added to itself n times."
"SB!", we bark (for his attention has begun to wane). "Listen to what we say! The third hyperoperation is exponentiation. Exponentiation is repeated multiplication. For instance, 3 ^ 4 = 3 ⋅ 3 ⋅ 3 ⋅ 3. In general, a ^ n is a multiplied by itself n times." SB grimaces. We've pushed him to his limit.
"SB," we say gently (for we feel guilty that we spoke harshly a moment ago). "We're almost done. The fourth hyperoperation is tetration. Tetration is repeated exponentiation. The first tetrate of 3 is simply 3. The second tetrate of 3 is 3 ^ 3. The third is 3 ^ (3 ^ 3). The fourth is 3 ^ (3 ^ (3 ^ 3)). Do you understand? We stack the 3's in a tower of powers, and we work from right to left when we evaluate. In general, the nth tetration of a is a power tower of a's that's n high."
"Thus finishes our lesson, SB. We are sorry for you injury and we hope that you regain your once remarkable mathematical abilities."
Write me the four functions described below. Pay close attention to what you may use in them. You'll iterate in all. Obviously.
A function named addition with parameters a and n. Return the sum of a and n. Compute by the repeated addition of 1. Example: 3 + 4 = 3 + 1 + 1 + 1 + 1.
A function named multiplication with parameters a and n. Return the product of a and n. Compute by the repeated addition of a. Example: 3 ⋅ 4 = 3 + 3 + 3 + 3. I do mean for your multiplication function to call your addition function.
A function named exponentiation with parameters a and n. Return a to the power of n. Compute by the repeated multiplication of a. Example: 3 ^ 4 = 3 ⋅ 3 ⋅ 3 ⋅ 3. Your exponentiation function will call your multiplication function (which as we said will in turn call your addition function).
A function named tetration with parameter a and n. Return the nth tetrate of a. Compute by the repeated exponentiation of a. For example, the 3rd tetrate of 3 is 3 ^ (3 ^ 3) = 3 ^ 27 = 7625597484987; it isn't (3 ^ 3) ^ 3 = 27 ^ 3 = 19683. Another example: the 4th tetrate of 3 would be 3 ^ (3 ^ (3 ^ 3)) = 3 ^ 7625597484987, which is unimaginably huge. It isn't ((3 ^ 3) ^ 3) ^ 3, which is much, much smaller. Your tetration function will call your exponentiation function.
You don't need test cases for any but the last:
>>> tetration(2, 2)
4
>>> tetration(2, 3)
16
>>> tetration(2, 4)
65536
>>> tetration(2, 5)
2003529930406846464979072351560255750447825475569751419265016973710894059556311453089506130880933348101038234342907263181822949382118812668869506364761547029165041871916351587966347219442930927982084309104855990570159318959639524863372367203002916969592156108764948889254090805911457037675208500206671563702366126359747144807111774815880914135742720967190151836282560618091458852699826141425030123391108273603843767876449043205960379124490905707560314035076162562476031863793126484703743782954975613770981604614413308692118102485959152380195331030292162800160568670105651646750568038741529463842244845292537361442533614373729088303794601274724958414864915930647252015155693922628180691650796381064132275307267143998158508811292628901134237782705567421080070065283963322155077831214288551675554073345107213112427399562982719769150054883905223804357045848197956393157853510018992000024141963706813559840464039472194016069517690156119726982337890017641517190051133466306898140219383481435426387306539552969691388024158161859561100640362119796101859534802787167200122604642492385111393400464351623867567078745259464670903886547743483217897012764455529409092021959585751622973333576159552394885297579954028471943529913543763705986928913757153740001986394332464890052543106629669165243419174691389632476560289415199775477703138064781342309596190960654591300890188887588084733625956065444888501447335706058817090162108499714529568344061979690565469813631162053579369791403236328496233046421066136200220175787851857409162050489711781820400187282939943446186224328009837323764931814789848119452713007440220765680910376203999203492023906626264491909167985461515778839060397720759279378852241294301017458086862263369284725851403039615558564330385450688652213114813638408384778263790459607186876728509763471271988890680478243230394718650525660978150729861141430305816927924971409161059417185352275887504477592218301158780701975535722241400019548102005661773589781499532325208589753463547007786690406429016763808161740550405117670093673202804549339027992491867306539931640720492238474815280619166900933805732120816350707634351669869625020969023162859350071874190579161241536897514808261904847946571736601005892476655445840838334790544144817684255327207315586349347605137419779525190365032198020108764738368682531025183377533908861426184800374008082238104076468878471647552945326947661700424461063311238021134588694532200116564076327023074292426051582811070387018345324567635625951430032037432740780879056283663406965030844225855967039271869461158513793386475699748568670079823960604393478850861649260304945061743412365828352144806726676841807083754862211408236579802961200027441324438432402331257403545019352428776430880232850855886089962774458164680857875115807014743763867976955049991643998284357290415378143438847303484261903388841494031366139854257635577105335580206622185577060082551288893332226436281984838613239570676191409638533832374343758830859233722284644287996245605476932428998432652677378373173288063210753211238680604674708428051166488709084770291208161104912555598322366244868556651402684641209694982590565519216188104341226838996283071654868525536914850299539675503954938371853405900096187489473992880432496373165753803673586710175783994818471798498246948060532081996066183434012476096639519778021441199752546704080608499344178256285092726523709898651539462193004607364507926212975917698293892367015170992091531567814439791248475706237804600009918293321306880570046591458387208088016887445835557926258465124763087148566313528934166117490617526671492672176128330845273936469244582892571388877839056300482483799839692029222215486145902373478222682521639957440801727144146179559226175083889020074169926238300282286249284182671243405751424188569994272331606998712986882771820617214453142574944015066139463169197629181506579745526236191224848063890033669074365989226349564114665503062965960199720636202603521917776740668777463549375318899587866282125469797102065747232721372918144666659421872003474508942830911535189271114287108376159222380276605327823351661555149369375778466670145717971901227117812780450240026384758788339396817962950690798817121690686929538248529830023476068454114178139110648560236549754227497231007615131870024053910510913817843721791422528587432098524957878034683703337818421444017138688124249984418618129271198533315382567321870421530631197748535214670955334626336610864667332292409879849256691109516143618601548909740241913509623043612196128165950518666022030715613684732364660868905014263913906515063908199378852318365059897299125404479443425166774299659811849233151555272883274028352688442408752811283289980625912673699546247341543333500147231430612750390307397135252069338173843322950701049061867539433130784798015655130384758155685236218010419650255596181934986315913233036096461905990236112681196023441843363334594927631946101716652913823717182394299216272538461776065694542297877071383198817036964588689811863210976900355735884624464835706291453052757101278872027965364479724025405448132748391794128826423835171949197209797145936887537198729130831738033911016128547415377377715951728084111627597186384924222802373441925469991983672192131287035585307966942713416391033882754318613643490100943197409047331014476299861725424423355612237435715825933382804986243892498222780715951762757847109475119033482241412025182688713728193104253478196128440176479531505057110722974314569915223451643121848657575786528197564843508958384722923534559464521215831657751471298708225909292655638836651120681943836904116252668710044560243704200663709001941185557160472044643696932850060046928140507119069261393993902735534545567470314903886022024639948260501762431969305640666366626090207048887438898907498152865444381862917382901051820869936382661868303915273264581286782806601337500096593364625146091723180312930347877421234679118454791311109897794648216922505629399956793483801699157439700537542134485874586856047286751065423341893839099110586465595113646061055156838541217459801807133163612573079611168343863767667307354583494789788316330129240800836356825939157113130978030516441716682518346573675934198084958947940983292500086389778563494693212473426103062713745077286156922596628573857905533240641849018451328284632709269753830867308409142247659474439973348130810986399417379789657010687026734161967196591599588537834822988270125605842365589539690306474965584147981310997157542043256395776070485100881578291408250777738559790129129407309462785944505859412273194812753225152324801503466519048228961406646890305102510916237770448486230229488966711380555607956620732449373374027836767300203011615227008921843515652121379215748206859356920790214502277133099987729459596952817044582181956080965811702798062669891205061560742325686842271306295009864421853470810407128917646906550836129916694778023822502789667843489199409657361704586786242554006942516693979292624714524945408858422726153755260071904336329196375777502176005195800693847635789586878489536872122898557806826518192703632099480155874455575175312736471421295536494084385586615208012115079075068553344489258693283859653013272046970694571546959353658571788894862333292465202735853188533370948455403336565356988172582528918056635488363743793348411845580168331827676834646291995605513470039147876808640322629616641560667508153710646723108461964247537490553744805318226002710216400980584497526023035640038083472053149941172965736785066421400842696497103241919182121213206939769143923368374709228267738708132236680086924703491586840991153098315412063566123187504305467536983230827966457417620806593177265685841681837966106144963432544111706941700222657817358351259821080769101961052229263879745049019254311900620561906577452416191913187533984049343976823310298465893318373015809592522829206820862230332585280119266496314441316442773003237792274712330696417149945532261035475145631290668854345426869788447742981777493710117614651624183616680254815296335308490849943006763654806102940094693750609845588558043970485914449584445079978497045583550685408745163316464118083123079704389849190506587586425810738422420591191941674182490452700288263983057950057341711487031187142834184499153456702915280104485145176055306971441761368582384102787659324662689978418319620312262421177391477208004883578333569204533935953254564897028558589735505751235129536540502842081022785248776603574246366673148680279486052445782673626230852978265057114624846595914210278122788941448163994973881884622768244851622051817076722169863265701654316919742651230041757329904473537672536845792754365412826553581858046840069367718605020070547247548400805530424951854495267247261347318174742180078574693465447136036975884118029408039616746946288540679172138601225419503819704538417268006398820656328792839582708510919958839448297775647152026132871089526163417707151642899487953564854553553148754978134009964854498635824847690590033116961303766127923464323129706628411307427046202032013368350385425360313636763575212604707425311209233402837482949453104727418969287275572027615272268283376741393425652653283068469997597097750005560889932685025049212884068274139881631540456490350775871680074055685724021758685439053228133770707415830756269628316955687424060527726485853050611356384851965918968649596335568216975437621430778665934730450164822432964891270709898076676625671517269062058815549666382573829274182082278960684488222983394816670984039024283514306813767253460126007269262969468672750794346190439996618979611928750519442356402644303271737341591281496056168353988188569484045342311424613559925272330064881627466723523751234311893442118885085079358163848994487544756331689213869675574302737953785262542329024881047181939037220666894702204258836895840939998453560948869946833852579675161882159410981624918741813364726965123980677561947912557957446471427868624053750576104204267149366084980238274680575982591331006919941904651906531171908926077949119217946407355129633864523035673345588033313197080365457184791550432654899559705862888286866606618021882248602144999973122164138170653480175510438406624412822803616648904257377640956326482825258407669045608439490325290526337532316509087681336614242398309530806549661879381949120033919489494065132398816642080088395554942237096734840072642705701165089075196155370186264797456381187856175457113400473810762763014953309735174180655479112660938034311378532532883533352024934365979129341284854970946826329075830193072665337782559314331110963848053940859283988907796210479847919686876539987477095912788727475874439806779824968278272200926449944559380414608770641941810440758269805688038949654616587983904660587645341810289907194293021774519976104495043196841503455514044820928933378657363052830619990077748726922998608279053171691876578860908941817057993404890218441559791092676862796597583952483926734883634745651687016166240642424241228961118010615682342539392180052483454723779219911228595914191877491793823340010078128326506710281781396029120914720100947878752551263372884222353869490067927664511634758101193875319657242121476038284774774571704578610417385747911301908583877890152334343013005282797038580359815182929600305682612091950943737325454171056383887047528950563961029843641360935641632589408137981511693338619797339821670761004607980096016024823096943043806956620123213650140549586250615282588033022908385812478469315720323233601899469437647726721879376826431828382603564520699468630216048874528424363593558622333506235945002890558581611275341783750455936126130852640828051213873177490200249552738734585956405160830583053770732533971552620444705429573538361113677523169972740292941674204423248113875075631319078272188864053374694213842169928862940479635305150560788126366206497231257579019598873041195626227343728900516561111094111745277965482790471250581999077498063821559376885546498822938985408291325129076478386322494781016753491693489288104203015610283386143827378160946341335383578340765314321417150655877547820252454780657301342277470616744241968952613164274104695474621483756288299771804186785084546965619150908695874251184435837306590951460980451247409411373899927822492983367796011015387096129749705566301637307202750734759922943792393824427421186158236161317886392553095117188421298508307238259729144142251579403883011359083331651858234967221259621812507058113759495525022747274674369887131926670769299199084467161228738858457584622726573330753735572823951616964175198675012681745429323738294143824814377139861906716657572945807804820559511881687188075212971832636442155336787751274766940790117057509819575084563565217389544179875074523854455200133572033332379895074393905312918212255259833790909463630202185353848854825062897715616963860712382771725621313460549401770413581731931763370136332252819127547191443450920711848838366818174263342949611870091503049165339464763717766439120798347494627397822171502090670190302469762151278521956142070806461631373236517853976292092025500288962012970141379640038055734949269073535145961208674796547733692958773628635660143767964038430796864138563447801328261284589184898528048048844180821639423974014362903481665458114454366460032490618763039502356402044530748210241366895196644221339200757479128683805175150634662569391937740283512075666260829890491877287833852178522792045771846965855278790447562192663992008409302075673925363735628390829817577902153202106409617373283598494066652141198183810884515459772895164572131897797907491941013148368544639616904607030107596818933741217575988165127000761262789169510406315857637534787420070222051070891257612361658026806815858499852631465878086616800733264676830206391697203064894405628195406190685242003053463156621891327309069687353181641094514288036605995220248248886711554429104721929134248346438705368508648749099178812670565665387191049721820042371492740164460943459845392536706132210616533085662021188968234005752675486101476993688738209584552211571923479686888160853631615862880150395949418529489227074410828207169303387818084936204018255222271010985653444817207470756019245915599431072949578197878590578940052540122867517142511184356437184053563024181225473266093302710397968091064939272722683035410467632591355279683837705019855234621222858410557119921731717969804339317707750755627056047831779844447637560254637033369247114220815519973691371975163241302748712199863404548248524570118553342675264715978310731245663429805221455494156252724028915333354349341217862037007260315279870771872491234494477147909520734761385425485311552773301030342476835865496093722324007154518129732692081058424090557725645803681462234493189708138897143299831347617799679712453782310703739151473878692119187566700319321281896803322696594459286210607438827416919465162267632540665070881071030394178860564893769816734159025925194611823642945652669372203155504700213598846292758012527715422016629954863130324912311029627923723899766416803497141226527931907636326136814145516376656559839788489381733082668779901962886932296597379951931621187215455287394170243669885593888793316744533363119541518404088283815193421234122820030950313341050704760159987985472529190665222479319715440331794836837373220821885773341623856441380700541913530245943913502554531886454796252260251762928374330465102361057583514550739443339610216229675461415781127197001738611494279501411253280621254775810512972088465263158094806633687670147310733540717710876615935856814098212967730759197382973441445256688770855324570888958320993823432102718224114763732791357568615421252849657903335093152776925505845644010552192644505312073756287744998163646332835816140330175813967359427327690448920361880386754955751806890058532927201493923500525845146706982628548257883267398735220457228239290207144822219885587102896991935873074277815159757620764023951243860202032596596250212578349957710085626386118233813318509014686577064010676278617583772772895892746039403930337271873850536912957126715066896688493880885142943609962012966759079225082275313812849851526902931700263136328942095797577959327635531162066753488651317323872438748063513314512644889967589828812925480076425186586490241111127301357197181381602583178506932244007998656635371544088454866393181708395735780799059730839094881804060935959190907473960904410150516321749681412100765719177483767355751000733616922386537429079457803200042337452807566153042929014495780629634138383551783599764708851349004856973697965238695845994595592090709058956891451141412684505462117945026611750166928260250950770778211950432617383223562437601776799362796099368975191394965033358507155418436456852616674243688920371037495328425927131610537834980740739158633817967658425258036737206469351248652238481341663808061505704829059890696451936440018597120425723007316410009916987524260377362177763430621616744884930810929901009517974541564251204822086714586849255132444266777127863728211331536224301091824391243380214046242223349153559516890816288487989988273630445372432174280215755777967021666317047969728172483392841015642274507271779269399929740308072770395013581545142494049026536105825409373114653104943382484379718606937214444600826798002471229489405761853892203425608302697052876621377373594394224114707074072902725461307358541745691419446487624357682397065703184168467540733466346293673983620004041400714054277632480132742202685393698869787607009590048684650626771363070979821006557285101306601010780633743344773073478653881742681230743766066643312775356466578603715192922768440458273283243808212841218776132042460464900801054731426749260826922155637405486241717031027919996942645620955619816454547662045022411449404749349832206807191352767986747813458203859570413466177937228534940031631599544093684089572533438702986717829770373332806801764639502090023941931499115009105276821119510999063166150311585582835582607179410052528583611369961303442790173811787412061288182062023263849861515656451230047792967563618345768105043341769543067538041113928553792529241347339481050532025708728186307291158911335942014761872664291564036371927602306283840650425441742335464549987055318726887926424102147363698625463747159744354943443899730051742525110877357886390946812096673428152585919924857640488055071329814299359911463239919113959926752576359007446572810191805841807342227734721397723218231771716916400108826112549093361186780575722391018186168549108500885272274374212086524852372456248697662245384819298671129452945515497030585919307198497105414181636968976131126744027009648667545934567059936995464500558921628047976365686133316563907395703272034389175415267500915011198856872708848195531676931681272892143031376818016445477367518353497857924276463354162433601125960252109501612264110346083465648235597934274056868849224458745493776752120324703803035491157544831295275891939893680876327685438769557694881422844311998595700727521393176837831770339130423060958999137314684569010422095161967070506420256733873446115655276175992727151877660010238944760539789516945708802728736225121076224091810066700883474737605156285533943565843756271241244457651663064085939507947550920463932245202535463634444791755661725962187199279186575490857852950012840229035061514937310107009446151011613712423761426722541732055959202782129325725947146417224977321316381845326555279604270541871496236585252458648933254145062642337885651464670604298564781968461593663288954299780722542264790400616019751975007460545150060291806638271497016110987951336633771378434416194053121445291855180136575558667615019373029691932076120009255065081583275508499340768797252369987023567931026804136745718956641431852679054717169962990363015545645090044802789055701968328313630718997699153166679208958768572290600915472919636381673596673959975710326015571920237348580521128117458610065152598883843114511894880552129145775699146577530041384717124577965048175856395072895337539755822087777506072339445587895905719156736
>>> tetration(3, 2)
27
>>> tetration(3, 3)
7625597484987
Tetrates get big fast! The 4th tetration of 3 would be 3 ** 7625597484987. Truly massive! That's approximately 4 trillion digits if written out!
(You do realize, don't you, that this sequence of operations can be continued? After tetration come pentation. After pentation comes septation. It never ends. Moreover, the rate of growth of each new operation absolutely dwarfs the rate of the growth of the ones before. Thus pentates grow much faster than tetrates. For instance, pentation(3, 3) (if we defined that function) would be a power tower of 3's that's 7625597484987 high. That's 3**(3**(3**(3 ..., where we have a total of 7625597484987 3's. That's unimaginably huge!)
Let's draw! You'll use euclid, a tool I built on the back of pygame. Follow the link, read the docs, play with the examples.
If you use CodeHS, follow this link and fork the project. You'll write code in the main.py file.
The functions below are fruitless, that is they don't return a value or values. Instead they draw to the screen. This means that they won't be unit tested. The test will be of another sort - "Do the pics look right to Dr. M when he runs the code?"
When you code is complete, it should create a slideshow in which each image described below is shown for a few seconds; that is, when I run you code, I should see the first image, then after a few seconds the next, etc. until I've seen them all.
Function name: square
Parameter(s): side length (s) and the position of lower left corner given by an x-coordinate and a y-coordinate
Output: draw a square of side length s with its lower left corner at (x, y)
The header of your function should be def square(s, x, y).
Function name: row_squares
Parameter(s): number of squares (n), side length of each square (s), position of first square (x, y)
Output: draw a row of n squares each of side length s with the first square positioned at (x, y)
Your row_squares function should repeatedly call your square function. Inside of a for loop of course.
The header of your function should be def row_squares(n, s, x, y).
Function name: grid_squares
Parameter(s): numbers of rows (m) and number of columns (n), side length of each square (s), position of top left square (x, y)
Output: draw a m by n grid of squares with the first square positioned at x, y
Your grid_squares function should repeatedly call your row_squares function. Inside of a for loop of course.
The header of your function should be grid_squares(m, n, s, x, y).
The grid to the right was created with grid_squares(6, 9, 20, 20). This drew a grid of squares with 6 rows and 9 columns where the position of the top left square was (20, 20).
Write a function named regular_poly that takes an integer three or greater and then draws a regular polygon with that number of sides. (By definition a regular polygon has all sides equal and all angles equal.) I'll let you pick the side length and position, but make sure that it all fits on the screen if the number of sides is 12 or less. (This might requires that you use a shorten the side length as the number of sides increases.)
For instance, regular_poly(8) should draw a regular polygon with 8 sides.
Write a function named my_circ that takes three numbers - x, y and r - and draws a circle with center (x, y) and radius r. Don't use euclid's built-in circle method. Figure out how to draw a circle yourself. I've seen it done in at least three ways.
I'll use a radius 100 or less when I test your code.
For instance, my_circ(50, 20, 30) should draw a circle with radius 50 and center (20, 30).
Function name: spiral
Parameter(s): center of spiral (x, y), number of times to rotate about center (revs)
Output: draw a spiral with center x, y that rotates about its center revs times
The spiral to the right was created with spiral(100, 120, 6). That created a spiral with center (100, 120) that did 6 total revolutions. You're spiral doesn't have to look precisely like it, but yours should be equally spirally.
Write a function named liam_square that draws the picture to the right. The function has no parameters; so to call it, just type liam_square(). I'll let you choose dimensions.
Draw me something pretty with euclid. Make it complex. Make it colorful. Make use of iteration. Call it simply creative.