diff --git a/cp/ex01/examples.py b/cp/ex01/examples.py deleted file mode 100644 index 724bde662cb0e5d1a5962e9c87a04a9a659119c6..0000000000000000000000000000000000000000 --- a/cp/ex01/examples.py +++ /dev/null @@ -1,30 +0,0 @@ -"""A handful of python programming examples.""" -# Example 1 -print("Hello world") - -# Example 2 -print("hello") -print("world") - -a = 2 -b = 3 -c = 1 -x = 3 -y = a*x**2 + b * x + c - -# Example 3 -def second_poly(x): - """Compute a first order polynomial. - - :param x: Input value :math:`x` - :return: :math:`y = 2x + 4` - """ - return 2 * x + 4 - -# example 4 -def say_hello(name): - """Print out "Hello {name}. - - :param name: The name to say hello to - """ - print("Hello " + name) diff --git a/cp/ex02/__init__.py b/cp/ex02/__init__.py deleted file mode 100644 index 228c82bfb2677fe8da2cacfe3ca4f3d41f692ebe..0000000000000000000000000000000000000000 --- a/cp/ex02/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""This package represents exercise 1.""" diff --git a/cp/ex02/fibonacci.py b/cp/ex02/fibonacci.py deleted file mode 100644 index 5eae0a753c3aea6854c84552f9cb27b331b60e34..0000000000000000000000000000000000000000 --- a/cp/ex02/fibonacci.py +++ /dev/null @@ -1,26 +0,0 @@ -"""Exercise 2.3: The Fibonacci sequence and recursion.""" - -def fibonacci_number(k): - """Compute the :math:`k`'th Fibonacci number :math:`x_k`. - - The function use the recursive relationship :math:`x_{k+1} = x_k + x_{k-1}`, along with the initial conditions - :math:`x_0 =0, x_1 = 1`, to complete the sequence up to :math:`k`. - - :param k: An integer - :return: The corresponding term :math:`x_k` of the Fibonacci sequence as an integer. - """ - if k == 0: - # TODO: 1 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - elif k == 1: - # TODO: 1 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - else: - # TODO: 1 lines missing. - raise NotImplementedError("Fix this stuff") - -if __name__ == "__main__": - print("The term x_0 should be 0, you got:", fibonacci_number(0)) - print("The term x_1 should be 1, you got:", fibonacci_number(1)) - print("The term x_2 should be 1, you got:", fibonacci_number(1)) - print("The term x_6 should be 8, you got:", fibonacci_number(6)) diff --git a/cp/ex02/taylor.py b/cp/ex02/taylor.py deleted file mode 100644 index 51d6473cbd23b79626b2da00a9ce0a824b01c297..0000000000000000000000000000000000000000 --- a/cp/ex02/taylor.py +++ /dev/null @@ -1,12 +0,0 @@ -"""Problem 1.1.""" -def evaluate_taylor(x: float) -> float: - r"""Compute the third order taylor approximation. - - Compute (and return) the Taylor approximation of :math:`\log(x)`. Remember the function must return a ``float``. - - :param x: The input to evaluate. - :return: The taylor approximation of :math:`\log(x)`, i.e. :math:`y` - """ - # TODO: 1 lines missing. - raise NotImplementedError("Define y = (x-1) - 1/2 * ... here.") - return y diff --git a/cp/ex02/taylor_variant1.py b/cp/ex02/taylor_variant1.py deleted file mode 100644 index 7304776f8aa94de32b753482c92067e0f95e874d..0000000000000000000000000000000000000000 --- a/cp/ex02/taylor_variant1.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Problem 1.2. Implement a function that computes (and return) the third order Taylor-approximation here.""" -# TODO: Code has been removed from here. -raise NotImplementedError("Insert your solution and remove this error.") diff --git a/cp/ex02/taylor_variant2.py b/cp/ex02/taylor_variant2.py deleted file mode 100644 index 3c1b2f1ee332d3d812d0109f8f244063c3ed1baa..0000000000000000000000000000000000000000 --- a/cp/ex02/taylor_variant2.py +++ /dev/null @@ -1,7 +0,0 @@ -"""Problem 1.3. Compute the third order taylor approximation evaluated in x here and store it in a variable y.""" - -x = 1.5 -# Define y = ... here. -# TODO: 1 lines missing. -raise NotImplementedError("Insert your solution and remove this error.") -# print(y) should work. diff --git a/cp/ex03/__init__.py b/cp/ex03/__init__.py deleted file mode 100644 index 2eb2a28773da65c74f1d40b5ea20c4dbdc83b382..0000000000000000000000000000000000000000 --- a/cp/ex03/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Exercises for week 3.""" diff --git a/cp/ex03/ackermann.py b/cp/ex03/ackermann.py deleted file mode 100644 index 57b69ea1a7e47922252148b73d55de1560badf0d..0000000000000000000000000000000000000000 --- a/cp/ex03/ackermann.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Exercise 3.9: Ackermann's function.""" - -def ackermann(m:int, n:int): - """Compute the Ackermann's function :math:`A(m, n)`. - - Your implementation should use recursion and not loops. - - :param m: the variable m. - :param n: the variable n. - :return: the computed value :math:`A(m,n)`. - """ - # TODO: 5 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") diff --git a/cp/ex03/bac_calculator.py b/cp/ex03/bac_calculator.py deleted file mode 100644 index 3d61024730f49ad1912bebd1e3d64d4544147802..0000000000000000000000000000000000000000 --- a/cp/ex03/bac_calculator.py +++ /dev/null @@ -1,15 +0,0 @@ -"""Exercise 3.5: BAC Calculator.""" - - -def bac_calculator(alcohol_consumed: float, weight: float, gender: str, time: float) -> float: - """Calculate the blood alcohol concentration based on the alcohol consumed, body weight, and time since consumption. - - :param alcohol_consumed: The total amount of alcohol consumed in grams (float) - :param weight: The person's body weight in kilograms (float) - :param gender: The person's gender, which must be a string of either "male" or "female" (str) - :param time: The time elapsed since alcohol consumption in hours (float) - :return: The calculated blood alcohol concentration (BAC) as a float value. - """ - # TODO: 10 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return bac diff --git a/cp/ex03/bisect.py b/cp/ex03/bisect.py deleted file mode 100644 index 805cb45eb6d9fc5caec87c63db24d313bbd19fe1..0000000000000000000000000000000000000000 --- a/cp/ex03/bisect.py +++ /dev/null @@ -1,56 +0,0 @@ -"""Problems for the Bisection project in week 3.""" -import math - -def f(x : float) -> float: - r"""Find the roots of this function. - - You should implement the function :math:`f(x)` here. It is defined as: - - .. math:: - - f(x) = \sin(3\cos(\frac{1}{2} x^2)) - - - :param x: The value to evaluate the function in :math:`x` - :return: :math:`f(x)`. - """ - # TODO: 1 lines missing. - raise NotImplementedError("Compute f(x) here.") - return y - - -def is_there_a_root(a : float, b : float) -> bool: - """Return ``True`` if we are guaranteed there is a root of ``f`` in the interval :math:`[a, b]`. - - :param a: Lowest x-value to consider - :param b: Highest x-value to consider - :return: ``True`` if we are guaranteed there is a root otherwise ``False``. - """ - # TODO: 1 lines missing. - raise NotImplementedError("Compute the condition here") - return has_root - -def bisect(xmin : float, xmax : float, delta : float) -> float: - """Find a candidate root within ``xmin`` and ``xmax`` within the given tolerance. - - :param xmin: The minimum x-value to consider - :param xmax: The maximum x-value to consider - :param delta: The tolerance. - :return: The first value :math:`x` which is within ``delta`` distance of a root according to the bisection algorithm - """ - # TODO: 6 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - - - -if __name__ == "__main__": - print("Are we guaranteed there is a zero within the interval [1, 3]?", is_there_a_root(1, 3), "(this should be True)") - print("Are we guaranteed there is a zero within the interval [1, 3.5]?", is_there_a_root(1, 3.5), "(this should be False)") - - print("Find a zero within tolerance 0.1 in the interval [1, 2]") - print(bisect(1, 2, 0.1)) - print("Same, but with a tolerance of 0.5") - print(bisect(1, 2, 0.1)) - - print("Should return math.nan") - print(bisect(1, 3.5, 0.1)) diff --git a/cp/ex03/body_temperature.py b/cp/ex03/body_temperature.py deleted file mode 100644 index 3dad07dde6f4f6b4f9289135dee24dc3bd757e08..0000000000000000000000000000000000000000 --- a/cp/ex03/body_temperature.py +++ /dev/null @@ -1,11 +0,0 @@ -"""Exercise 3.4: Body Temperature.""" - -def body_temperature(temperature : float) -> str: - """Calculate the body's response based on the given temperature. - - :param temperature: The temperature in degrees Celsius. - :return: The body's response as a string. - """ - # TODO: 10 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return response diff --git a/cp/ex03/compare_numbers.py b/cp/ex03/compare_numbers.py deleted file mode 100644 index 1e71154b3db1fc077c4006d8f72e8a0ba62a2e1e..0000000000000000000000000000000000000000 --- a/cp/ex03/compare_numbers.py +++ /dev/null @@ -1,12 +0,0 @@ -"""Exercise 3.3: Compare numbers.""" - -def compare_numbers(first_number:int, second_number:int) -> str: - """Return a string based on which number has the greatest numerical value. - - :param first_number: first number. - :param second_number: second number. - :return: string stating which number is the greatest. - """ - # TODO: 6 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return comparison diff --git a/cp/ex03/exponential.py b/cp/ex03/exponential.py deleted file mode 100644 index 886c658dfaec42171347c63a865aac4a3a60d9f6..0000000000000000000000000000000000000000 --- a/cp/ex03/exponential.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Exercise 3.8: Exponential function.""" - -def exponential(x : float, n : int) -> float: - """Compute the exponential :math:`x^n` using recursion. - - First focus on the case where :math:`n=0`, then :math:`n > 0` and finally :math:`n < 0`. - - :param x: the base number :math:`x`. - :param n: the power :math:`n`. - :return: the computed value. - """ - # TODO: 6 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") diff --git a/cp/ex03/heart_attack.py b/cp/ex03/heart_attack.py deleted file mode 100644 index 00382c01e5263895a669a6bb5b709e74b6b94c3f..0000000000000000000000000000000000000000 --- a/cp/ex03/heart_attack.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Exercise 3.7: Heart attack.""" - -def heart_attack(age:int, weight:int, smoker:bool) -> str: - """Return a string indicating the risk of a person for having heart attack. - - :param age: The age of the person. - :param weight: The weight of the person in kilograms. - :param smoker: Does the person smoke cigarettes? - :return: A string, either "low" or "high", indicating the risk for having heart attack. - """ - # TODO: 12 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return risk diff --git a/cp/ex03/simple_function.py b/cp/ex03/simple_function.py deleted file mode 100644 index 349e7108f4d7735481016de22a4362397a4cabfb..0000000000000000000000000000000000000000 --- a/cp/ex03/simple_function.py +++ /dev/null @@ -1,6 +0,0 @@ -"""This example is used in the lecture notes to illustrate the import statement. Ignore it for the exercises.""" - -def just_a_function(): - """Print two lines to the terminal.""" - print("Hello!") - print("I am justin-a-function :-).") diff --git a/cp/ex03/solar_panel.py b/cp/ex03/solar_panel.py deleted file mode 100644 index 0f846251a0004b21a01a04162420d7a44d5bfd20..0000000000000000000000000000000000000000 --- a/cp/ex03/solar_panel.py +++ /dev/null @@ -1,12 +0,0 @@ -"""Exercise 3.6: Solar panel.""" - -def solar_panel(move : bool, swap : bool, hot : bool, empty : bool): - """Print out whether it is a good idea to install solar panels on an object with the given properties. - - :param move: does the object move around? - :param swap: does the object allow swapping or recharging battery? - :param hot: is the object hot to the touch when it is running? - :param empty: are there other empty places near the object? - """ - # TODO: 19 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") diff --git a/cp/ex04/__init__.py b/cp/ex04/__init__.py deleted file mode 100644 index c9846873004f8fbb59332235ee8873904f7d212a..0000000000000000000000000000000000000000 --- a/cp/ex04/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Exercises for week 4.""" diff --git a/cp/ex04/bug.py b/cp/ex04/bug.py deleted file mode 100644 index 803047bcfcb3c5f21dd38ea52dd94830409a6745..0000000000000000000000000000000000000000 --- a/cp/ex04/bug.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Exercise 4.2-4.3: Let the world know you have written your last bug.""" - -def last_bug(): - """Write a nice message enclosed by lines and pipes that clearly indicate you have written your last bug. - - The function should print out the following three lines in the console: - - .. code-block:: console - - ------------------------------ - | I have written my last bug | - ------------------------------ - """ - # TODO: 5 lines missing. - raise NotImplementedError("Use print(...) to print the output here.") - - -def nice_sign(msg : str): - """Print the input string as a nice sign by enclosing it with pipes. - - Note that the input message can vary in length. - - .. code-block:: console - - --------------- - | {input msg} | - --------------- - - :param msg: The message to enclose. - """ - # You can use len(msg) to get the number of characters and "-"*10 to repeat a character (try in the console!) - # TODO: 4 lines missing. - raise NotImplementedError("Use print(...) to print the output here.") - - -if __name__ == "__main__": - last_bug() # Done with the bugs - nice_sign("Hello world") diff --git a/cp/ex04/files/5000-words.txt b/cp/ex04/files/5000-words.txt deleted file mode 100644 index d44bab9bbb4dcc26e61a0ac68f8904936cf5bc9a..0000000000000000000000000000000000000000 --- a/cp/ex04/files/5000-words.txt +++ /dev/null @@ -1,5000 +0,0 @@ -species -practice -natural -measure -present -form -order -quality -condition -state -action -element -part -division -subject -ground -power -station -register -person -place -ordinary -strong -under -make -light -exercise -exchange -parallel -charge -support -judgment -substance -figure -strength -sound -service -quantity -standard -right -point -character -strike -discharge -force -return -spring -square -between -without -water -spirit -distance -contract -positive -position -straight -moderate -double -superior -certain -compound -interest -language -passage -business -through -manner -relation -general -process -strain -delicate -bearing -property -advance -account -original -religion -round -over -principal -sharp -surface -line -degree -report -course -matter -sentence -body -express -close -quarter -head -negative -take -plant -argument -increase -house -movement -table -balance -separate -small -back -entrance -settle -reason -machine -common -material -scale -authority -capable -anything -regular -stock -break -opposite -into -distress -work -standing -cross -color -number -stroke -convert -radical -relative -function -stand -press -question -peculiar -progress -together -touch -capacity -physical -horse -specific -external -produce -incapable -passion -represent -promise -tender -issue -family -range -domestic -shoulder -change -approach -transfer -carriage -feeling -security -something -direction -pressure -frame -like -free -company -inferior -distinct -variety -solution -capital -grain -deposit -circular -receive -pleasure -particular -office -faculty -motion -personal -country -narrow -occasion -open -addition -second -complete -short -ancient -contrary -serve -disorder -crown -mark -weight -large -white -tongue -mountain -address -vessel -throw -science -system -turn -object -temper -internal -base -pass -familiar -principle -another -that -hold -compass -pitch -influence -enter -command -reduce -level -surprise -time -bottom -face -flower -extreme -raise -purpose -nature -answer -down -against -stick -clear -record -article -discourse -string -shell -side -fall -backward -determine -several -forward -period -absolute -taste -draw -waste -running -spread -chamber -cause -official -province -flat -instrument -native -conduct -maintain -descent -block -presence -simple -lead -weather -direct -which -opinion -justice -guard -master -appearance -season -regard -check -shoot -society -liquid -rule -pattern -sphere -directly -cast -life -definite -private -give -knowledge -cover -weak -draught -section -sovereign -stop -organic -screw -violence -decision -render -beat -rise -current -affection -evidence -great -court -silver -hand -correct -roll -honor -wind -plate -channel -single -keep -heat -cylinder -divide -release -after -respect -military -stomach -some -root -timber -structure -school -exterior -syllable -piece -feather -pledge -supply -christian -branch -religious -necessary -father -execution -affected -knot -carry -other -circle -kind -worship -style -example -effect -obscure -well -violent -horn -english -drive -outside -better -church -mixture -with -equal -reproach -bear -volatile -equivalent -slender -remove -being -preserve -grace -earth -elevation -design -stream -furnish -dress -little -writing -spiritual -black -twist -picture -from -smooth -estate -fine -anchor -joint -heart -expression -reach -center -contest -trust -special -shall -friend -high -call -train -traverse -irregular -wrong -sign -watch -catch -animal -stone -dependent -before -relief -thought -fortune -will -active -formation -valuable -soft -about -operation -bank -heavy -solid -ring -proportion -symbol -opposition -apparent -abstract -portion -dignity -revolution -post -voluntary -length -market -harmony -prepare -perform -land -board -shaft -neglect -iron -value -attempt -hard -judge -proper -mouth -moral -district -interior -genus -union -purple -husband -wing -broken -foreign -divine -perfect -last -compact -escape -extract -demand -flexible -still -wheel -long -burden -labor -note -interval -column -destitute -reference -letter -control -freedom -swallow -medicine -history -difference -people -strip -contempt -handle -decline -good -liberty -brilliant -fashion -engage -rest -impression -offensive -drawing -purchase -minute -metal -texture -doctrine -cutting -lower -paper -sight -hollow -follow -judicial -formal -salt -blow -member -fellow -mean -mother -thread -corrupt -failure -associate -relieve -display -full -distant -disease -sense -liberal -intended -gather -play -blood -swell -stuff -bill -opening -quarrel -world -secure -stage -government -plane -public -composition -allowance -thing -establish -essential -gentle -consider -examine -attack -benefit -height -exhibit -movable -voice -tropical -platform -alternate -have -catholic -bound -advantage -bright -thrust -marble -mercury -alcohol -making -throat -foot -shelter -elastic -slight -painting -inclose -stem -reduction -vegetable -breast -drum -guide -generation -study -within -succession -dressing -powerful -staff -notice -downward -upright -favor -thick -trade -extend -custom -faith -mechanical -turning -front -agreement -glass -extension -normal -green -exposure -medium -product -application -term -vertical -shape -choice -more -somewhat -chance -result -residence -party -wear -confidence -soldier -continue -powder -found -learning -situation -bitter -struggle -finger -shield -officer -rough -field -space -privilege -delicacy -manifest -sacred -race -organ -behind -breath -belonging -phrase -border -marine -breathing -flesh -stretch -musical -imperfect -keeping -trouble -fresh -different -image -plaster -numerous -existence -surround -commerce -passing -rank -around -mill -popular -counter -fruit -praise -hence -beneath -loose -hammer -amount -pack -secondary -sweet -meeting -tone -inclined -refuse -game -floating -mineral -devotion -memory -individual -withdraw -size -severe -declare -warrant -desire -fish -provide -title -smoke -suffer -social -bond -virtue -doubtful -speech -sympathy -ready -feed -metallic -fast -step -leave -poison -worthy -entire -easily -steel -colored -disguise -variable -speaking -rising -indicate -band -primary -agitation -worm -quick -flight -discipline -careless -secret -lock -profession -affect -minister -excess -flourish -pole -tooth -situated -mind -disgrace -censure -estimate -treat -dead -chemical -grave -deliver -tail -drop -attention -surrender -hydrogen -american -sheet -building -preparation -attend -plain -fabric -limit -appear -fasten -bind -swelling -show -striking -witness -ornament -possession -bishop -name -collect -hinder -beyond -beginning -case -covenant -marriage -foul -yield -type -handsome -uniform -whatever -earnest -proof -himself -segment -former -critical -difficulty -proceed -walk -restrain -prince -setting -trick -leader -female -universal -floor -fire -false -depression -seal -class -similar -stamp -sleep -destroy -following -resemble -formerly -match -management -growth -suit -patient -aggregate -various -south -projection -habit -tissue -dispute -move -sacrifice -become -agreeable -credit -partial -chain -broad -northern -heavenly -pipe -arrangement -impulse -sport -apply -live -tension -write -above -wood -furnace -circuit -token -decree -trial -shade -child -engaged -imitation -meet -truth -fair -offer -supreme -constant -sensible -properly -share -device -pair -sugar -solemn -restore -commission -happiness -word -exact -criminal -model -belief -delivery -spot -suitable -commonly -ceremony -convey -search -behavior -printing -measured -frequent -ball -profit -especially -whole -admit -muscular -thin -singular -related -vapor -crowd -quiet -method -living -first -fault -skin -reverse -college -royal -chief -want -battle -appetite -disposition -recover -beam -drink -reverence -converse -essence -same -deprive -deep -nervous -wide -hawk -compose -skeleton -error -nucleus -proposition -bend -ship -drinking -difficult -whip -important -swimming -hanging -empty -wash -obligation -cotton -nerve -generally -prayer -century -view -servant -coloring -exertion -incline -unite -observation -middle -community -territory -bone -story -colorless -shallow -solitary -doubt -acid -slip -speak -deceive -apparatus -flow -even -dominion -introduce -severity -region -intimate -becoming -meaning -philosophy -extremity -gravity -forth -diameter -near -scratch -assembly -east -shoe -prevent -success -spindle -what -activity -bolt -extensive -brief -project -book -cunning -drift -accident -indirect -protection -evil -group -burning -yellow -fancy -particle -confusion -document -energy -exhaust -series -reception -utter -yielding -remote -stiff -wild -discover -policy -angle -below -tree -literary -rate -pursuit -clothing -engine -trunk -claim -previous -grant -tribe -extinct -obtain -furniture -sequence -imperial -petition -rope -pleasing -remedy -oblique -warm -composed -fill -blue -economy -sprinkle -smell -promote -money -resolve -covering -needle -blind -acute -foolish -fossil -european -worth -combine -companion -volume -rather -gain -exciting -look -soil -outward -bring -skill -west -duty -sulphur -expose -noble -posture -lose -follower -distinction -brush -copper -diminish -sort -attachment -sensation -inside -aspect -stain -affinity -slide -southern -edge -perception -conclusion -unequal -priest -boiling -steam -lord -consent -float -tincture -collection -beak -rock -mine -wearing -decay -moisture -stern -confine -average -burn -scheme -pale -while -declaration -contain -plunder -actual -accent -mass -equality -bladder -young -curve -intense -star -loss -reading -spiral -political -assault -prospect -tendency -remain -made -contraction -brain -evolution -experience -further -complex -sponge -worthless -develop -extent -except -payment -election -sometimes -vision -screen -seize -pain -sufficient -dwelling -manage -sensitive -hundred -music -modern -horizon -town -birth -lime -appeal -kingdom -constitution -inclosure -suspension -suffering -rich -room -collar -elevated -prominent -coarse -bent -descend -holding -love -treatise -instruct -perceive -pointed -sudden -adjacent -formed -agree -split -license -reflection -shut -dissolve -battery -variation -start -price -load -necessity -coming -vehicle -axis -sweep -wall -sustain -vote -driving -flavor -breed -prepared -anterior -saddle -pride -divinity -aromatic -lively -foundation -dark -continued -derivative -minor -nation -conveyance -utterance -legal -mistress -corner -rent -occupation -reputation -sail -taking -grass -crescent -mistake -dull -mode -visible -precious -undergo -toward -engraving -moving -list -home -currency -port -wicked -vein -only -membrane -towards -dispose -wound -rapid -hook -seat -bargain -copy -sink -partially -otherwise -overcome -stalk -feel -corn -trumpet -true -courage -grand -carrying -connection -coast -successive -stay -painful -lost -advocate -king -motive -velocity -expansion -margin -dance -track -where -independent -north -bore -honorable -theory -wanting -seed -arch -composite -leaf -comparison -soul -poor -calendar -death -satisfy -artificial -statement -such -indian -reward -travel -likeness -reserve -restraint -intellect -courtesy -cold -delay -describe -idea -fight -reasoning -central -partition -milk -literature -organism -fold -equation -male -shadow -easy -fear -forest -verse -just -absence -tertiary -according -feast -freight -department -outline -artifice -captain -resistance -chase -diamond -forming -student -slow -given -trespass -merchant -primitive -defend -sexual -amorphous -appropriate -temple -invest -dishonor -civil -development -lateral -print -outer -adjective -cord -blade -darkness -retreat -challenge -shot -silence -alkaloid -fail -night -roman -strongly -thousand -profound -danger -ultimate -harbor -nothing -execute -sour -desert -attach -concern -employment -bridge -pile -duration -regulate -innocent -future -permanent -leather -main -governor -comfort -flag -real -calling -encounter -bell -grow -half -posterior -signature -erect -humor -morality -mutual -proceeding -able -cheat -friendly -insect -either -treatment -attendant -vocal -shining -sucker -leading -deeply -find -flowing -settlement -council -infinite -divided -skillful -exceed -pleasant -speed -altitude -winding -content -commit -bankrupt -careful -continuous -consequence -excite -exhibition -noise -concrete -breeding -incident -much -annual -skilled -hair -prove -remark -admission -enlarge -provided -breathe -hearing -raising -attribute -firm -arrange -meal -sand -dish -strange -fourth -atlantic -congress -barrel -western -mental -aperture -lodge -pull -sterling -come -inserted -contact -sing -prefix -prejudice -provision -talk -counsel -void -nose -chest -vulgar -strap -wanton -latin -card -analysis -institution -ridicule -covered -brace -third -pronounce -limited -enough -overthrow -crack -coin -adherent -observe -coat -flame -dorsal -capsule -impress -guilty -delight -best -stranger -nobility -possess -duck -conception -electricity -uncertain -affecting -rational -clothes -also -wonder -summer -involve -request -reaction -envelop -breach -excellent -obstruct -atmosphere -mantle -remember -again -receiver -consonant -blank -devoted -blast -nice -improper -excuse -intention -embrace -agent -limb -excellence -injury -faithful -protect -chiefly -production -pastoral -isomeric -trifling -sentiment -appendix -temporary -test -drill -burst -temporal -when -beating -rolling -orderly -sitting -tract -send -neck -author -strict -less -benefice -woman -away -enterprise -help -overflow -testimony -join -excitement -stable -cannon -dash -idle -luminous -originally -doctor -resolution -appoint -crystal -beauty -assurance -shake -eastern -torture -damage -shock -morbid -rounded -aside -vigorous -ascertain -window -read -designate -effort -repair -compare -binding -boat -fever -impregnate -machinery -moment -keeper -pungent -whistle -penetrate -finish -having -elegant -irritate -fillet -cluster -pregnant -winter -woolen -gross -german -ferment -signal -rude -offering -dust -angular -tune -stupid -institute -vital -writer -source -because -obedience -ruin -eccentric -occupy -crystalline -across -communion -appendage -ventral -oppose -memorial -cradle -lightly -cloth -include -symmetry -triumph -esteem -riding -assume -subdue -sorrow -propriety -impure -very -sounding -secular -adjust -plan -scatter -scent -tube -fanciful -possible -suspend -marked -stigma -creature -disperse -twisted -depth -african -liable -profane -tool -fence -fore -instance -cure -river -desolate -contrast -measuring -disclose -heaven -kindness -performance -shed -march -rare -fragrant -parish -cloud -rendering -servile -malignant -transport -romance -origin -self -lady -twelve -vagabond -lace -pick -romantic -ocean -depress -penalty -eruption -survey -sonorous -perennial -shore -journey -casting -succeed -improve -analogous -poisonous -steep -shooting -tenant -hostile -speaker -venture -endeavor -tear -peace -hang -advanced -stake -suppress -steady -gate -page -liquor -varnish -bivalve -intellectual -vice -sublime -wooden -intensity -alphabet -elevate -tenacious -conversion -jack -event -employ -thunder -radiant -muscle -moon -spoken -gradual -apple -inactive -defeat -rustic -understand -degrade -deck -ancestor -putting -agency -constituent -conflict -favorable -generous -antecedent -storm -indefinite -disposed -bite -customary -distemper -wire -subordinate -restless -apart -ease -polish -debate -indulge -deviation -arrest -hole -serpent -determination -bark -brown -whisper -beforehand -slippery -auxiliary -prime -orange -early -flood -layer -vicious -bonnet -digest -accord -latter -scrape -swing -cherry -monkey -leap -renounce -awkward -raised -giving -continent -reserved -hazard -warp -beautiful -score -invention -girdle -exclusive -yard -prostrate -horizontal -parting -abuse -citizen -receptacle -electric -lantern -bastard -pound -terminal -belong -inhabitant -hide -upper -mechanic -pigment -reality -traffic -treasury -poetry -deed -premise -believe -ridge -flash -shackle -endure -meridian -inflated -prize -usage -think -fishing -scene -termination -injure -recognize -fact -solidity -loud -anatomy -reciprocal -charity -journal -eating -review -gallery -understanding -hardness -chapter -humble -pointing -confirm -pure -lean -fracture -year -distinguish -entertain -garden -their -plunge -adhesion -purity -industry -exception -discovery -combined -push -entirely -paint -inquiry -trace -sole -mystery -importance -torment -forcible -care -past -genius -bottle -twenty -suffix -immovable -fibrous -clean -silent -association -sanction -pierce -wander -gathering -tread -naked -gift -glance -relish -acting -trim -departure -emotion -reckoning -grade -wave -concave -immediate -royalty -ability -induction -three -validity -apartment -crime -along -fleet -triangle -bird -crossing -mischief -sword -implement -polished -ignorant -protest -grief -coal -disposal -intrigue -punishment -anger -mount -soluble -stripe -squeeze -transmit -violation -plot -multiply -probable -patience -decrease -chestnut -begin -showing -rupture -depart -paragraph -concerning -national -visionary -farm -eager -reflect -expand -curious -qualify -molecule -preceding -upward -slope -harsh -gravel -wholly -valence -windlass -human -itself -bold -massive -construction -alloy -crust -cake -terminate -left -parasite -medical -harness -weapon -tell -fountain -consideration -favorite -wrongly -vehement -going -groove -electrical -mature -counterfeit -inversion -faint -drag -testament -ruffle -undertake -repose -health -fleshy -communicate -many -assistant -food -virgin -versed -destruction -prick -temperature -allow -verbal -transparent -collective -revolve -combination -fantastic -during -weakness -lack -wrinkle -version -alliance -antiquity -serious -tenth -store -roof -information -than -retire -gold -siphon -separation -wedge -crest -vibrate -conical -procure -numbers -filling -pocket -spur -angles -greek -substitute -runner -feeding -correction -splendid -venomous -founder -dolphin -oxygen -tackle -dislike -distribute -entangle -charm -magnetic -inheritance -brick -publicly -slightly -disturb -corruption -gallant -deliberate -canvas -gray -hedge -indulgence -healthy -drain -insolent -bodily -wise -conceit -telescope -daughter -yellowish -pursue -identical -spider -falsehood -globe -resemblance -description -readily -savage -arbitrary -academy -snow -politics -looking -agitate -thorough -connect -secretion -afford -articulate -cell -deficient -strengthen -recess -bridle -splendor -impose -emblem -sting -remarkable -truss -explain -hope -resist -slander -partisan -trap -aquatic -fresh-water -hood -disdain -removed -adventure -summary -count -whether -literal -pasture -chloride -throne -garment -guardian -rose -discount -lasting -cease -sharpen -quicken -receipt -morally -habitual -ecstasy -defense -alone -heap -edible -beast -palm -dimension -gospel -fluid -island -deal -operate -cattle -suppose -concord -cream -queen -ethereal -there -roller -patent -rubber -rail -patron -should -brass -appointment -vigor -passive -vascular -beetle -fabulous -prodigal -abandon -apprehension -fertile -french -imagination -discuss -welcome -distrust -contend -lift -dishonest -finding -imposing -erroneous -utmost -useful -pertaining -diffuse -carbon -overlook -blossom -obtained -cushion -notion -dispatch -cabbage -fortress -equivocal -basket -holy -steward -youth -washing -sluggish -messenger -maturity -infamous -shorten -else -dexterous -apparel -mourning -crooked -propose -rigorous -rush -stubborn -dependence -disturbance -trench -till -radiate -sailing -eight -infusion -solemnity -fret -highly -charter -gloomy -scraping -next -knife -nitrogen -tide -magnitude -linen -persuade -final -residue -bending -spar -imaginary -flying -accept -bread -attitude -knight -bloom -assign -generate -driver -file -foliage -festival -parade -experiment -eminence -conquer -translate -pretty -sect -allied -melancholy -breadth -flatter -venereal -repeat -abdomen -silly -monument -song -deduction -submit -inflame -concert -flush -disgust -fragment -acceptance -inspire -neutral -piercing -knowing -household -stump -cement -enforce -medicinal -adverse -oriental -embarrass -club -instead -enemy -soften -obstinate -offspring -please -enamel -shame -practical -examination -beard -road -boundary -warmth -publish -decorate -shift -stall -sterile -noxious -sweeten -tobacco -obsolete -bronze -recital -scholar -theology -distillation -disk -assumed -rack -animate -christ -paradise -jurisdiction -shrink -touching -recompense -inherent -alarm -sincere -conquest -arms -perch -politic -paddle -intestine -meat -repetition -abusive -spear -honorary -relating -reed -disorderly -plural -immediately -produced -prudent -dividing -glory -caution -litter -fixed -rain -were -useless -defective -shine -hospital -injurious -wretched -funeral -enjoyment -access -major -defect -brother -empire -procession -accurate -lessen -seven -explosive -cheerful -embryo -dirty -fellowship -sickness -rotation -secretary -wisdom -temperate -instruction -transient -resolute -solicit -weaken -tarnish -nail -abortive -mounted -straw -learned -commander -strive -doubling -hill -chlorine -butter -dangerous -catching -infant -greenish -recall -abundant -sulphuric -refer -explanation -nearly -vexation -perfection -four -castle -confuse -farther -administer -instant -spoil -junction -mast -ministry -eclipse -rake -suborder -prolific -forbear -tribunal -irritation -boom -divination -vacant -sinister -inspired -sensibility -exist -stated -graduate -intercourse -gland -chapel -calm -perverse -modest -spell -legitimate -mortgage -ardent -manifold -league -blunt -frequently -limitation -framework -worse -stitch -fund -equally -shrill -larva -inflammation -bundle -immature -pepper -called -frontal -culture -date -planet -condemn -nasal -willing -disciple -wine -expense -marshal -cowardly -riddle -smart -contrivance -shank -cutter -director -hasty -gauge -merit -elementary -sheep -trail -trimming -marking -always -ticket -precipitate -interpret -saving -depressed -regiment -decoration -permit -abroad -specious -subtile -cipher -combat -arsenic -tough -sentinel -adequate -import -spare -digestion -adorn -then -wealth -manual -eternal -opponent -believer -compress -lake -refine -fidelity -armed -valve -sullen -spend -conformity -lifeless -prosecute -patch -panel -defile -grating -transverse -engagement -tumult -malicious -flowering -most -belt -fitting -slate -adoption -heel -sweeping -hydrous -angry -resort -locality -closely -comb -reversed -heating -grammar -magazine -clay -morning -vault -diagonal -couple -boot -engraved -emission -bloody -university -portable -thorax -juice -spotted -exclude -abnormal -attain -logical -fruitful -removal -doing -sell -mournful -skull -this -monstrous -elaborate -canon -endless -seventh -defensive -orchestra -simplicity -transform -confound -pool -violate -likely -vesicle -precise -scientific -treasure -creation -inward -masonry -attraction -belly -adversary -gripe -each -pencil -egyptian -delegate -garrison -variance -corolla -alienate -accessory -inner -temperament -done -sore -constrain -exempt -associated -recovery -late -complaint -melting -dialect -shrub -prison -deserving -rightful -excursion -entreaty -refined -debt -denial -oily -avoid -inverted -proverb -metameric -anxiety -cleavage -chimney -laughter -excessive -metrical -twitch -improvement -arrogant -traveler -universe -chemistry -peduncle -abatement -canal -multitude -resident -safety -derision -sweat -rider -reckon -dread -superficial -depend -tend -player -mortal -enthusiasm -president -barbarous -evening -devise -genuine -surrounding -imitate -convenient -revolving -honey -hardened -bruise -thinking -children -conform -tribute -contention -ride -they -uncover -steal -honest -mushroom -nest -harmonize -disable -creep -thus -mortar -chair -extremely -consistency -verge -disquiet -vanity -defiance -mask -strait -rouse -fringe -mate -bass -safe -flounder -compensation -quickly -conceal -bull -prisoner -build -resembling -pardon -city -crustacea -starch -heavily -usual -platinum -bush -decided -nurse -cock -omission -surety -accidental -clumsy -proposal -punish -contents -british -exposition -gigantic -warranty -rear -fiction -collision -armor -plank -crop -attorney -radiated -encircle -passionate -antelope -scotch -accomplish -supposed -emit -hesitate -pedestal -pearl -bandage -fatigue -submission -training -partake -rapidity -every -worldly -incense -attached -probably -engrave -distribution -plead -wait -inform -door -ribbon -impart -mail -swift -premium -yoke -narcotic -trifle -unfold -lesson -glucoside -kernel -reconcile -profuse -conceive -visit -plastic -defendant -cavity -silicate -inhabit -continuance -crude -graceful -charcoal -india -slave -destructive -ether -adhere -ditch -estimation -chinese -solvent -persuasion -oxidation -entertainment -spectrum -detail -disunite -tower -reliance -urge -mixed -hall -immortal -beverage -weigh -flour -constitute -tack -lance -intermediate -sale -area -vent -publication -coating -audience -particularly -unit -compel -augment -laying -interfere -index -garland -entry -rectitude -discord -deformity -consist -dullness -happy -cool -know -exactly -united -farthest -tubular -grasp -infernal -construct -treaty -regarded -narrowly -toll -kill -kindred -learn -fortunate -sensual -railway -efficacy -uniformity -remainder -employed -integrity -helmet -operculum -conscience -incision -stout -devote -naturally -dragon -divest -exclamation -indented -enlargement -imagine -orthodox -conductor -frustrate -occur -dialogue -mollusca -curtain -poetical -loop -infectious -bare -rabble -weed -crab -watery -income -feeble -lease -adjustment -confession -enormous -born -array -crush -stress -volcanic -humanity -perplex -requital -plaintiff -boil -revenue -often -wagon -susceptible -sanskrit -noisy -speculation -suture -contrive -cant -olive -finished -forge -dexterity -showy -indifferent -require -pervert -tasteless -proclaim -mechanism -discussion -slacken -deposition -manufacture -deity -blemish -strained -writ -criticism -affair -out -scattered -inference -alkaline -mostly -cardinal -winged -army -slice -crank -keen -essay -retain -prey -abundance -periodical -pillar -sacrament -pink -retort -purify -goodness -hind -refusal -conspicuous -friendship -expedition -widely -deadly -objection -partly -rapacious -perfume -sauce -poem -couch -spin -response -subjected -stuffing -recoil -pine -conclude -falling -tonic -legislative -formality -expectation -blame -staple -revive -globular -unnatural -forehead -escutcheon -alcoholic -monthly -recite -brood -astringent -fineness -arranged -seam -supporter -tumble -branches -fastening -assent -proud -govern -bosom -artful -eminent -diminution -sick -unity -headlong -cautious -mistaken -derive -homology -inflict -sulphide -humility -teach -truck -pouch -neat -prohibit -grind -pavement -advice -pluck -hour -kindly -monarch -tumor -mingle -turbulent -predicate -however -representation -watchful -intent -painted -ordnance -scorn -chatter -sediment -cognizance -literally -derivation -gentleman -abrupt -subtle -craft -fool -bestow -tight -spleen -facing -portrait -keel -procedure -vibration -valued -harangue -frank -rust -coach -wreck -path -earthy -authentic -once -palliate -oxide -working -pacific -aversion -pyroxene -grains -spanish -heave -chorus -magnesia -tenor -productive -mitigate -denoting -definition -gall -carbonate -inclosed -bulk -taint -pillage -slowly -healing -effective -foil -pressing -unctuous -nitrogenous -calcium -hydrocarbon -suggestion -quotient -integral -gradually -extended -unlucky -stir -spirited -convent -majority -parent -harvest -statue -ligament -reflected -existing -noted -ecliptic -equitable -anxious -neither -farewell -bail -flute -must -facility -ensign -italian -barren -solitude -refrain -accuracy -charitable -clock -weary -silvery -deception -wheat -nobleman -antimony -pronoun -received -chancery -expedient -flock -repeated -saffron -exemption -kindle -stool -breaking -thicken -abate -boast -harden -prose -ward -devil -celestial -leguminous -throwing -voyage -diminutive -explode -fugitive -including -regularly -fastened -sermon -snap -dreadful -custody -cruel -oppress -magical -silk -galley -uncommon -executive -denote -seek -warning -elephant -livery -salmon -designed -statute -education -bringing -modesty -typical -prostitute -initial -humming -heathen -confused -adhesive -sickly -required -throng -attract -teaching -packing -occupied -ornamental -quill -tyrant -hydrate -oath -snatch -vagrant -tunnel -inflamed -stirring -alumina -meanness -cable -problem -incumbent -insipid -spout -narrative -orator -punch -attended -articulation -default -poverty -lighter -five -paste -viscous -analogy -clearing -imposition -curse -quadrate -flattery -insult -justify -disregard -parliament -vinegar -cleave -delineate -borough -diversion -dealer -pour -whitish -imitative -boiler -spurious -vain -ending -camphor -puzzle -included -pause -contracted -adjectively -fondness -indies -squirrel -month -crane -sketch -controversy -guarantee -chastity -unlimited -fighting -pretend -surpass -button -overseer -unusual -flank -stony -efficient -rarely -mankind -spice -guilt -assemble -though -formula -teacher -dainty -innocence -vitreous -clergyman -animation -apron -cycle -serving -equity -scripture -violet -containing -hear -stopping -consisting -decomposition -lightning -latitude -ideal -hire -elbow -purse -gossip -capillary -trivial -pompous -feature -cheer -suspense -rigid -optical -available -malice -whose -critic -brave -neighbor -link -stratagem -spire -seeing -prudence -assertion -worry -both -extravagant -harmonious -partner -acquire -decisive -valley -backbone -sportive -granular -random -asiatic -diligence -cordial -bath -vowel -dealing -brighten -dense -tortoise -sculpture -shearing -reptile -bible -seizure -indent -pulse -wool -wish -univalve -lash -withhold -suspicion -adherence -acknowledge -firmness -celebrate -scramble -until -nickname -discern -undue -murder -diurnal -hebrew -evergreen -shepherd -impudent -detached -jointed -cask -alive -comparative -frolic -mouse -signify -announce -quickness -orifice -accompany -explosion -clothe -caustic -choose -pace -mirror -cohesion -artillery -insert -mobile -conversation -symptom -grease -polarity -offset -deer -furious -emphasis -been -transact -calamity -resolved -producing -contingent -complexion -puff -sagacious -classical -deluge -rattle -rash -expert -expressive -footing -cone -austere -competent -plausible -studious -breech -spelling -retail -petty -reasonable -buffalo -bubble -insanity -idleness -proceeds -curl -ascend -wife -reform -creeping -balloon -create -rage -entreat -insertion -offend -rove -shifting -twelfth -inspect -decide -figurative -miss -athletic -directed -exceeding -ambition -absorb -tangent -bait -haughty -intercept -translation -crisp -darken -stability -factor -octave -insnare -propagate -evident -tenure -auditory -forked -obstacle -muzzle -intricate -grate -peevish -applied -summons -golden -locomotive -incorrect -intensive -insoluble -collected -amusement -vary -attentive -smile -reproduce -cleft -dropping -pectoral -ceiling -indigo -ruminant -artless -message -pity -ravenous -rapidly -quadrant -lying -invite -merry -pliable -animated -liability -assuming -sprout -affirmative -barter -suggest -elder -monster -tending -ethylene -rampart -scope -yarn -reign -lofty -rubbish -foremost -melt -to -eighteen -teeth -feathered -formally -objective -reckless -deaden -spruce -molasses -sheath -fond -secrecy -entrails -digestive -commercial -horror -geometry -provoke -identity -themselves -abide -valid -winning -satisfaction -foliated -cultivate -insurance -shower -dejection -street -bench -notch -sanctuary -threaten -core -thirst -crimson -isolated -fate -potassium -sphenoid -gloss -initiate -killing -remembrance -acuteness -digging -fraud -endowment -commanding -stale -resin -tally -select -weaving -bowl -sloping -exalt -interrupt -wither -foresight -circulation -gill -igneous -obscurity -distill -inscribe -bondage -hastily -notation -firearm -mute -oppressive -pericarp -communication -creeper -forfeit -apprehend -fully -gracious -divert -derived -railroad -interchange -originate -obstinacy -neuter -sack -capture -fencing -inquire -pope -greatly -wolf -degraded -dejected -guidance -aerial -rhyme -desirable -insensible -discordant -ligature -adopted -sanguine -spasmodic -physician -luster -salute -broach -fork -gear -graduated -adultery -warlike -obstruction -liver -smallpox -lighten -loosen -rigor -deformed -climate -admitted -hunting -fifteenth -reject -concerned -butcher -cessation -approve -turkish -fare -saturated -impair -shroud -clamor -disjoint -fourteen -epidemic -clergy -muddy -laugh -shrewd -observance -act -singing -snuff -cricket -geology -insane -subsequent -missile -on -beggar -cane -eagle -abruptly -deceitful -reddish -cathedral -sixteenth -senate -buck -nourish -displace -relate -candidate -plump -slack -artery -sodium -powdered -ascent -gloom -lowering -resinous -tradition -governing -boiled -induce -arise -meditate -voltaic -harmless -shedding -ripple -uneasy -fissure -merchandise -victory -conference -paid -uneasiness -instinct -unworthy -rival -wasteful -preliminary -branching -boasting -brittle -honesty -need -indistinct -inspiration -giddy -rescue -absent -buffoon -convex -frontier -argue -thickness -marginal -throughout -untimely -exquisite -rogue -potter -qualities -nonsense -stealing -lining -relax -infuse -ruling -additional -streak -immerse -preference -network -condense -tablet -tinge -onward -smother -grasping -ammonia -jupiter -doublet -mission -fission -anew -causing -sleeve -authorized -amber -excrement -damp -affront -offense -cherish -restrict -budding -confederate -sever -ambush -growing -irritable -local -homage -regret -vitality -meadow -northwest -spongy -leaves -elsewhere -police -placenta -component -spirituous -accustom -therefore -intelligence -actually -consistent -destiny -cloak -forbid -disappear -cylindrical -written -fifth -urine -haste -already -scarf -durable -grievous -arrival -fierce -whirl -afflict -built -furrow -sorrowful -plume -aniline -tick -connected -serpentine -spit -epoch -magnify -drunken -torpedo -conscious -fortify -session -vertebra -shipping -saint -petroleum -assist -curb -observer -asunder -qualified -occurrence -cleaning -offender -mediate -occurring -negligent -beaten -illustration -mock -stormy -verb -figured -assemblage -drying -murmur -deviate -kitchen -zinc -anticipate -servitude -creditor -privy -dock -monopoly -newspaper -retard -licensed -terrestrial -boastful -sliding -ragged -furnished -wrought -frightful -whence -stratum -differ -gratify -conjecture -ownership -whimsical -mere -fundamental -variant -arboreal -subjection -strife -subscribe -ointment -symmetrical -exactness -glossy -liking -sprightly -collapse -pudding -cultivation -disfavor -dart -renew -consign -tremulous -distinguished -pleading -saline -recent -limestone -vindicate -inch -heroic -preface -magistrate -inflection -unlike -cruelty -semblance -mention -parapet -readiness -used -abode -troop -jacket -equator -invisible -hindrance -anthozoa -spike -refractory -narration -magnetism -naval -bitumen -impetuous -germinal -measurement -unjust -mole -chosen -willow -retract -obvious -combining -prosperity -allay -stocking -lymphatic -adapted -protract -sober -explore -abounding -commotion -pricking -affix -dipping -nutrition -pigeon -forcing -feminine -palate -cartilage -republic -rebuke -walking -reclaim -duplicate -arrive -quit -quartz -scallop -guess -trump -homologous -sixteen -grieve -removing -slaughter -extracted -suspect -engineer -aldehyde -titmouse -carried -stringed -arrogance -studied -tractable -reveal -observing -distaste -delicious -retired -cancer -hinge -obscene -preacher -illustrate -triple -bolster -cheek -fullness -applause -surgeon -voracious -moth -quite -save -carving -deny -grapple -diet -vehemence -tartar -vassal -parcel -tabernacle -dream -opaque -cathartic -herring -opposed -abdominal -steamer -tiller -admiration -breeches -obedient -thrusting -bluster -owner -certainty -sway -respond -scarlet -goose -ashes -martial -salient -manganese -accession -glutinous -declivity -popularly -invalid -grateful -correspond -practiced -bias -nocturnal -calcareous -tumultuous -performer -dispense -quietly -discretion -proboscis -frost -skirt -laudable -separated -pulp -harm -privacy -brought -sternum -cost -rifle -awake -tallow -jump -vomit -thirty -bracket -terror -swim -freezing -persian -recently -unstable -inequality -see -truly -ripe -reply -overhang -misfortune -performed -oyster -citation -dilute -confess -specially -extraordinary -expressed -contained -breeze -contribute -tent -contagious -package -infect -volunteer -percussion -warbler -captive -ingredient -failing -secrete -technical -knitting -goddess -trousers -puncture -cheese -tapering -ingenious -windpipe -workman -mammalia -collateral -shave -painter -harass -reel -countenance -frivolous -evacuate -ignorance -happen -mosaic -for -collectively -slavery -mackerel -navigation -brisk -savor -blister -developed -claw -episcopal -undivided -redress -sparkle -stumble -coffee -boisterous -reproof -ramble -encourage -twice -thrush -triangular -tapeworm -fitness -lodging -appointed -confer -manure -basic -patriarch -parties -phenomena -expel -dried -idiom -theme -stimulate -admitting -drapery -genera -countries -stamens -previously -involving -separating -murderous -seizing -successful -frighten -set -hoop -printed -supported -spiritless -plumb -shoal -pavilion -endurance -encumber -pendent -turkey -conviction -receiving -faction -limber -disagree -stupefy -prevail -enlarged -cage -clasp -conveying -mammals -protoplasm -engross -exert -emperor -extending -porous -consequent -horseback -froth -settled -bachelor -reduced -landscape -knock -republican -partaking -suspended -edifice -capability -buckle -vanish -righteous -lawful -maiden -telltale -cellular -convict -soothe -snail -brake -sparrow -vast -chaff -camp -filament -chill -glassy -tracing -elect -accusation -fishes -envy -hunger -polite -lumber -freely -flashing -discredit -profess -accretion -brightness -moist -affirm -illuminate -melody -tire -pliant -effusion -exclusion -text -blessed -enrich -utensil -frugality -revenge -park -implied -in -corona -differential -fusion -impotent -dissection -tragedy -woody -cleanse -deceit -longer -yearly -almost -pendulum -twin -indicator -respiration -infantry -hail -consume -distrain -reducing -chord -spectator -illegal -swiftness -lever -prosperous -colony -selection -illusion -ventilate -parietal -arctic -bismuth -cranium -formative -flax -solar -undertaking -behave -urinary -assistance -but -worsted -coral -humorous -nineteen -sameness -resentment -gaseous -lion -sure -grecian -textile -stagger -vivacity -iniquity -summon -clause -velvet -smear -encompass -swollen -fashionable -intrude -deprived -garnish -composing -loom -preaching -eloquence -decayed -silurian -parchment -infection -magnesium -prelude -discontent -thumb -tympanum -distract -team -rehearse -dictate -abortion -seminary -skip -manager -selfish -loathing -suck -obsequious -pyramid -observant -establishment -penance -trinity -busy -springing -weeping -gayety -rugged -stave -total -flask -concurrence -mood -chart -inscription -clerk -viscid -baptism -calculus -enduring -foretell -reprove -eucharist -madness -stupidity -catalogue -hurry -atom -collation -pillow -calculate -eject -housing -peel -location -inhuman -tuft -least -substantial -sustained -thwart -unlawful -cabinet -ventricle -rigging -determined -trip -assize -driven -carpet -hurt -smoky -pump -longing -radius -ambiguous -exalted -albumin -oppression -frugal -gothic -stately -hooked -shears -porcelain -benzene -franchise -although -fraction -flavored -substitution -distinctly -entitle -transit -since -nine -risk -ghost -divorce -prophecy -representative -changeable -bohemian -unable -explicit -advise -greedy -squander -requisite -enroll -revolt -scold -foreshow -evaporate -warfare -pearly -vertebral -swiftly -stereotype -herb -impartial -hardy -authorize -corrosive -laborious -infinity -absorption -conjunction -cloister -reservoir -acrid -commodity -million -uterus -eleventh -fifteen -pretender -diatonic -jury -hydroxyl -varieties -surgery -commons -upon -invent -responsible -requite -prompt -those -haul -reside -lathe -allege -consort -mentally -licentious -excavate -bury -babble -feudal -canvass -comprehend -dissolute -pension -blessing -switch -effeminate -repeating -educate -balsam -shuffle -stifle -outrage -invasion -appease -tilt -stoop -vexatious -wager -orbit -resound -drawn -subdued -dagger -indication -pickle -hackney -hearty -relapse -concealed -tame -speculum -persistent -blanch -carbonic -prickly -syllogism -luxury -childish -provincial -knit -forced -wasting -dismiss -designation -corporation -coupling -venus -ballast -lavish -recording -phenomenon -boring -curvature -bully -ruff -bowsprit -bastion -braid -consult -harrow -hasten -deputy -suspicious -betray -puppet -playing -privately -famous -assert -chisel -permission -reformed -ratio -mustard -hissing -hurtful -leaning -reversal -committee -treason -villain -corresponding -resulting -treble -pushing -examining -ductile -affirmation -flux -guttural -remission -congregation -annoy -criticise -said -mortify -heedless -tabular -shiver -uneven -displeasure -antique -fatal -characteristic -zigzag -audible -reversion -canker -shark -respecting -surveyor -pistil -premature -agility -sulphate -wreath -inflate -presage -lustful -eighth -capstan -confined -rendered -chalk -engender -twofold -attractive -fell -diligent -burlesque -vacancy -bustle -misery -luxurious -holland -silicon -antagonist -fright -concretion -overpower -dissent -lover -introduction -abandoned -pottery -hunt -lives -desperate -roving -birch -density -bunch -overturn -revival -turnpike -operative -finishing -spine -dismount -headdress -veil -overwhelm -unhappy -coarsely -perplexity -ellipse -oration -tributary -informal -herbaceous -sanctity -undo -restoration -artist -vicinity -soak -vacation -median -pivot -mohammedan -negligence -uniformly -echo -modify -testify -absurd -seaweed -collector -projectile -aberration -piston -saturate -fallow -marrow -vomiting -infirm -testing -enjoy -languish -precedent -stationary -rudder -inanimate -payable -seventy -clutch -china -peaceful -sister -sucking -preach -prosecution -jaundice -gradient -hypothesis -adjoining -penitent -comment -concealment -perpetual -airy -rostrum -dying -accuse -talking -inherit -tumbler -thrown -palatine -defraud -basin -calmness -symphony -rudimentary -negotiate -wandering -quail -revelation -greatness -answerable -besides -widow -alter -falsify -autumn -oval -crossbow -recede -broker -hatch -erection -adjunct -tense -habitation -umbrella -inclining -manuscript -realize -mild -folly -ascending -patronage -wedlock -getting -snake -coordinate -abridge -dismal -senior -oblong -sequester -organization -diseased -vacuum -bryozoa -immersion -focus -plait -founded -offered -dioxide -unfeeling -fluke -chicken -eleven -maintenance -puddling -moisten -hound -russian -perforated -retainer -olfactory -roundish -warehouse -granite -frozen -launch -quarry -splinter -gunpowder -molding -heighten -surveying -trough -searching -stab -elevator -extraction -refinement -crotchet -use -mound -rhythm -ivory -desirous -attainment -rectify -indolent -jerk -umbilicus -smack -muse -auction -allegiance -define -apparently -tarsus -inability -baggage -boarding -folding -junior -might -clamp -changed -possessed -passable -bromine -sent -spill -delirium -coffin -trickery -withered -polar -utterly -stagnant -phosphorus -coalesce -consecrate -straddle -submissive -shatter -ulcer -toss -shameful -daily -disengage -ruler -bearer -bony -calyx -wickedness -placed -changing -felicity -poll -vocation -attendance -falsely -clip -wonderful -potash -bodies -substantive -liberate -ritual -prevailing -telegraph -carrier -courteous -waist -herd -aspirate -intend -potent -enhance \ No newline at end of file diff --git a/cp/ex04/hangman.py b/cp/ex04/hangman.py deleted file mode 100644 index 85f709b15f79b3210616337547cb3fb49ea9a10b..0000000000000000000000000000000000000000 --- a/cp/ex04/hangman.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Exercise 4.12-4.16.""" -def is_word_guessed(secret_word : str, letters_guessed : str) -> bool: - """Determine if the word has been guessed. - - :param secret_word: The word to guess - :param letters_guessed: A ``str`` containing the letters that have currently been guessed - :return: True if and only if all letters in ``secret_word`` have been guessed. - """ - # TODO: 4 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return guessed - - -def get_guessed_word(secret_word : str, letters_guessed : str) -> str: - """Format the secret word for the user by removing letters that have not been guessed yet. - - Given a list of the available letters, the function will replace the letters in the secret word with `'_ '` - (i.e., a lower-case followed by a space). For instance, if the secret word is ``"cat"``, and the - available letters are ``"ct"``, then the function should return ``"c_ t"``. - - :param secret_word: A ``str``, the word the user is guessing - :param letters_guessed: A ``str`` containing which letters have been guessed so far - :return: A ``str``, comprised of letters, underscores (_), and spaces that represents which letters in secret_word have been guessed so far. - """ - # TODO: 6 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return word - - -def get_available_letters(letters_guessed : str) -> str: - """ - Return the letters which are available, i.e. have not been guessed so far. - - The input string represents the letters the user have guessed, and the output should then be the lower-case - letters which are not contained in that string. The function is used to show the user which - letters are available in each round. - - :param letters_guessed: A `str` representing the letters the user has already guessed - :return: A `str` containing the letters the user has not guessed at yet. - """ - # TODO: 2 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return letters - - - -def hangman(secret_word : str, guesses : str): - """ - Play an interactive game of Hangman. - - This function should launch an interactive game of Hangman. The details of the game is defined in the - project description available online, and should be read carefully. - - * The game should first display how many letters are in the secret word. You should start by generating this output. - * Before each round, the user should see how many guesses that are left and which letters are not yet used - * In each round, the user is prompted to input a letter. Use the ``input('..')`` function for this. - * The user is given feedback based on whether the letter is in the word or not. The program also performs error handling. - * The game terminates when the user win, has exceeded the number of guesses, or if the user makes an illegal input. - in this case the user is shown a score. - - :param secret_word: The secret word to guess, for instance ``"cow"`` - :param guesses: The number of available guesses, for instance ``6`` - """ - # TODO: Code has been removed from here. - raise NotImplementedError("Insert your solution and remove this error.") - - - -if __name__ == "__main__": - print("This should return True: ", is_word_guessed("dog", "tdohg")) - print("This should return False: ", is_word_guessed("dog", "dthk")) - - print("This should be 'c_ w': ", get_guessed_word('cow', 'kcwt')) - - print("Available letters when we have tried 'abcdefghijk'; this should be about half the alphabet: ", get_available_letters('abcdefghijk')) - - print("Lets launch hangman. Try the inputs in the exercise description and see if you get the same") - hangman("cow", 4) diff --git a/cp/ex04/mathematics.py b/cp/ex04/mathematics.py deleted file mode 100644 index 05838df3f9822c2f34e5dda2bb05926efef69c0b..0000000000000000000000000000000000000000 --- a/cp/ex04/mathematics.py +++ /dev/null @@ -1,25 +0,0 @@ -"""Exercise 4.1 and 4.2.""" -import math - -def square_root(a : float) -> float: - r"""Compute the square root, see section 7.5 in Think Python. - - :param a: A number to compute the square root of. - :return: :math:`\sqrt{a}`. - """ - # TODO: 7 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return sqrt_a - -def ramanujan() -> float: - r"""Compute the Ramanujan approximation of :math:`\pi` using a sufficient number of terms. - - :return: A high-quality approximation of :math:`\pi` as a ``float``. - """ - # TODO: 9 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return pi - -if __name__ == "__main__": - print("approximate pi", ramanujan()) - print("square root of 2 is", square_root(2)) diff --git a/cp/ex04/palindrome.py b/cp/ex04/palindrome.py deleted file mode 100644 index ed1151062b250bf67e04b071978611397d6ff5ae..0000000000000000000000000000000000000000 --- a/cp/ex04/palindrome.py +++ /dev/null @@ -1,15 +0,0 @@ -"""Exercise 4.1: Checking if a word is a palindrome.""" - -def is_palindrome(word : str) -> bool: - """Check if ``word`` is a palindrome. - - :param word: The word to check - :return: ``True`` if input is a palindrome and otherwise ``False`` - """ - # TODO: 2 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return is_a_palindrome - -if __name__ == "__main__": - print("Is Madam a palindrome?", is_palindrome('madam')) - print("Is gentleman a palindrome?", is_palindrome('gentleman')) diff --git a/cp/ex04/parenthesis.py b/cp/ex04/parenthesis.py deleted file mode 100644 index a55d73a535b9e1267f9baceea662f5b3ac306edf..0000000000000000000000000000000000000000 --- a/cp/ex04/parenthesis.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Exercise 4.x-4.y.""" -def matching(expression :str) -> bool: - """Tell if the parenthesis match in a mathematical expression. - - For instance, the parenthesis match in ``"3x(y-1)(3y+(x-1))"`` but not in ``"3x(y-4))"`` - - :param expression: An expression containing zero or more parenthesis. - :return: ``True`` if the number of open/close parenthesis match, otherwise ``False`` - """ - # TODO: 9 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return matching - - -def find_index_of_equality(expression : str) -> int: - """Find an index ``i`` which split the expression into two balanced parts. - - Given an expression containing opening and closing parenthesis, for instance ``"(()())"``, this function should - return an index ``i``, such that when the string is split at ``i``, the - number of opening parenthesis ``(`` in the left-hand part equal the number of closing parenthesis ``)`` in the - right-hand part. For instance, if ``i=2``, the expression is split into the right, left hand parts: - - - ``"(()"`` - - ``"())"`` - - In this case the left-hand part contains ``2`` opening parenthesis and ``2`` closign parenthesis so ``i`` is the right index. - Similarly, for ``"()"``, the answer would be ``1``. - - :param expression: An expression only consisting of opening and closing parenthesis. - :return: The index ``i`` as an int. - """ - # TODO: 6 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return i - - -def print_the_dialogue(s : str): - """Print all dialogue in a manuscript. - - Given a manuscript (as a ``str``), this function will find all lines of dialogue to the console, one line of - dialogue per printed line. Dialogue is enclosed by double ticks, i.e. this ``str`` contains two pieces of dialogue: - ``"''My dear Mr. Bennet,'' said his lady to him one day, ''have you heard that Netherfield Park is let at last?''"`` - - :param s: The manuscript as a ``str``. - """ - # TODO: 4 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - -def find_innermost_part(s : str) -> str: - """Find the innermost part of a mathematical expression. - - The innermost part is a substring enclosed in parenthessis but not containing parenthesis. - For instance, given ``"3(x+(4-y^2))"``, then ``"4-y^2"`` is an inner-most part. - The parenthesis can be assumed to match. - - :param s: The mathematical expression as a ``str`` - :return: The innermost part as a ``str`` - """ - # TODO: 3 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return inner_part - - - -if __name__ == "__main__": - print("Does the parenthesis match?", matching("2x(x+2)")) - print("Does the parenthesis match?", matching("2x(x+(2-y)^2)")) - print("Does the parenthesis match?", matching("4x")) - - print("Does the parenthesis match?", matching("2x(x+2")) - print("Does the parenthesis match?", matching("2x)(x")) - print("Does the parenthesis match?", matching("4x()(()))")) - - s = "(())))(" - - print("Index of equality for", s, "is", find_index_of_equality(s)) - dialogue = "He said: ''How are you old wife''? She answered, perplexed, ''I am not your wife''" - print_the_dialogue(dialogue) diff --git a/cp/ex04/play_hangman.py b/cp/ex04/play_hangman.py deleted file mode 100644 index 3f9f48f9afbcec1e395abc922cd7232d412b59d2..0000000000000000000000000000000000000000 --- a/cp/ex04/play_hangman.py +++ /dev/null @@ -1,25 +0,0 @@ -"""Play a game of hangman by loading a random word.""" -import random -import os - -def load_words() -> list: - """ - Return a list of valid words. Words are strings of lowercase letters. - - Depending on the size of the word list, this function may - take a while to finish. - - :return: The available words as a list. - """ - from cp.ex08.words import load_words - wordlist = load_words(os.path.join(os.path.dirname(__file__), "files", "5000-words.txt")).split() - return wordlist - - -def choose_word() -> str: - """Select a word at random. - - :return: A randomly selected word, useful for playing hangman. - """ - wordlist = load_words() - return random.choice(wordlist) diff --git a/cp/ex04/prefix.py b/cp/ex04/prefix.py deleted file mode 100644 index e7734d78aa9e987c103be7d5e007d4216a4cc5b4..0000000000000000000000000000000000000000 --- a/cp/ex04/prefix.py +++ /dev/null @@ -1,33 +0,0 @@ -"""Exercise XX.""" - - -def common_prefix(word1 : str, word2 : str) -> str: - """ - Return the longest string so that both ``word1``, and ``word2`` begin with that string. - - :param word1: First word - :param word2: Second word - :return: The longest common prefix. - """ - # TODO: 6 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return prefix - -def common_prefix3(word1 : str, word2 : str, word3 : str) -> str: - """ - Return the longest string so that both ``word1``, ``word2``, and ``word3`` begin with that string. - - :param word1: First word - :param word2: Second word - :param word3: Third word - :return: The longest common prefix. - """ - # TODO: 1 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return prefix - - -# Driver Code -if __name__ == "__main__": - print("The longest Common Prefix is :", common_prefix("egregious", "egg")) - print("The longest Common Prefix is :", common_prefix3("egg", "egregious", "eggplant")) diff --git a/cp/ex09/__init__.py b/cp/ex09/__init__.py deleted file mode 100644 index 0be31d7b89d2f11b47aac820746bfa405a05e636..0000000000000000000000000000000000000000 --- a/cp/ex09/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Exercises for week 9.""" diff --git a/cp/ex09/rectangle.py b/cp/ex09/rectangle.py deleted file mode 100644 index 2ef08c734a79adb885101e34abf0a0bbc956859d..0000000000000000000000000000000000000000 --- a/cp/ex09/rectangle.py +++ /dev/null @@ -1,77 +0,0 @@ -"""The Rectangle-exercises 9.1-9.2.""" -import matplotlib.pyplot as plt - -class Point: - """A class that represents a Point. See Section 15.1.""" - -class Rectangle: - """A class that represents a Rectangle. See Section 15.3.""" - -def area(rectangle : Rectangle) -> float: - """Compute the area of a Rectangle-object. - - :param rectangle: A rectangle-object. Recall it has properties such as ``rectangle.width`` and ``rectangle.height``. - :return: The area of the rectangle. - """ - # TODO: 1 lines missing. - raise NotImplementedError("Compute the area here. Try to use the debugger if you are stuck.") - return a - -def make_a_rectangle(x, y, width, height): - """Create and return a new Rectangle-object. Look at Section 15.3 to see what fields it must possess. - - :param x: The x-position of the lower-left corner. - :param y: The y-position of the lower-left corner. - :param width: The width of the rectangle. - :param height: The height of the rectangle. - :return: A new Rectangle object. - """ - # TODO: 6 lines missing. - raise NotImplementedError("Create and return a Rectangle object here.") - return rect - -def split_rectangle(rectangle : Rectangle, horizontally : bool) -> list: - """Split the rectangle object into two. Either horizontally or vertically. - - For instance, if ``horizontally=True`` this function should return a list such as - ``[left_rectangle, right_rectangle]``. - - :param rectangle: A rectangle-object. - :param horizontally: If ``True`` the Rectangle is split horizontally otherwise vertically. - :return: A list with two Rectangle-objects. - """ - # TODO: 5 lines missing. - raise NotImplementedError("Implement function body") - return split - -def plot_rectangle(rectangle: Rectangle): - """Plot the rectangle using matplotlib. - - :param rectangle: The Rectangle to plot. - """ - # TODO: 5 lines missing. - raise NotImplementedError("Implement function body") - -def rectangle_inception(rectangle, n): - r"""Recursively generate a list of n+1 rectangles by applying split_rectangle n times. - - Note that the list should contain n+1 non-overlapping rectangles with the same total area as the original rectangle. - The function should begin with a horizontal split. - - :param rectangle: The initial rectangle to split. - :param n: How many recursive splits to apply - :return: A list of n+1 Rectangle-instances of the form ``[left, right_top, ...]`` - """ - # TODO: 3 lines missing. - raise NotImplementedError("Implement function body") - return rectangles - - -if __name__ == "__main__": - rectangles = rectangle_inception(make_a_rectangle(0, 0, 10, 10), 10) - for r in rectangles: - plot_rectangle(r) - # Optionally: Let's save the rectangle for later: - from cp import savepdf - savepdf("rectangles.pdf") # Save your pretty rectangles for later. - plt.show() diff --git a/cp/ex09/sinus.py b/cp/ex09/sinus.py deleted file mode 100644 index 2497a9f9b90080db69f6a6b09ff0da309f42a4f6..0000000000000000000000000000000000000000 --- a/cp/ex09/sinus.py +++ /dev/null @@ -1,83 +0,0 @@ -"""Project work for week 9, classes I.""" -import math - -class Sin: - """A class that represents the sinus-function, i.e. sin(x) where x can be any expression.""" - -class Cos: - """A class that represents the cosine-function, i.e. cos(x) where x can be any expression.""" - -class Variable: - """A class that represents a (named) variable such as ``x``, ``y``, ``x2``, etc.""" - - -def make_symbol(symbol : str) -> Variable: - """Create a new Variable object with the given name. - - If ``v = make_symbol(x)`` then ``v.symbol`` should be the string ``"x"``. - - :param symbol: The symbol this variable represents, e.g. ``"x"``. - :return: A new variable object. - """ - # TODO: 2 lines missing. - raise NotImplementedError("Implement function body") - return v - -def sine(arg : object) -> Sin: - """Create a new Sin object. The object will represent sin(arg). - - In other words, if we let ``s = sine(arg), then s.arg should be equal to ``arg``. In our case, - ``arg`` can be either a ``Variable``, or an object such as ``Sin``. - - :param arg: The argument to sin. - :return: An object representing ``sin(arg)``. - """ - # TODO: 2 lines missing. - raise NotImplementedError("Implement function body") - return s - -def cosine(arg : object) -> Cos: - """Create a new Cos object. The object will represent cos(arg). - - In other words, if we let ``s = cosine(arg), then s.arg should be equal to ``arg``. In our case, - ``arg`` can be either a ``Variable``, or an object such as ``Cos``. - - :param arg: The argument to cos. - :return: An object representing ``cos(arg)``. - """ - # TODO: 2 lines missing. - raise NotImplementedError("Implement function body") - return s - -def format_expression(expression : object) -> str: - """Format the given expression and return it as a string. - - The expression is an object either of class Variable, Sin or Cos. The function should format it as a ``str``. - - :param expression: An object to format. - :return: A string representation such as ``"cos(x)"`` or ``"sin(cos(y))"``. - """ - # TODO: 6 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - - -if __name__ == "__main__": - exp = sine(cosine(sine(sine(make_symbol('x'))))) - print( format_expression(exp) ) - # print(format_expression(exp), "evaluated in x=0 is", evaluate(exp, 0) ) - - from sympy import sin, cos, symbols, evaluate, Symbol - evaluate_expression = sin.evalf # Get the evaluation-function. Ignore the right-hand side for now. - print_expression = sin.__str__ # Get the formatting-function. Ignore the right-hand side for now. - - x = symbols('x') # Define a symbol - y = sin(cos(x)) - print_expression(y) - evaluate_expression(y, subs={'x': 0}) - - y = sin(x) - isinstance(y, sin) # It is an instance of the sin-class - from sympy import Symbol - y.args - isinstance(y.args[0], Symbol) - y.args[0] == x diff --git a/cp/ex09/vector.py b/cp/ex09/vector.py deleted file mode 100644 index a891d7f47ae2dd13a02ee11d6a99ce06f2f3fef4..0000000000000000000000000000000000000000 --- a/cp/ex09/vector.py +++ /dev/null @@ -1,228 +0,0 @@ -"""This file contains all the exercises relating to the Minecraft-example 9.3-9.8.""" -import matplotlib.pyplot as plt - -class Vector: - """A class that represents a Vector, defined by the endpoint :math:`(x,y)`.""" - -def make_vector(x : float, y : float) -> Vector: - """Create a new Vector object with end-points :math:`(x,y)`. - - .. runblock:: pycon - - >>> from cp.ex09.vector import make_vector - >>> v = make_vector(2,3) - >>> v.x - >>> v.y - - :param x: The :math:`x`-position of the vector. - :param y: The :math:`y`-position of the vector. - :return: A Vector-object with the given end-point. - """ - # TODO: 3 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return v - -def print_vector(v: Vector): - """Print a vector object with coordinates (x,y) to the console. - - The output format for a vector with coordinates :math:`x, y` should be simply ``(x, y)`` (on a single line) - - :param v: A vector object instance. - """ - # TODO: 1 lines missing. - raise NotImplementedError("print(.. format the print statement here .. )") - -def dot(v1 : Vector, v2 : Vector) -> float: - r"""Compute the dot-product of ``v1`` and ``v2``, i.e. :math:`\mathbf{v}_1 \cdot \mathbf{v}_2`. - - :param v1: The first vector, - :param v2: The second vector, - :return: The dot product of ``v1`` and ``v2`` (as a ``float``) - """ - # TODO: 1 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return dot_product - -def scale(s : float, v : Vector) -> Vector: - r"""Scale the vector :math:`\mathbf{v}` by a factor of :math:`s`. - - :param s: A scalar number - :param v: A vector - :return: The vector :math:`s \mathbf{v}`. - """ - # TODO: 1 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return w - -def add(v1 : Vector, v2 : Vector) -> Vector: - r"""Add the two vectors ``v1`` and ``v2`` and return the sum as a ``Vector`` object. - - :param v1: The first vector, - :param v2: The second vector. - :return: Their sum :math:`\mathbf{v}_1+\mathbf{v}_2` - """ - # TODO: 1 lines missing. - raise NotImplementedError("Use make_vector to make create the new vector.") - return vector_sum - -def sub(v1 : Vector, v2 : Vector) -> Vector: - r"""Subtract the two vectors ``v1`` and ``v2`` and return the difference as a ``Vector`` object. - - :param v1: The first vector, - :param v2: The second vector. - :return: Their difference :math:`\mathbf{v}_1-\mathbf{v}_2` - """ - # TODO: 1 lines missing. - raise NotImplementedError("Remember that x - y = x + (-1) * y.") - return diff - - -def hat(v): - r"""Given a ``Vector`` v1, this function returns a new vector which is orthogonal to v1 ('Tværvektoren' in Danish). - - :param v: A vector :math:`\mathbf{v}`. - :return: A ``Vector`` that is orthogonal to :math:`\mathbf{v}`, i.e. :math:`\hat{\mathbf{v}}`. - """ - # TODO: 1 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return v_hat - -class LineSegment: - """A class that represents a line segment.""" - -def make_line_segment(p : Vector, q : Vector) -> LineSegment: - r"""Construct a ``LineSegment`` connecting the two vectors ``p`` and ``q``. - - Note you have some freedom in terms of how you wish to store ``p`` and ``q`` in the ``LineSegment`` object; - i.e. you can either store ``p`` and ``q`` directly similar to the ``Vector``, or perhaps do something slightly - smarter. - - :param p: The vector the line segments begins in - :param q: The line segment the vector ends in - :return: A LineSegment class representing the LineSegment. - """ - # TODO: 3 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return l - - -def point_on_line(l : LineSegment, t : float) -> Vector: - r"""Interpolate between the end-points of the LineSegment. - - Given a line segment, the function will interpolate between the end-points using :math:`t \in [0,1]` - and return a Vector. This can be used to compute any point on the LineSegment and :math:`t=0,1` will - correspond to the end-points. The order is not important for the following problems. - - :param l: A line defined by the two end-points vectors - :param t: Weighting of the two end-point in the inerpolation, :math:`t \in [0,1]`. - :return: A ``Vector`` corresponding to :math:`\mathbf{p} + (\mathbf{q}-\mathbf{p})t`. - """ - # TODO: 1 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return s - -def plot_vector(v: Vector): - """Plot a Vector using matplotlib. - - :param v: Vector to plot. - """ - plt.plot(v.x, v.y, 'ro') - -def plot_line(l : LineSegment): - r"""Plot a LineSegment using matplotlib. - - :param l: The line segment to plot - """ - p = point_on_line(l, 0) - q = point_on_line(l, 1) - plt.plot([p.x, q.x], [p.y, q.y], 'k-') - - -class SquareWithPosition: - """Corresponds to a square located in space. I.e., each corner has an :math:`(x,y)` coordinate.""" - -def make_square_with_position(x : float,y : float, width : float) -> SquareWithPosition: - r"""Create a ``SquareWithPosition`` instance with lower-left corner at :math:`(x,y)` and the given ``width``. - - Note: It is up to you how you want to store the information in the SquareWithLocation-class. You can for instance - choose to store the four corners as ``Vector``-objects, the four sides as ``LineSegment``-objects. - - :param x: :math:`x`-position of the lower-left corner - :param y: :math:`y`-position of the lower-left corner - :param width: The side-length of the rectangle - :return: A ``SquareWithLocation`` object. - """ - # TODO: 5 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return s - - -def intersect(l1: LineSegment, l2: LineSegment) -> Vector: - """Get the intersection between two line segments assuming they intersects. - - :param l1: First line - :param l2: Second line - :return: A ``Vector`` representing the point of intersection. - """ - # TODO: Code has been removed from here. - raise NotImplementedError("Insert your solution and remove this error.") - return p - -def do_they_intersect(l1 : LineSegment, l2 : LineSegment) -> bool: - """Determine if two line segments intersects. - - :param l1: First line segment - :param l2: Second line segment - :return: ``True`` if the two line segments intersects, otherwise ``False``. - """ - # TODO: 3 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return is_intersecting - - -def square_to_lines(sq : SquareWithPosition) -> list: - """Return a list of ``LineSegment``-objects corresponding to the four sides. - - :param sq: The square - :return: A list of four sides, ``[l1, l2, l3, l4]`` - """ - # TODO: 1 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return lines - -def plot_square(sq: SquareWithPosition): - """Plot the ``SquareWithLocation`` instance. - - :param sq: The square to plot - """ - # TODO: 2 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - -def get_intersections(sq : SquareWithPosition, l : LineSegment) -> list: - """Return a list of ``Vector``-objects corresponding to all intersections between the square and line segment. - - :param sq: A square - :param l: A line segment - :return: A list of 0, 1, or 2 ``Vector``-objects corresponding to the intersections. - """ - # TODO: 1 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - return intersections - -def plot_intersections(sq : SquareWithPosition, l : LineSegment): - """Plot all intersections between the square and line. - - :param sq: A square - :param l: A line segment - """ - # TODO: 2 lines missing. - raise NotImplementedError("Insert your solution and remove this error.") - -if __name__ == '__main__': - square = make_square_with_position(1,1,2) - line = make_line_segment(make_vector(-1, -1), make_vector(2, 4) ) - vec = make_line_segment(make_vector(1, 1), make_vector(3, 1) ) - plot_square(square) - plot_line(line) - plot_intersections(square, line) - plt.show() diff --git a/cp/ex10/__init__.py b/cp/ex10/__init__.py deleted file mode 100644 index 24a53b8359da2d36ace8ec63be1da661c813dd7d..0000000000000000000000000000000000000000 --- a/cp/ex10/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""This package represents exercise 10.""" diff --git a/cp/ex10/hospital.py b/cp/ex10/hospital.py deleted file mode 100644 index 21afd9e9ed33804bbbe62b223dd9547401c0b876..0000000000000000000000000000000000000000 --- a/cp/ex10/hospital.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Exercise 10.1: A hospital with doctors and patients.""" - -illnesses = {'hanging toenail': ('feets', 200), - 'stepped on lego': ('feets', 100), - 'headache': ('head', 100), - 'toothache': ('head', 200), - } - -class Person: - """A simple class that represents a person.""" - - # TODO: 20 lines missing. - - - -# TODO: 73 lines missing. - -if __name__ == "__main__": - p = Person("Patricia Smith", 24, 'f') # use the __init__-method to construct the person. - print(p) # Call the str-method diff --git a/cp/ex10/inherit.py b/cp/ex10/inherit.py deleted file mode 100644 index e48a3a8d25c1e277209032772e772844e972a0ac..0000000000000000000000000000000000000000 --- a/cp/ex10/inherit.py +++ /dev/null @@ -1,58 +0,0 @@ -"""A small example of how to use the super()-keyword.""" -class Pet: - """A basic Pet-class.""" - - def __init__(self, name, age): - """Create a new Pet object. - - :param name: The name of the Pet - :param age: The age of the Pet. - """ - self.name = name - self.age = age - - def __str__(self): - """ - Automatically called by ``print(..)``. - - :return: A string representation such as ``"Fido (3 years old)"``. - """ - return f"{self.name} ({self.age} years old)" - -class SimpleCat(Pet): - """A simple Cat-class. This example contains duplicated code.""" - - def __init__(self, name, age, favorite_food): - """Construct a new Cat-object. Asides the name and age, it also has a favorite food. - - :param name: The name of the cat, for instance ``'Mr. Whiskers'`` - :param age: The age, for instance 3. - :param favorite_food: The favorite food, for instance ``"fish"``. - """ - self.name = name - self.age = age - self.favorite_food = favorite_food - -class ImprovedCat(Pet): - """The ImprovedCat uses super() to avoid duplicate code.""" - - def __init__(self, name, age, favorite_food): - """Construct a new Cat-object. The example function similar to the one before. - - :param name: The name of the cat, for instance ``'Mr. Whiskers'`` - :param age: The age, for instance 3. - :param favorite_food: The favorite food, for instance ``"fish"``. - """ - super().__init__(name, age) # Call the Pet.__init__()-method. - self.favorite_food = favorite_food # We stll need to store this one. - - -if __name__ == "__main__": - a = SimpleCat("Mr. Whiskers", 3, "fish") - print(a) - print(a.favorite_food) - # Now let's make an improved cat. - - b = SimpleCat("Mr. Super-duper whiskers", 4, "whatever you are eating") - print(b) - print(b.favorite_food) diff --git a/cp/ex10/symbolic.py b/cp/ex10/symbolic.py deleted file mode 100644 index 0f0b5ec502a98778bb81941771afbb0199a7d484..0000000000000000000000000000000000000000 --- a/cp/ex10/symbolic.py +++ /dev/null @@ -1,82 +0,0 @@ -"""Project work for week 10: A do-it-yourself sympy.""" -import math - - -class Expression: - """A mathematical expression. Can represent a constant `1`, a symbol such as `x`, or a function such as `sin(x)`.""" - - def evaluate(self, substitutions : dict) -> float: - """Evaluate the expression and return a floating-point number. - - The input argument is a dictionary which is used to evaluate all symbols. E.g. if ``substitutions = {'x': 3}``, - this means all instances of the symbolic expression ``x`` will be replaced by ``3``. - - :param substitutions: A dictionary of substitutions. The keys are strings, and the values are numbers. - :return: A floating-point number this expression has been evaluated to. - """ - return 0 - - def differentiate(self, variable : str) -> 'Expression': - r"""Differentiate the expression with respect to the variable, specified as e.g. ``"x"``. - - Note that if this expression is a function of other variables, we must use the chain-rule to recursively - differentiate the other expressions. e.g. :math:`\sin(f(x))' = \cos(f(x))f'(x)`. - - :param variable: The variable we differentiate with respect to (example: ``"x"``) - :return: A class that inherits from ``Expression`` which corresponds to the derivative with respect to the given variable. - """ - return Expression() - - def __str__(self) -> str: - """Provide a string representation of the expression. The function is called automatically by ``print``. - - :return: A string representation of this expression. - """ - return "Remember to implement the __str__()-function." - -# TODO: Code has been removed from here. - -if __name__ == "__main__": - # construct some symbolic expressions - c1 = Constant(2) - c2 = Constant(3) - v = Variable('x') - - # construct expression (2 * x + 3) - expr1 = Addition(Multiplication(c1, v), c2) - - print(expr1) - print(expr1.differentiate("x")) - - # let's evaluate this expression for x = 4 - print(expr1.evaluate( {'x': 4} )) # prints 11 - - # let's differentiate this expression with respect to x - # it should be (2 * 1 + 0) = 2 - diff_expr1 = expr1.differentiate('x') - - # evaluate the derivative at x = 4 - print(diff_expr1.evaluate( {'x': 2} )) # prints 2 - - - # construct another expression (x ^ 3) - expr2 = Sin(v) # Constant(3)) - - # let's evaluate this expression for x = 2 - print(expr2.evaluate( {'x': 2} )) # prints 8 - print(expr2) - # let's differentiate this expression with respect to x - # it should be 3 * x ^ 2 which equals 3 * 2 ^ 2 = 12 at x = 2 - diff_expr2 = expr2.differentiate('x') - print(diff_expr2) - - print( Sin(Cos(Cos(v))).differentiate('y') ) - - - # evaluate the derivative at x = 2 - print(diff_expr2.evaluate({'x': 2})) # prints 12 - - -# Doctor -# Person -# Patient diff --git a/cp/project2/__init__.py b/cp/project2/__init__.py deleted file mode 100644 index 890dc18eaf0fafeab3829fd71c6e5c41882a86cc..0000000000000000000000000000000000000000 --- a/cp/project2/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Dummy (test) project from 02465.""" diff --git a/cp/project2/project2_grade.py b/cp/project2/project2_grade.py deleted file mode 100644 index 0d83fe7594a1f80a61092ccc2f53175223d1ce38..0000000000000000000000000000000000000000 --- a/cp/project2/project2_grade.py +++ /dev/null @@ -1,4 +0,0 @@ -# cp/project2/project2_tests.py -''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. ''' -import bz2, base64 -exec(bz2.decompress(base64.b64decode('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'))) \ No newline at end of file diff --git a/cp/project2/project2_tests.py b/cp/project2/project2_tests.py deleted file mode 100644 index 09f4b83349cb25ef6725b3b51854c9b463df0890..0000000000000000000000000000000000000000 --- a/cp/project2/project2_tests.py +++ /dev/null @@ -1,206 +0,0 @@ -import string -from unitgrade import hide -from cp import minput -from unittest.mock import patch -import io -import unittest -from unitgrade import UTestCase, Report -import math - -class TestTheFunctionToBisect(UTestCase): - def test_f(self): - from cp.ex03.bisect import f - self.assertAlmostEqual(f(0), 0.1411200080598672) - self.assertAlmostEqual(f(1), 0.4871688735635369 ) - self.assertAlmostEqual(f(2), -0.9484917234010158) - self.assertAlmostEqual(f(math.pi), 0.6145000731172406 ) - self.assertAlmostEqual(f(-10), 0.244199939520782) - self.assertAlmostEqual(f(117), -0.9996260520700749) - - -class TestIsThereARoot(UTestCase): - - def test_root_exists(self): - from cp.ex03.bisect import is_there_a_root - self.assertTrue(is_there_a_root(1, 3)) # root exists between 0 and pi - - - - def test_no_root_exists(self): - from cp.ex03.bisect import is_there_a_root - self.assertFalse(is_there_a_root(3.2, 3.8)) # no root exists between 0 and 2pi - - - def test_root_not_found(self): - from cp.ex03.bisect import is_there_a_root - self.assertFalse(is_there_a_root(1, 3.5)) - - - -class TestBisect(UTestCase): - def test_base_case(self): - from cp.ex03.bisect import bisect - self.assertAlmostEqual(bisect(1, 3, 0.1), 1.8125) - self.assertAlmostEqual(bisect(1, 5.5, 0.1), 4.0234375) - - - - def test_tolerances(self): - from cp.ex03.bisect import bisect - self.assertAlmostEqual(bisect(2, 3.5, 10), 2.75) - self.assertAlmostEqual(bisect(2, 3.5, 0.1), 3.03125) - - - def test_no_solution(self): - from cp.ex03.bisect import bisect - self.assertTrue(math.isnan(bisect(1, 3.5, 1))) - - - -class HangmanIsGuessed(UTestCase): - def test_is_word_guessed(self): - from cp.ex04.hangman import is_word_guessed - self.assertTrue(is_word_guessed("dog", "tdohg")) - self.assertTrue(is_word_guessed("dog", "tdohg")) - self.assertFalse(is_word_guessed("dog", "")) - self.assertFalse(is_word_guessed("species", "sdcbwegk")) - self.assertTrue(is_word_guessed("species", "qseicps")) - - -class HangmanGuessedWord(UTestCase): - def test_get_guessed_word(self): - from cp.ex04.hangman import get_guessed_word - - self.assertEqual(get_guessed_word('cow', 'kcw'), 'c_ w') - self.assertEqual(get_guessed_word('apple', ''), '_ _ _ _ _ ') - self.assertEqual(get_guessed_word('tasks', 'ws'), '_ _ s_ s') - - - -class HangmanAvailableLetters(UTestCase): - def test_get_available_letters(self): - from cp.ex04.hangman import get_available_letters - - self.assertEqual(len(get_available_letters('')), 26) - self.assertEqual(set(get_available_letters('bcdew')), set(string.ascii_lowercase).difference('bcdew')) - - - - - -class Hangman(UTestCase): - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_hangman_startup(self, mock_stdout): - from cp.ex04.hangman import hangman - try: - with unittest.mock.patch('builtins.input', minput([None])): - hangman("cow", guesses=4) - except GeneratorExit as e: - pass - out = mock_stdout.getvalue() - lines = out.splitlines() - self.assertEqual(len(lines), 4, msg='You must print 4 lines') - self.assertEqual(lines[0], 'Hangman! To save Bob, you must guess a 3 letter word within 4 attempts.', msg='First printed line is wrong') - self.assertEqual(lines[1], '----', msg='Second printed line is wrong') - self.assertEqual(lines[2], 'You have 4 guesses left.', msg='Third printed line is wrong') - self.assertTrue("." in lines[3] and ":" in lines[3], msg="Your fourth line must have both a colon and a period") - - fp = lines[3].split(".")[0].split(":")[1].strip() - self.assertEqual(len(fp), 26, msg="The alphabet has 26 letters.") - self.assertEqual(set(fp), set(string.ascii_lowercase), msg="You failed to print the alphabet") - - - def chk_alphabet(self, line, missing): - self.assertTrue("." in line and ":" in line, msg="Your alphabet printout must have both a colon and a period") - fp = line.split(".")[0].split(":")[1].strip() - ab = set( [c for c in string.ascii_lowercase if c not in missing]) - self.assertEqual(len(fp), len(ab), msg="The alphabet printout has to few characters") - self.assertEqual(set(fp), ab, msg="You failed to print the alphabet") - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_hangman_correct(self, mock_stdout): - from cp.ex04.hangman import hangman - try: - with unittest.mock.patch('builtins.input', minput(['w', None])): - hangman("cow", guesses=4) - except GeneratorExit as e: - pass - out = mock_stdout.getvalue() - lines = out.splitlines() - self.assertEqual(len(lines), 8, msg='You must print 8 lines') - self.assertEqual(lines[-4], 'Good guess: _ _ w', msg='Format guessed word correctly') - self.assertEqual(lines[-3], '----') - self.assertEqual(lines[-2], 'You have 3 guesses left.', msg='Third printed line is wrong') - self.chk_alphabet(lines[-1], missing='w') - - - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_hangman_false(self, mock_stdout): - from cp.ex04.hangman import hangman - try: - with unittest.mock.patch('builtins.input', minput(['q', None])): - hangman("doggy", guesses=4) - except GeneratorExit as e: - pass - out = mock_stdout.getvalue() - lines = out.splitlines() - self.assertEqual(len(lines), 8, msg='You must print 8 lines') - self.assertEqual(lines[-4], 'Oh no: _ _ _ _ _ ', msg='Format guessed word correctly') - self.assertEqual(lines[-3], '----') - self.assertEqual(lines[-2], 'You have 3 guesses left.', msg='Third printed line is wrong') - self.chk_alphabet(lines[-1], missing='q') - - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_hangman_win(self, mock_stdout): - from cp.ex04.hangman import hangman - try: - with unittest.mock.patch('builtins.input', minput(['q', 'd', 'g', 'o', 'y', None])): - hangman("doggy", guesses=8) - except GeneratorExit as e: - pass - out = mock_stdout.getvalue() - lines = out.splitlines() - self.assertEqual(len(lines), 22, msg='You must print 22 lines') - self.assertTrue(lines[-1], 'Your score is 20') - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_hangman_loose(self, mock_stdout): - from cp.ex04.hangman import hangman - try: - with unittest.mock.patch('builtins.input', minput(['%'])): - hangman("cat", guesses=5) - except GeneratorExit as e: - pass - out = mock_stdout.getvalue() - lines = out.splitlines() - self.assertEqual(len(lines), 5, msg='You must print 5 lines') - self.assertTrue(lines[-1], 'Game over :-(. Your score is 0 points.') - - - - - - - -class Project2(Report): - title = "Project 2" - remote_url = "https://cp.pages.compute.dtu.dk/02002public/_static/evaluation/" - - abbreviate_questions = True - questions = [(TestTheFunctionToBisect, 5), - (TestIsThereARoot, 15), - (TestBisect, 15), - (HangmanIsGuessed, 10), - (HangmanGuessedWord, 10), - (HangmanAvailableLetters, 10), - (Hangman, 30), - ] - import cp - pack_imports = [cp] - - -if __name__ == "__main__": - from unitgrade import evaluate_report_student - evaluate_report_student(Project2()) diff --git a/cp/project2/unitgrade_data/Hangman.pkl b/cp/project2/unitgrade_data/Hangman.pkl deleted file mode 100644 index 7c0a2aa1ef22331f47cfeeb06af407e0b84aca66..0000000000000000000000000000000000000000 Binary files a/cp/project2/unitgrade_data/Hangman.pkl and /dev/null differ diff --git a/cp/project2/unitgrade_data/HangmanAvailableLetters.pkl b/cp/project2/unitgrade_data/HangmanAvailableLetters.pkl deleted file mode 100644 index fa31b59fc1eff2fbc72667f32b692d60eca9f915..0000000000000000000000000000000000000000 Binary files a/cp/project2/unitgrade_data/HangmanAvailableLetters.pkl and /dev/null differ diff --git a/cp/project2/unitgrade_data/HangmanGuessedWord.pkl b/cp/project2/unitgrade_data/HangmanGuessedWord.pkl deleted file mode 100644 index 408c6ccd45891bfbb376f594abe69e2310086e49..0000000000000000000000000000000000000000 Binary files a/cp/project2/unitgrade_data/HangmanGuessedWord.pkl and /dev/null differ diff --git a/cp/project2/unitgrade_data/HangmanIsGuessed.pkl b/cp/project2/unitgrade_data/HangmanIsGuessed.pkl deleted file mode 100644 index 0712521c86634a4d76443c14e248bc1201e4b1f0..0000000000000000000000000000000000000000 Binary files a/cp/project2/unitgrade_data/HangmanIsGuessed.pkl and /dev/null differ diff --git a/cp/project2/unitgrade_data/TestBisect.pkl b/cp/project2/unitgrade_data/TestBisect.pkl deleted file mode 100644 index 30154185053cbb5dda18eac4d4988fe1425e1cfe..0000000000000000000000000000000000000000 Binary files a/cp/project2/unitgrade_data/TestBisect.pkl and /dev/null differ diff --git a/cp/project2/unitgrade_data/TestIsThereARoot.pkl b/cp/project2/unitgrade_data/TestIsThereARoot.pkl deleted file mode 100644 index 9f20ed3ba4f6ff926db1fc296ba6a6f46bf0cb94..0000000000000000000000000000000000000000 Binary files a/cp/project2/unitgrade_data/TestIsThereARoot.pkl and /dev/null differ diff --git a/cp/project2/unitgrade_data/TestTheFunctionToBisect.pkl b/cp/project2/unitgrade_data/TestTheFunctionToBisect.pkl deleted file mode 100644 index b1f1e35852dc4fc42cd29f7dd519f7300b449e6f..0000000000000000000000000000000000000000 Binary files a/cp/project2/unitgrade_data/TestTheFunctionToBisect.pkl and /dev/null differ diff --git a/cp/project5/__init__.py b/cp/project5/__init__.py deleted file mode 100644 index 890dc18eaf0fafeab3829fd71c6e5c41882a86cc..0000000000000000000000000000000000000000 --- a/cp/project5/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Dummy (test) project from 02465.""" diff --git a/cp/project5/project5_grade.py b/cp/project5/project5_grade.py deleted file mode 100644 index ac118ab790f1e7dd5c90818096f85403424a13d4..0000000000000000000000000000000000000000 --- a/cp/project5/project5_grade.py +++ /dev/null @@ -1,4 +0,0 @@ -# cp/project5/project5_tests.py -''' WARNING: Modifying, decompiling or otherwise tampering with this script, it's data or the resulting .token file will be investigated as a cheating attempt. ''' -import bz2, base64 -exec(bz2.decompress(base64.b64decode('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'))) \ No newline at end of file diff --git a/cp/project5/project5_tests.py b/cp/project5/project5_tests.py deleted file mode 100644 index 43beb4cb7e345d4285a0d4eb075e4f3e8844c588..0000000000000000000000000000000000000000 --- a/cp/project5/project5_tests.py +++ /dev/null @@ -1,245 +0,0 @@ -from unitgrade import UTestCase, Report, hide -import math - -class TestSineCosineWeek9(UTestCase): - def test_make_symbol(self): - from cp.ex09.sinus import make_symbol, Variable - v = make_symbol('x') - self.assertIsInstance(v, Variable) - - - - def test_sine(self): - from cp.ex09.sinus import make_symbol, sine, Sin - v = make_symbol('x') - s = sine(v) - self.assertIsInstance(s, Sin) - self.assertEqual(s.arg, v) - - - - def test_cosine(self): - from cp.ex09.sinus import make_symbol, cosine, Cos - v = make_symbol('x') - c = cosine(v) - self.assertIsInstance(c, Cos) - self.assertEqual(c.arg, v) - - - def test_format_expression(self): - from cp.ex09.sinus import make_symbol, sine, cosine, format_expression - v = make_symbol('x') - s = sine(v) - c = cosine(v) - self.assertEqual(format_expression(v), 'x') - self.assertEqual(format_expression(s), 'sin(x)') - self.assertEqual(format_expression(c), 'cos(x)') - - # Test nested expressions - s2 = sine(c) - c2 = cosine(s) - self.assertEqual(format_expression(s2), 'sin(cos(x))') - self.assertEqual(format_expression(c2), 'cos(sin(x))') - - -class TestConstant(UTestCase): - - def test_inheritance(self): - from cp.ex10.symbolic import Constant, Expression - c = Constant(7) - self.assertIsInstance(c, Expression) - - - def test_print(self): - from cp.ex10.symbolic import Constant - self.assertEqual(str(Constant(7)), "7") - self.assertEqual(str(Constant(0)), "0") - self.assertEqual(str(Constant(3.14)), "3.14") - - - - def test_negative_print(self): - from cp.ex10.symbolic import Constant - self.assertEqual(str(Constant(-101)), "(-101)") - - - def test_evaluate(self): - from cp.ex10.symbolic import Constant - c = Constant(7) - self.assertEqual(c.evaluate({}), 7) - self.assertEqual(c.evaluate({"z": -10}), 7) - - - - def test_derivative(self): - from cp.ex10.symbolic import Constant - c = Constant(7) - d = c.differentiate("x") - self.assertIsInstance(d, Constant) - self.assertEqual(d.evaluate({}), 0) - - -class TestVariable(UTestCase): - def test_inheritance(self): - from cp.ex10.symbolic import Variable, Expression - self.assertIsInstance(Variable("x"), Expression) - - - def test_print(self): - from cp.ex10.symbolic import Variable - self.assertEqual(str(Variable("x")), "x") - - - def test_evaluate(self): - from cp.ex10.symbolic import Variable - c = Variable("x") - self.assertEqual(c.evaluate({"x": 7}), 7) - - - def test_derivative(self): - from cp.ex10.symbolic import Variable, Constant - c = Variable("x") - d = c.differentiate("x") - self.assertIsInstance(d, Constant) - self.assertEqual(str(d), "1") - - -class TestAddition(UTestCase): - def test_inheritance(self): - from cp.ex10.symbolic import Addition, Constant, BinaryOperator - self.assertIsInstance(Addition(Constant(1), Constant(2)), BinaryOperator) - - - def test_print(self): - from cp.ex10.symbolic import Addition, Variable - self.assertEqual(str(Addition(Variable("x"), Variable("y"))), "(x + y)") - - - def test_evaluate(self): - from cp.ex10.symbolic import Addition, Constant, Variable - c = Addition(Variable("x"), Constant(3)) - self.assertEqual(c.evaluate({"x": 7}), 10) - - - - def test_derivative(self): - from cp.ex10.symbolic import Addition, Constant, Variable - c = Addition(Variable("x"), Constant(3)) - d = c.differentiate("x") - self.assertEqual(str(d), "(1 + 0)") - self.assertEqual(d.evaluate({}), 1) - - - def test_derivative_nested(self): - from cp.ex10.symbolic import Addition, Constant, Variable - c = Addition(Variable("x"), Addition(Constant(3), Variable("x"))) - d = c.differentiate("x") - self.assertEqual(str(d), "(1 + (0 + 1))") - - -class TestMultiplication(UTestCase): - def test_print(self): - from cp.ex10.symbolic import Multiplication, Constant, Variable - self.assertEqual(str(Multiplication(Variable("x"), Constant(3))), "x * 3") - - - - def test_evaluate(self): - from cp.ex10.symbolic import Multiplication, Constant, Variable - self.assertEqual(Multiplication(Variable("x"), Constant(3)).evaluate({"x": 2}), 6) - - - def test_derivative(self): - from cp.ex10.symbolic import Multiplication, Constant, Variable - c = Multiplication(Variable("x"), Constant(3)) - d = c.differentiate("x") - self.assertEqual(str(d), "(1 * 3 + x * 0)") - self.assertEqual(d.evaluate({"x": 10}), 3) - - - - def test_derivative_nested(self): - from cp.ex10.symbolic import Multiplication, Constant, Variable, Addition - c = Multiplication(Variable("x"), Addition(Constant(3), Variable("x"))) - d = c.differentiate("x") - self.assertEqual(str(d), "(1 * (3 + x) + x * (0 + 1))") - - -class TestTrigonometricBasic(UTestCase): - def test_sin_print(self): - from cp.ex10.symbolic import Variable, Sin - sin = Sin(Variable("x")) - self.assertEqual(str(sin), "sin(x)") - - - def test_cos_print(self): - from cp.ex10.symbolic import Constant, Cos - cos = Cos(Constant(3)) - self.assertEqual(str(cos), "cos(3)") - - - - def test_sin_evaluate(self): - from cp.ex10.symbolic import Variable, Sin - sin = Sin(Variable("x")) - self.assertAlmostEqual(sin.evaluate({"x": 2}), math.sin(2)) - - - def test_cos_evaluate(self): - from cp.ex10.symbolic import Variable, Cos - self.assertAlmostEqual(Cos(Variable("x")).evaluate({"x": 2}), math.cos(2)) - - - -class TestEverything(UTestCase): - def test_everything(self): - from cp.ex10.symbolic import Variable, Cos, Multiplication, Sin, Addition, Constant - x = Variable("x") - y = Addition( Multiplication(Constant(3), Sin(x)), Cos(x)) - str(y) - self.assertEqual(str(y), '(3 * sin(x) + cos(x))') - self.assertAlmostEqual(y.evaluate({"x": math.pi/2}), 3) - self.assertEqual(str(y.differentiate("x")), '((0 * sin(x) + 3 * cos(x) * 1) + (-1) * sin(x) * 1)') - - -class TestTrigonometricDerivative(UTestCase): - def test_sin(self): - from cp.ex10.symbolic import Variable, Sin - x = Variable("x") - dx = Sin(x).differentiate("x") - self.assertEqual(str(dx), "cos(x) * 1") - - def test_cos(self): - from cp.ex10.symbolic import Variable, Cos - x = Variable("x") - dx = Cos(x).differentiate("x") - self.assertEqual(str(dx), "(-1) * sin(x) * 1") - - def test_sin_advanced(self): - from cp.ex10.symbolic import Variable, Cos, Constant, Multiplication, Addition - x = Variable("x") - dx = Multiplication(x, Cos(Addition(x, Constant(3)))).differentiate("x") - self.assertEqual(str(dx), "(1 * cos((x + 3)) + x * (-1) * sin((x + 3)) * (1 + 0))") - - -class Project5(Report): - title = "Project 5" - remote_url = "https://cp.pages.compute.dtu.dk/02002public/_static/evaluation/" - - abbreviate_questions = True - questions = [(TestSineCosineWeek9, 20), - (TestConstant, 10), - (TestVariable, 10), - (TestAddition, 10), - (TestMultiplication, 10), - (TestTrigonometricBasic, 10), - (TestTrigonometricDerivative, 10), - (TestEverything, 10), - ] - import cp - pack_imports = [cp] - - -if __name__ == "__main__": - from unitgrade import evaluate_report_student - evaluate_report_student(Project5()) diff --git a/cp/project5/unitgrade_data/TestAddition.pkl b/cp/project5/unitgrade_data/TestAddition.pkl deleted file mode 100644 index 9e3707656aaa2a6f9b0996675d8504b82f4a6a67..0000000000000000000000000000000000000000 Binary files a/cp/project5/unitgrade_data/TestAddition.pkl and /dev/null differ diff --git a/cp/project5/unitgrade_data/TestConstant.pkl b/cp/project5/unitgrade_data/TestConstant.pkl deleted file mode 100644 index cb53f02daa6dd6c3c24ba1ce8158b2c7f7026718..0000000000000000000000000000000000000000 Binary files a/cp/project5/unitgrade_data/TestConstant.pkl and /dev/null differ diff --git a/cp/project5/unitgrade_data/TestEverything.pkl b/cp/project5/unitgrade_data/TestEverything.pkl deleted file mode 100644 index 976c4f8418678bf19c9e80807fb14f9af191ef52..0000000000000000000000000000000000000000 Binary files a/cp/project5/unitgrade_data/TestEverything.pkl and /dev/null differ diff --git a/cp/project5/unitgrade_data/TestMultiplication.pkl b/cp/project5/unitgrade_data/TestMultiplication.pkl deleted file mode 100644 index 8577c45c28c87f9ecbdc9d8ed2898ecc811abf82..0000000000000000000000000000000000000000 Binary files a/cp/project5/unitgrade_data/TestMultiplication.pkl and /dev/null differ diff --git a/cp/project5/unitgrade_data/TestSineCosineWeek9.pkl b/cp/project5/unitgrade_data/TestSineCosineWeek9.pkl deleted file mode 100644 index a68d237a7c251442ee8da9569f9a482c12be9731..0000000000000000000000000000000000000000 Binary files a/cp/project5/unitgrade_data/TestSineCosineWeek9.pkl and /dev/null differ diff --git a/cp/project5/unitgrade_data/TestTrigonometricBasic.pkl b/cp/project5/unitgrade_data/TestTrigonometricBasic.pkl deleted file mode 100644 index 3eaa4dc30292e48070c2f24842e8f3998d950ddc..0000000000000000000000000000000000000000 Binary files a/cp/project5/unitgrade_data/TestTrigonometricBasic.pkl and /dev/null differ diff --git a/cp/project5/unitgrade_data/TestTrigonometricDerivative.pkl b/cp/project5/unitgrade_data/TestTrigonometricDerivative.pkl deleted file mode 100644 index 1265b9755a440d3bbf69f1b534bbaf0a336e54d7..0000000000000000000000000000000000000000 Binary files a/cp/project5/unitgrade_data/TestTrigonometricDerivative.pkl and /dev/null differ diff --git a/cp/project5/unitgrade_data/TestVariable.pkl b/cp/project5/unitgrade_data/TestVariable.pkl deleted file mode 100644 index 8a0361f3d755740626a98225c4dddc28e80c1d31..0000000000000000000000000000000000000000 Binary files a/cp/project5/unitgrade_data/TestVariable.pkl and /dev/null differ diff --git a/cp/tests/tests_week01.py b/cp/tests/tests_week01.py deleted file mode 100644 index cd7223101a1fe28bb7c5c5d34df7faa114e7b86b..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week01.py +++ /dev/null @@ -1,64 +0,0 @@ -from unitgrade import Report -import cp -from unitgrade import UTestCase -from cp.ex02.taylor import evaluate_taylor - -class Taylor(UTestCase): - def test_taylor_x1(self): - self.assertL2(evaluate_taylor(1)) - - def test_taylor_x3(self): - self.assertL2(evaluate_taylor(3)) - -class TaylorVariants(UTestCase): - - def test_taylor_variant_1(self): - from inspect import getmembers, isfunction - from cp.ex02 import taylor_variant1 - mm = getmembers(taylor_variant1, isfunction) - if len(mm) == 0: - raise Exception("You did not define a function in your code") - - name, taylor = mm[0] - - print("Running:") - print(f"{name}(x)") - self.assertL2(taylor(1.4)) - - def test_taylor_variant_2(self): - import inspect - from cp.ex02 import taylor_variant2 - - if hasattr(taylor_variant2, 'y'): - self.assertL2(taylor_variant2.y, 0.41666, tol=1e-4) - - source = inspect.getsource(taylor_variant2) - lines = source.splitlines() - for k, l in enumerate(lines): - if l.strip().replace(" ", "").startswith("x="): - lines[k] = "x = 9" - # y = None - s = "\n".join(lines) - # global y - # locals_ = locals() - ldict = {} - exec(s, globals(), ldict) - # print(y) - if 'y' not in ldict: - raise Exception("You failed to define y in your test") - else: - y = ldict['y'] - self.assertL2(y) - -class Week01Tests(Report): #240 total. - title = "Tests for week 01" - pack_imports = [cp] - individual_imports = [] - questions = [ - (Taylor, 10), - (TaylorVariants, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week01Tests()) diff --git a/cp/tests/tests_week02.py b/cp/tests/tests_week02.py deleted file mode 100644 index 4891fe8a40714fb43b45af19b96283104296c353..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week02.py +++ /dev/null @@ -1,43 +0,0 @@ -from unitgrade import Report -import cp -from unitgrade import UTestCase -from cp.ex02.taylor import evaluate_taylor -from cp.ex02.fibonacci import fibonacci_number - - -class Fibonacci(UTestCase): - def test_fibonacci_x0(self): - self.assertEqual(fibonacci_number(0), 0, msg="The start of the sequence is wrong -- remember that x_0 = 0!") - - def test_fibonacci_x1(self): - self.assertEqual(fibonacci_number(0), 0, msg="The start of the sequence is wrong -- remember that x_1 = 1!") - - def test_fibonacci_x2(self): - self.assertEqual(fibonacci_number(6), 8, msg="The first recursive step is not quite right -- remember that x_2 = x_1 + x_0") - - def test_fibonacci_x6(self): - self.assertEqual(fibonacci_number(6), 8, msg="There is a problem in your recursion. You did not compute x_6 correctly.") - - def test_fibonacci_x23(self): - # Test a large value. I cache the result so I don't have to enter it manually. - self.assertEqualC(fibonacci_number(23), 28657) - - def test_fibonacci_x_many(self): - # Caching works for arbitrary calls. This test all the values up to 20. - for k in range(20): - self.assertEqualC(fibonacci_number(k)) - - - - -class Week02Tests(Report): #240 total. - title = "Tests for week 02" - pack_imports = [cp] - individual_imports = [] - questions = [ - (Fibonacci, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week02Tests()) diff --git a/cp/tests/tests_week03.py b/cp/tests/tests_week03.py deleted file mode 100644 index 692daba5e3ad9f4a17b649c4444264f64c390b91..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week03.py +++ /dev/null @@ -1,181 +0,0 @@ -from unitgrade import UTestCase, Report -import unittest.mock -import io -import cp - -class Week03CompareNumbers(UTestCase): - def test_compare_numbers(self): - with self.capture() as c: - from cp.ex03.compare_numbers import compare_numbers - result = compare_numbers(5.,3.) - self.assertEqual(result, 'the first number is greater') - result = compare_numbers(2.,7.) - self.assertEqual(result, 'the second number is greater') - result = compare_numbers(4.,4.) - self.assertEqual(result, 'the numbers are equal') - -class Week03BodyTemperature(UTestCase): - def test_body_Temperature(self): - with self.capture() as c: - from cp.ex03.body_temperature import body_temperature - result = body_temperature(34.5) - self.assertEqual(result, 'Hypothermia') - result = body_temperature(36.9) - self.assertEqual(result, 'Normal') - result = body_temperature(37.2) - self.assertEqual(result, 'Slight fever') - result = body_temperature(38.5) - self.assertEqual(result, 'Fever') - result = body_temperature(40.1) - self.assertEqual(result, 'Hyperthermia') - - -class Week03HeartAttack(UTestCase): - def test_heart_attack(self): - with self.capture() as c: - from cp.ex03.heart_attack import heart_attack - result = heart_attack(30, 45, False) - self.assertEqual(result, "low") - result = heart_attack(60, 70, True) - self.assertEqual(result, "high") - result = heart_attack(17, 40, True) - self.assertEqual(result, "low") - -class Week03Ackermann(UTestCase): - def test_ackermann(self): - with self.capture() as c: - from cp.ex03.ackermann import ackermann - result = ackermann(3, 4) - self.assertEqual(result, 125) - result = ackermann(2, 5) - self.assertEqual(result, 13) - -class Week03Exponential(UTestCase): - def test_exponential(self): - with self.capture() as c: - from cp.ex03.exponential import exponential - result = exponential(3, 4) - self.assertEqual(result, 3**4) - result = exponential(2, 5) - self.assertEqual(result, 2**5) - result = exponential(4, -2) - self.assertEqual(result, 4**-2) - -class Week03BACCalculator(UTestCase): - def test_BAC_calculator(self): - with self.capture() as c: - from cp.ex03.bac_calculator import bac_calculator - result = bac_calculator(0.028, 80., "male", 2.) - self.assertEqual(result,0.02147058823529411) - result = bac_calculator(0.021, 70., "female", 2.) - self.assertEqual(result,0.020545454545454547) - -class AckermannTestCase(UTestCase): - def test_ackermann(self): - from cp.ex03.ackermann import ackermann - self.assertEqual(ackermann(0, 0), 1) - self.assertEqual(ackermann(0, 1), 2) - self.assertEqual(ackermann(1, 0), 2) - self.assertEqual(ackermann(1, 1), 3) - self.assertEqual(ackermann(1, 2), 4) - self.assertEqual(ackermann(2, 0), 3) - self.assertEqual(ackermann(2, 1), 5) - self.assertEqual(ackermann(2, 2), 7) - self.assertEqual(ackermann(3, 0), 5) - self.assertEqual(ackermann(3, 1), 13) - self.assertEqual(ackermann(3, 2), 29) - -class ExponentialTestCase(UTestCase): - def test_exponential_with_positive_power(self): - from cp.ex03.exponential import exponential - self.assertEqual(exponential(2, 0), 1.0) - self.assertEqual(exponential(2, 1), 2.0) - self.assertEqual(exponential(2, 2), 4.0) - self.assertEqual(exponential(3, 3), 27.0) - self.assertEqual(exponential(5, 4), 625.0) - - def test_exponential_with_negative_power(self): - from cp.ex03.exponential import exponential - self.assertEqual(exponential(2, -1), 0.5) - self.assertEqual(exponential(2, -2), 0.25) - self.assertAlmostEqual(exponential(3, -3), 0.037037037037) - self.assertAlmostEqual(exponential(5, -4), 5**(-4) ) - - def test_exponential_with_zero_power(self): - from cp.ex03.exponential import exponential - self.assertEqual(exponential(2, 0), 1.0) - self.assertEqual(exponential(3, 0), 1.0) - self.assertEqual(exponential(5, 0), 1.0) - - -class HeartAttackTests(UTestCase): - - def test_heart_attack_low(self): - from cp.ex03.heart_attack import heart_attack - self.assertEqual(heart_attack(25, 55, False), "low") - self.assertEqual(heart_attack(16, 45, False), "low") - self.assertEqual(heart_attack(30, 58, False), "low") - - def test_heart_attack_high(self): - from cp.ex03.heart_attack import heart_attack - self.assertEqual(heart_attack(45, 70, True), "high") - self.assertEqual(heart_attack(11, 70, True), "high") - -class SolarPanelTests(UTestCase): - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_maybe(self, mock_stdout): - from cp.ex03.solar_panel import solar_panel - solar_panel(True, False, False, False) - out = mock_stdout.getvalue() - self.assertEqual(out.strip().lower(), "maybe") - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_good_luck(self, mock_stdout): - from cp.ex03.solar_panel import solar_panel - solar_panel(True, False, True, True) - out = mock_stdout.getvalue() - self.assertEqual(out.strip().lower().splitlines(), ["haha", "good luck"]) - - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_probably_not1(self, mock_stdout): - from cp.ex03.solar_panel import solar_panel - solar_panel(True, True, False, False) - out = mock_stdout.getvalue() - self.assertEqual(out.strip().lower(), "probably not") - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_probably_not2(self, mock_stdout): - from cp.ex03.solar_panel import solar_panel - solar_panel(False, False, True, True) - out = mock_stdout.getvalue() - self.assertEqual(out.strip().lower(), "probably not") - - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_sure(self, mock_stdout): - from cp.ex03.solar_panel import solar_panel - solar_panel(False, False, False, False) - out = mock_stdout.getvalue() - self.assertEqual(out.strip().lower(), "sure") - - -class Week03Tests(Report): - title = "Tests for week 03" - version = 1.0 - url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" - pack_imports = [cp] - individual_imports = [] - questions = [ - (Week03CompareNumbers, 10), - (Week03BodyTemperature, 10), - (Week03BACCalculator, 10), - (AckermannTestCase, 10), - (ExponentialTestCase, 10), - (HeartAttackTests, 10), - (SolarPanelTests, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week03Tests()) diff --git a/cp/tests/tests_week04.py b/cp/tests/tests_week04.py deleted file mode 100644 index 9d5828195c63b93a6d515250e94938a02536aac9..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week04.py +++ /dev/null @@ -1,135 +0,0 @@ -from unitgrade import UTestCase, Report -import unittest -from unittest.mock import patch -import cp -import io - -class Palindrome(UTestCase): - def test_is_palindrome(self): - from cp.ex04.palindrome import is_palindrome - self.assertTrue(is_palindrome('madam')) - self.assertTrue(is_palindrome('kk')) - self.assertTrue(is_palindrome('m')) - self.assertFalse(is_palindrome('gentleman')) - self.assertFalse(is_palindrome('ma')) - - -class Bug(UTestCase): - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_nice_sign(self, mock_stdout): - from cp.ex04.bug import nice_sign - nice_sign('hello') - out = mock_stdout.getvalue() - - self.assertEqual(len(out.splitlines()), 3, msg="You did not print out 3 seperate lines") - l1 = out.splitlines()[0] - l2 = out.splitlines()[1] - l3 = out.splitlines()[2] - - self.assertEqual(l1, "---------") - self.assertEqual(l2, "| hello |") - self.assertEqual(l3, "---------") - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_last_bug(self,mock_stdout): - from cp.ex04.bug import last_bug - last_bug() - out = mock_stdout.getvalue() - - self.assertEqual(len( out.splitlines()), 3, msg="You did not print out 3 seperate lines") - l1 = out.splitlines()[0] - l2 = out.splitlines()[1] - l3 = out.splitlines()[2] - - self.assertEqual(l1, "------------------------------") - self.assertEqual(l2, "| I have written my last bug |") - self.assertEqual(l3, "------------------------------") - - -class Math(UTestCase): - def test_square_root(self): - from cp.ex04.mathematics import square_root - self.assertAlmostEqual(square_root(9), 3, places=3) - self.assertAlmostEqual(square_root(25), 5, places=3) - - def test_pi(self): - from cp.ex04.mathematics import ramanujan - self.assertAlmostEqual(ramanujan(), 3.1416, places=3) - - -class Parenthesis(UTestCase): - def test_matching(self): - from cp.ex04.parenthesis import matching - self.assertTrue(matching('3x(y+x)')) - self.assertTrue(matching('3x')) - self.assertTrue(matching('3x(y+(x-1))')) - self.assertTrue(matching('3(x-8)^2(y+(x-1))')) - self.assertFalse(matching('3x(y+x))')) - self.assertFalse(matching('(3x(y+x)')) - - def test_innermost(self): - from cp.ex04.parenthesis import find_innermost_part - self.assertEqual(find_innermost_part('(3+x)'), '3+x') - self.assertEqual(find_innermost_part('3+x'), '3+x') - self.assertEqual(find_innermost_part('3x((y+2)y+x)'), 'y+2') - self.assertEqual(find_innermost_part('3x((y+(1 - q^2)y+x)'), '1 - q^2') - - - def test_find_index_of_equality(self): - from cp.ex04.parenthesis import find_index_of_equality - self.assertEqual(find_index_of_equality("()"), 1) - self.assertEqual(find_index_of_equality("(()())"), 3) - self.assertEqual(find_index_of_equality("())"), 2) - self.assertEqual(find_index_of_equality("())((((("), 2) - # self.assertEqual(find_index_of_equality(""), 0) - self.assertEqual(find_index_of_equality(")(()())("), 4) - - -class Dialogue(UTestCase): - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_print_the_dialogue(self, mock_stdout): - from cp.ex04.parenthesis import print_the_dialogue - print_the_dialogue("He said: ''How are you doing?''") - out = mock_stdout.getvalue() - self.assertEqual(out.strip(), "How are you doing?") - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_print_the_dialogue_twolines(self, mock_stdout): - from cp.ex04.parenthesis import print_the_dialogue - print_the_dialogue("He: ''How are you doing?'' She: ''Still stuck on my 02002 programming problems''.") - out = mock_stdout.getvalue() - self.assertEqual(out.strip(), "How are you doing?\nStill stuck on my 02002 programming problems") - - -class Prefix(UTestCase): - def test_common_prefix(self): - from cp.ex04.prefix import common_prefix - self.assertEqual( common_prefix("cat", "cawabunga"), "ca") - self.assertEqual(common_prefix("caterpillar", "catapult"), "cat") - self.assertEqual(common_prefix("cat", "dog"), "") - - def test_common_prefix3(self): - from cp.ex04.prefix import common_prefix3 - self.assertEqual(common_prefix3("cat", "cawabunga", "catapult"), "ca") - self.assertEqual(common_prefix3("cawabunga", "cow", "catapult"), "c") - self.assertEqual(common_prefix3("selenium", "sealant", "sensei"), "se") - self.assertEqual(common_prefix3("selenium", "apple", "sensei"), "") - - -class Week04Tests(Report): - title = "Tests for week 04" - version = 1.0 - url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" - pack_imports = [cp] - questions = [ - (Math, 10), - (Palindrome, 10), - (Bug, 10), - (Parenthesis, 10), - (Dialogue, 10), - (Prefix, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week04Tests()) diff --git a/cp/tests/tests_week05.py b/cp/tests/tests_week05.py deleted file mode 100644 index ffdd72d54a8da166d7d8ef7d355f746fea130886..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week05.py +++ /dev/null @@ -1,134 +0,0 @@ -from unitgrade import Report -import cp -from unitgrade import UTestCase - -class Week05Primes(UTestCase): - def test_prime(self): - # Run and capture output - # from cp.unitgrade import say_hello - import numpy as np - - with self.capture() as c: - from cp.ex05 import primes - - prime_list = np.array([257,181,2503,4871,43,353,2753,3229,2621,3137,3121,877,293,47,997,3023,7,127,13,463,719,4273,307,3617,1597,2377,1433,3061,991,2437,4813,1609,2339,3343,3001,853,4493,1223]) - non_prime_list = prime_list*2 - - check = np.all([primes.is_prime(prime) for prime in prime_list]) - self.assertTrue(check) - check = np.all([not primes.is_prime(non_prime) for non_prime in non_prime_list]) - self.assertTrue(check) - - prime_list = primes.create_prime_list(2,101) - self.assertTrue(isinstance(prime_list,list)) - self.assertListEqual(prime_list,[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]) - - - -class Week05Indexing(UTestCase): - def __init__(self, *args, skip_remote_check=False, **kwargs): - super().__init__(*args, skip_remote_check=skip_remote_check, **kwargs) - self.lst_1 = [88, 26, 71, 56, 34, 93, 4, 53, 87, 97, 23, 18, 54, 48, 78, 40, 70, 89, 4, 59, 29, 82, 72, 64, 49, 33, 30, 50, 50, 50, 21] - self.lst_2 = [27, 87, 55, 25, 53, 90, 80, 68, 72, 79, 41, 72, 37, 91, 95, 48, 57, 78, 16, 80, 1, 96, 40, 80, 98, 73, 2, 45, 28, 75, 76] - - self.nested_lst_1 = [[88], [26], [71, 56, 34], [93, 4, 53, 87, 97], [23], [18, 54], [48, 78, 40, 70], [89, 4, 59, 29, 82, 72, 64, 49, 33, 30, 50, 50], [50], [21]] - self.nested_lst_2 = [[27, 87], [55, 25, 53, 90, 80, 68, 72, 79], [41], [72, 37, 91, 95, 48, 57, 78, 16, 80, 1, 96], [40, 80, 98], [73, 2], [45, 28, 75, 76]] - - def test_add_first_and_last(self): - # Run and capture output - # from cp.unitgrade import say_hello - - with self.capture() as c: - from cp.ex05 import indexing - - - answer = indexing.add_first_and_last(self.lst_1) - self.assertEqual(answer,88+21) - - answer = indexing.add_first_and_last(self.lst_2) - self.assertEqual(answer,27+76) - - def test_middle_element(self): - # Run and capture output - # from cp.unitgrade import say_hello - import numpy as np - - with self.capture() as c: - from cp.ex05 import indexing - - mid_el = indexing.middle_element(self.lst_1) - self.assertEqual(mid_el,40) - mid_el = indexing.middle_element(self.lst_2) - self.assertEqual(mid_el,48) - - - def test_slice_list_in_percent(self): - # Run and capture output - # from cp.unitgrade import say_hello - import numpy as np - - with self.capture() as c: - from cp.ex05 import indexing - - sub_list = indexing.slice_list_in_percent(self.lst_1,0.1,0.9) - self.assertListEqual(sub_list,[56, 34, 93, 4, 53, 87, 97, 23, 18, 54, 48, 78, 40, 70, 89, 4, 59, 29, 82, 72, 64, 49, 33, 30]) - sub_list = indexing.slice_list_in_percent(self.lst_2,0.45,0.55) - self.assertListEqual(sub_list,[91, 95, 48, 57]) - - - def test_get_longest_sublist(self): - # Run and capture output - # from cp.unitgrade import say_hello - import numpy as np - - with self.capture() as c: - from cp.ex05 import indexing - - sub_list = indexing.get_longest_sublist(self.nested_lst_1) - self.assertListEqual(sub_list,[89, 4, 59, 29, 82, 72, 64, 49, 33, 30, 50, 50]) - sub_list = indexing.get_longest_sublist(self.nested_lst_2) - self.assertListEqual(sub_list,[72, 37, 91, 95, 48, 57, 78, 16, 80, 1, 96]) - - -class Week05UpdatingLists(UTestCase): - def test_remove_at(self): - # Run and capture output - # from cp.unitgrade import say_hello - - with self.capture() as c: - from cp.ex05 import updating_lists - - in_list = ["one","two","three","four","five","six","seven","eight"] - out_list = updating_lists.remove_at(in_list,5) - self.assertListEqual(out_list,["one","two","three","four","five","seven","eight"]) - out_list = updating_lists.remove_at(out_list,0) - self.assertListEqual(out_list,["two","three","four","five","seven","eight"]) - - def remove_value(self): - # Run and capture output - # from cp.unitgrade import say_hello - - with self.capture() as c: - from cp.ex05 import updating_lists - - in_list = ["one","two","three","four","five","six","seven","eight"] - out_list = updating_lists.remove_value(in_list,5) - self.assertListEqual(out_list,in_list) - out_list = updating_lists.remove_value(in_list,"three") - self.assertListEqual(out_list,["one","two","four","five","six","seven","eight"]) - -class Week05Tests(Report): - title = "Tests for week 05" - version = 0.1 - url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" - pack_imports = [cp] - individual_imports = [] - questions = [ - (Week05Primes, 10), - (Week05Indexing, 10), - (Week05UpdatingLists, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week05Tests()) diff --git a/cp/tests/tests_week06.py b/cp/tests/tests_week06.py deleted file mode 100644 index 352acb59ba838fac324b9bcd7433ded30da1b97f..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week06.py +++ /dev/null @@ -1,27 +0,0 @@ -from unitgrade import Report -import cp -from unitgrade import UTestCase -from cp.ex02.taylor import evaluate_taylor - - -class HelloWorld2(UTestCase): - def test_say_hello(self): - from cp.ex00 import say_hello - evaluate_taylor(1) - self.assertEqual(0, 0) - - - -class Week06Tests(Report): #240 total. - title = "Tests for week 06" - version = 0.1 - url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" - pack_imports = [cp] - individual_imports = [] - questions = [ - (HelloWorld2, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week06Tests()) diff --git a/cp/tests/tests_week07.py b/cp/tests/tests_week07.py deleted file mode 100644 index 98c0223144298438fa85e4825e76c54cb797f4a5..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week07.py +++ /dev/null @@ -1,26 +0,0 @@ -from unitgrade import Report -import cp -from unitgrade import UTestCase -from cp.ex02.taylor import evaluate_taylor - -class HelloWorld2(UTestCase): - def test_say_hello(self): - from cp.ex00 import say_hello - evaluate_taylor(1) - self.assertEqual(0,0) - - - -class Week07Tests(Report): #240 total. - title = "Tests for week 07" - version = 0.1 - url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" - pack_imports = [cp] - individual_imports = [] - questions = [ - (HelloWorld2, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week07Tests()) diff --git a/cp/tests/tests_week08.py b/cp/tests/tests_week08.py deleted file mode 100644 index 74f09515f49166d4e304e2b2f3cdfd2490799428..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week08.py +++ /dev/null @@ -1,25 +0,0 @@ -from unitgrade import Report -import cp -from unitgrade import UTestCase -from cp.ex02.taylor import evaluate_taylor -from cp.ex02.fibonacci import fibonacci_number - -class HelloWorld2(UTestCase): - def test_say_hello(self): - from cp.ex00 import say_hello - evaluate_taylor(1) - self.assertEqual(0,0) - - -class Week08Tests(Report): - title = "Tests for week 08" - version = 0.1 - url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" - pack_imports = [cp] - individual_imports = [] - questions = [(HelloWorld2, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week08Tests()) diff --git a/cp/tests/tests_week09.py b/cp/tests/tests_week09.py deleted file mode 100644 index 5155e70f0a0146bd6c92363845931fac8cb23d02..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week09.py +++ /dev/null @@ -1,278 +0,0 @@ -from unitgrade import Report, UTestCase -import unittest -from unittest.mock import patch -import cp -import io - -class TestRectangleArea(UTestCase): - def test_area(self): - from cp.ex09.rectangle import area, Rectangle - r = Rectangle() - r.width = 10 - r.height = 4 - self.assertEqual(area(r), 40) - -class TestMakeARectangle(UTestCase): - def test_make_a_rectangle(self): - - from cp.ex09.rectangle import make_a_rectangle, Rectangle, Point - - rectangle = make_a_rectangle(0, 0, 4, 5) - self.assertIsInstance(rectangle, Rectangle) - - rectangle = make_a_rectangle(9, 2, 3, 7) - self.assertIsInstance(rectangle, Rectangle) - self.assertIsInstance(rectangle.corner, Point) - self.assertEqual(rectangle.corner.x, 9) - self.assertEqual(rectangle.corner.y, 2) - self.assertEqual(rectangle.width, 3) - self.assertEqual(rectangle.height, 7) - - def test_rectangle(self): - - from cp.ex09.rectangle import make_a_rectangle, Rectangle, Point, area - rectangle = make_a_rectangle(5, 3, 1, 1) - self.assertEqual(area(rectangle), 1) - rectangle = make_a_rectangle(0, 0, 20, 10) - self.assertEqual(area(rectangle), 200) - - -class TestSplitRectangle(UTestCase): - def setUp(self): - from cp.ex09.rectangle import make_a_rectangle - self.rectangle = make_a_rectangle(0, 0, 4, 6) - - def test_split_horizontally(self): - from cp.ex09.rectangle import split_rectangle - split = split_rectangle(self.rectangle, True) - self.assertEqual(len(split), 2) - - left_rectangle = split[0] - right_rectangle = split[1] - - self.assertEqual(left_rectangle.width, 2) - self.assertEqual(left_rectangle.height, 6) - - self.assertEqual(right_rectangle.width, 2) - self.assertEqual(right_rectangle.height, 6) - - def test_split_vertically(self): - from cp.ex09.rectangle import split_rectangle - split = split_rectangle(self.rectangle, False) - self.assertEqual(len(split), 2) - - top_rectangle = split[0] - bottom_rectangle = split[1] - - self.assertEqual(top_rectangle.width, 4) - self.assertEqual(top_rectangle.height, 3) - - self.assertEqual(bottom_rectangle.width, 4) - self.assertEqual(bottom_rectangle.height, 3) - - -class TestRectangleInception(UTestCase): - def test_inception_areas(self): - from cp.ex09.rectangle import make_a_rectangle, rectangle_inception, area - - r = make_a_rectangle(2, 4, 12, 16) - rs = rectangle_inception(r, 4) - areas = [area(r_) for r_ in rs] - self.assertEqual(len(areas), 5) - self.assertEqual(areas, [96.0, 48.0, 24.0, 12.0, 12.0]) - - def test_inception_location(self): - from cp.ex09.rectangle import make_a_rectangle, Rectangle, rectangle_inception - rs = rectangle_inception(make_a_rectangle(2, 4, 12, 16), 4) - r = rs[-1] - self.assertIsInstance(r, Rectangle) - self.assertEqual(r.corner.x, 11) - self.assertEqual(r.corner.y, 16) - self.assertEqual(r.width, 3) - self.assertEqual(r.height, 4) - -class TestMakeVector(UTestCase): - def test_make_vector(self): - from cp.ex09.vector import Vector, make_vector - - v1 = make_vector(2,3) - self.assertIsInstance(v1, Vector, msg="Must return a Vector instance.") - self.assertEqual(v1.x, 2) - self.assertEqual(v1.y, 3) - - @unittest.mock.patch('sys.stdout', new_callable=io.StringIO) - def test_print_vector(self, mock_stdout): - from cp.ex09.vector import make_vector, print_vector - - v1 = make_vector(2, 3) - print_vector(v1) - out = mock_stdout.getvalue().strip() - self.assertEqual(out, "(2, 3)") - -class TestVectorOperations(UTestCase): - def test_dot_product(self): - from cp.ex09.vector import make_vector, dot - v1 = make_vector(2,3) - v2 = make_vector(4,5) - self.assertEqual(dot(v1, v2), 23) - - def test_scale(self): - from cp.ex09.vector import make_vector, scale - v = make_vector(2,3) - s = 2 - v_scaled = scale(s, v) - self.assertEqual(v_scaled.x, 4) - self.assertEqual(v_scaled.y, 6) - - def test_add(self): - from cp.ex09.vector import make_vector, add - v1 = make_vector(2,3) - v2 = make_vector(4,5) - v_sum = add(v1, v2) - self.assertEqual(v_sum.x, 6) - self.assertEqual(v_sum.y, 8) - - def test_subtract(self): - from cp.ex09.vector import make_vector, sub - v1 = make_vector(2,3) - v2 = make_vector(4,5) - v_sub = sub(v1, v2) - self.assertEqual(v_sub.x, -2) - self.assertEqual(v_sub.y, -2) - - def test_hat(self): - from cp.ex09.vector import make_vector, hat - v = make_vector(2,3) - v_hat = hat(v) - self.assertEqual(v_hat.x, -3) - self.assertEqual(v_hat.y, 2) - - -class TestLineSegmentMethods(UTestCase): - def test_make_line_segment(self): - from cp.ex09.vector import make_vector, make_line_segment, LineSegment - p = make_vector(1, 2) - q = make_vector(3, 4) - l = make_line_segment(p, q) - self.assertIsInstance(l, LineSegment) - - - def test_point_on_line(self): - from cp.ex09.vector import make_vector, make_line_segment, Vector, point_on_line - p = make_vector(1, 2) - q = make_vector(3, 4) - l = make_line_segment(p, q) - self.assertIsInstance(point_on_line(l, 0), Vector) - self.assertEqual(point_on_line(l, 0).x, p.x) - self.assertEqual(point_on_line(l, 0).y, p.y) - - self.assertEqual(point_on_line(l, 1).x, q.x) - self.assertEqual(point_on_line(l, 1).y, q.y) - - def test_point_on_line_midpoint(self): - from cp.ex09.vector import make_vector, make_line_segment, point_on_line - p = make_vector(1, 2) - q = make_vector(3, 4) - l = make_line_segment(p, q) - self.assertEqual(point_on_line(l, .5).x, (p.x+q.x)/2) - self.assertEqual(point_on_line(l, .5).y, (p.y+q.y)/2) - -class SquareWithLocationTests(UTestCase): - def test_make_square(self): - from cp.ex09.vector import SquareWithPosition, make_square_with_position - sq = make_square_with_position(1, 2, 3) - self.assertIsInstance(sq, SquareWithPosition) - - def test_square_to_lines(self): - from cp.ex09.vector import make_square_with_position, square_to_lines, LineSegment, point_on_line - sq = make_square_with_position(1, 2, 3) - lines = square_to_lines(sq) - self.assertIsInstance(lines, list, msg="Must return a list") - self.assertEqual(len(lines), 4, msg="Must return 4 lines") - for l in lines: - self.assertIsInstance(l, LineSegment, msg="Must return 4 line segments") - tpl = lambda v: (v.x, v.y) - lmd = lambda l: tuple( set( (tpl(point_on_line(l, 0) ), tpl(point_on_line(l, 1) )) ) ) - l2 = list( set( [lmd(l) for l in lines] ) ) - self.assertEqual(l2[0], ((4,5), (1, 5)), msg="Problem with first line. It should connect points (4,5) -- (1, 5)") - self.assertEqual(l2[1], ((1, 2), (4, 2))) - self.assertEqual(l2[2], ((1, 2), (1, 5))) - self.assertEqual(l2[3], ((4, 5), (4, 2))) - -class TestIntersection(UTestCase): - def test_do_they_intersect(self): - from cp.ex09.vector import make_vector, make_line_segment, do_they_intersect - l1 = make_line_segment(make_vector(1, 1), make_vector(4, 1)) - l2 = make_line_segment(make_vector(2, -2), make_vector(2, 3)) - - self.assertTrue( do_they_intersect(l1, l2), msg="These lines should intersect") - self.assertTrue( do_they_intersect(l2, l1), msg="Reverse order; lines should still intersect") - - l3 = make_line_segment(make_vector(2, -2), make_vector(-1, 3)) - - self.assertFalse(do_they_intersect(l1, l3), msg="These lines should not intersect") - self.assertFalse(do_they_intersect(l3, l1), msg="Reverse order; lines should still not intersect") - - def test_intersect(self): - from cp.ex09.vector import make_vector, make_line_segment, intersect - l1 = make_line_segment(make_vector(1, 1), make_vector(4, 1)) - l2 = make_line_segment(make_vector(2, -2), make_vector(2, 3)) - isect = intersect(l1, l2) - self.assertAlmostEqual(isect.x,2) - self.assertAlmostEqual(isect.y, 1) - -class GetAllIntersections(UTestCase): - def test_get_intersections_none(self): - from cp.ex09.vector import make_line_segment - from cp.ex09.vector import make_vector, make_square_with_position, get_intersections - sq = make_square_with_position(1, 1, 6) - l = make_line_segment(make_vector(-1, 2), make_vector(0, 0.5)) - intersections = get_intersections(sq, l) - self.assertIsInstance(intersections, list) - self.assertEqual(len(intersections), 0) - - def test_get_intersections_one(self): - from cp.ex09.vector import make_vector, make_square_with_position, get_intersections, make_line_segment - sq = make_square_with_position(1, 1, 6) - l = make_line_segment(make_vector(-1, 2), make_vector(4, 3)) - intersections = get_intersections(sq, l) - self.assertEqual(len(intersections), 1) - self.assertAlmostEqual(intersections[0].x, 1) - self.assertAlmostEqual(intersections[0].y, 2.4) - - def test_get_intersections_two(self): - from cp.ex09.vector import make_line_segment, make_vector, make_square_with_position, get_intersections - sq = make_square_with_position(1, 1, 6) - l = make_line_segment(make_vector(-1, 2), make_vector(9, 4)) - ls = get_intersections(sq, l) - self.assertEqual(len(ls), 2) - ls = list(set([(ls[0].x, ls[0].y), (ls[1].x, ls[1].y)])) - - self.assertAlmostEqual(ls[0][0], 1, msg="testing x-coordinate of first point") - self.assertAlmostEqual(ls[0][1], 2.4, msg="testing y-coordinate of first point") - - self.assertAlmostEqual(ls[1][0], 7, msg="testing x-coordinate of second point") - self.assertAlmostEqual(ls[1][1], 3.6, msg="testing y-coordinate of second point") - -class Week09Tests(Report): - title = "Tests for week 09" - version = 1.0 - url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" - pack_imports = [cp] - individual_imports = [] - questions = [ - (TestRectangleArea, 10), - (TestMakeARectangle, 10), - (TestSplitRectangle,10), - (TestRectangleInception, 10), - (TestMakeVector, 10), - (TestVectorOperations, 10), - (TestLineSegmentMethods, 10), - (TestIntersection, 10), - (GetAllIntersections, 10), - ] - - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week09Tests()) diff --git a/cp/tests/tests_week10.py b/cp/tests/tests_week10.py deleted file mode 100644 index cdc9f6cfb5521c4fbd8c6a9216bef7ede30b64db..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week10.py +++ /dev/null @@ -1,79 +0,0 @@ -from unitgrade import UTestCase, Report -import cp - -class TestPerson(UTestCase): - def test_init(self): - from cp.ex10.hospital import Person - self.assertRaises(ValueError, Person, "John Doe", 35, "z") - - def test_str(self): - from cp.ex10.hospital import Person - person = Person("John Doe", 35, "m") - self.assertEqual(str(person), "John Doe, 35m") - -class TestPatient(UTestCase): - # Test Patient class - def test_init(self): - from cp.ex10.hospital import Person, Patient - patient = Patient("John Doe", 35, "m", "headache") - self.assertIsInstance(patient, Person, msg="Patient should inherit from Person") - self.assertRaises(ValueError, Patient, "John Doe", 35, "headache", "male") - - - def test_can_be_treated(self): - from cp.ex10.hospital import Patient - patient = Patient("John Doe", 35, "m", "headache") - self.assertTrue(patient.can_be_treated()) - patient = Patient("John Doe", 35, "m", "unknown illness") - self.assertFalse(patient.can_be_treated()) - - def test_str(self): - from cp.ex10.hospital import Patient - patient = Patient("John Doe", 35, "m", "headache") - self.assertEqual(str(patient), "John Doe, 35m: headache") - -class TestDoctor(UTestCase): - # Test Doctor class - def test_init(self): - from cp.ex10.hospital import Person, Doctor, Patient - doctor = Doctor("Dr. Smith", 45, "f", "head") - self.assertIsInstance(doctor, Person, msg="Doctor should inherit from Person") - self.assertNotIsInstance(doctor, Patient, msg="Doctor should not inherit from Patient") - self.assertRaises(ValueError, Doctor, "John Doe", 35, "feet", "female") - - def test_str(self): - from cp.ex10.hospital import Doctor - doctor = Doctor("Dr. Smith", 45, "f", "head") - self.assertEqual(str(doctor), "Dr. Smith, 45f. Specialization: head") - - def test_can_doctor_treat(self): - from cp.ex10.hospital import Doctor, Patient - doctor = Doctor("Dr. Smith", 45, "f", "head") - patient = Patient("John Doe", 35, "m", "headache") - self.assertTrue(doctor.can_doctor_treat(patient)) - patient = Patient("John Doe", 35, "m", "stepped on lego") - self.assertFalse(doctor.can_doctor_treat(patient)) - - def test_treatment_cost(self): - from cp.ex10.hospital import Doctor, Patient - doctor = Doctor("Dr. Smith", 45, "f", "head") - patient = Patient("John Doe", 35, "m", "headache") - self.assertEqual(doctor.treatment_cost(patient), 100) - patient = Patient("John Doe", 35, "m", "toothache") - self.assertEqual(doctor.treatment_cost(patient), 200) - -class Week10Tests(Report): - title = "Tests for week 10" - version = 1.0 - url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" - pack_imports = [cp] - individual_imports = [] - questions = [ - (TestPerson, 10), - (TestDoctor, 10), - (TestPatient, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week10Tests()) diff --git a/cp/tests/tests_week11.py b/cp/tests/tests_week11.py deleted file mode 100644 index 6b86b942b3ddbe6080159612f50919e499fe18c0..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week11.py +++ /dev/null @@ -1,84 +0,0 @@ -from unitgrade import Report -import cp -from unitgrade import UTestCase - -class Week11DotProducta(UTestCase): - def test_dot_product_a(self): - with self.capture() as c: - from cp.ex11.dot_product import dot_product_a - result = dot_product_a([1,2,3,4,5],[3,4,5,6,7]) - self.assertEqual(result, 85.) - result = dot_product_a([2,3,7,8,1,12,5,2,9],[8,4,3,4,5,6,7,17,2]) - self.assertEqual(result, 245.) - -import numpy as np -class Week11DotProductb(UTestCase): - def test_dot_product_b(self): - with self.capture() as c: - from cp.ex11.dot_product import dot_product_b - result = dot_product_b(np.array([1,2,3,4,5]),np.array([3,4,5,6,7])) - self.assertEqual(result, 85.) - result = dot_product_b(np.array([2,3,7,8,1,12,5,2,9]),np.array([8,4,3,4,5,6,7, 17,2])) - self.assertEqual(result, 245.) - -import numpy as np -class Week11BMICalc(UTestCase): - def test_calc_bmi(self): - with self.capture() as c: - from cp.ex11.BMI_analysis import calc_bmi - data = np.array([[1, 1.65, 63.4], - [2, 1.70, 87.1], - [3, 1.82, 93.7], - [4, 1.62, 105], - [5, 1.97, 61.3], - [6, 1.62, 78], - [7, 1.73, 99.6], - [8, 1.77, 81], - [9, 1.77, 110.7], - [10, 1.60, 55.2]]) - - result = calc_bmi(data) - - expected_result = np.array([[1.0, 1.65, 63.4, 23.29, 'Normal weight'], - [2.0, 1.70, 87.1, 30.14, 'Obese'], - [3.0, 1.82, 93.7, 28.29, 'Overweight'], - [4.0, 1.62, 105.0, 40.01, 'Obese'], - [5.0, 1.97, 61.3, 15.8, 'Underweight'], - [6.0, 1.62, 78.0, 29.72, 'Overweight'], - [7.0, 1.73, 99.6, 33.28, 'Obese'], - [8.0, 1.77, 81.0, 25.85, 'Overweight'], - [9.0, 1.77, 110.7, 35.33, 'Obese'], - [10.0, 1.60, 55.2, 21.56, 'Normal weight']]) - - # Check each element of the arrays individually - for i in range(len(result)): - for j in range(len(result[i])): - self.assertEqual(result[i][j], expected_result[i][j]) - -class Week11StableMeasurements(UTestCase): - def test_stable_measurements(self): - with self.capture() as c: - from cp.ex11.Stable_measurements import stable_measurements - result = stable_measurements(np.array([4.3, 5.7, 5.1, 6.4, 7.9, 12.8])) - self.assertEqual(result.tolist(), [6.4, 7.9, 12.8]) - result = stable_measurements(np.array([4.3, 5.7, 5.1, 8, 7.9, 12.8])) - self.assertEqual(result.tolist(),[]) - result = stable_measurements(np.array([8, 7.9, 12.8, 14, 17.5, 18.1])) - self.assertEqual(result.tolist(),[12.8, 14, 17.5, 18.1]) - -class Week11Tests(Report): #30 total. - title = "Tests for week 11" - version = 0.1 - url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" - pack_imports = [cp] - individual_imports = [] - questions = [ - (Week11DotProducta, 10), - (Week11DotProductb, 10), - (Week11BMICalc, 10), - (Week11StableMeasurements, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week11Tests()) diff --git a/cp/tests/tests_week12.py b/cp/tests/tests_week12.py deleted file mode 100644 index 5357aa65391c0c76ba142719eae4f0f0cb30783a..0000000000000000000000000000000000000000 --- a/cp/tests/tests_week12.py +++ /dev/null @@ -1,24 +0,0 @@ -from unitgrade import Report -import cp -from unitgrade import UTestCase -from cp.ex02.taylor import evaluate_taylor - -class HelloWorld(UTestCase): - def test_say_hello(self): - from cp.ex00 import say_hello - evaluate_taylor(2) - self.assertEqual(0,0) - -class Week12Tests(Report): #240 total. - title = "Tests for week 12" - version = 0.1 - url = "https://gitlab.compute.dtu.dk/cp/02002students/-/blob/master/cp/tests" - pack_imports = [cp] - individual_imports = [] - questions = [ - (HelloWorld, 10), - ] - -if __name__ == '__main__': - from unitgrade import evaluate_report_student - evaluate_report_student(Week12Tests()) diff --git a/cp/tests/unitgrade_data/AckermannTestCase.pkl b/cp/tests/unitgrade_data/AckermannTestCase.pkl deleted file mode 100644 index 910f7cc2de020ee6fd29eb0623bfcfe5565a4f60..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/AckermannTestCase.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Bug.pkl b/cp/tests/unitgrade_data/Bug.pkl deleted file mode 100644 index 8a17b702d53fc1b20528681d8864c81ab40a0228..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Bug.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Dialogue.pkl b/cp/tests/unitgrade_data/Dialogue.pkl deleted file mode 100644 index a6a3ede1bcafe5d6ff8ac978a7f564fc2d89dde1..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Dialogue.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/ExponentialTestCase.pkl b/cp/tests/unitgrade_data/ExponentialTestCase.pkl deleted file mode 100644 index 97ea821838ab5a5d81f01bd8c38f191421e3d500..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/ExponentialTestCase.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Fibonacci.pkl b/cp/tests/unitgrade_data/Fibonacci.pkl deleted file mode 100644 index 3264c8b9ec61d856fe4733c20c5520fafcb42d0b..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Fibonacci.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/GetAllIntersections.pkl b/cp/tests/unitgrade_data/GetAllIntersections.pkl deleted file mode 100644 index 63dca50f5edd66e0cfa4ccedcfe561b4ee77e8ce..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/GetAllIntersections.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/HeartAttackTests.pkl b/cp/tests/unitgrade_data/HeartAttackTests.pkl deleted file mode 100644 index d1c1fe967ffe3a758baa25d4b8a8331c9eb747b0..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/HeartAttackTests.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/HelloWorld.pkl b/cp/tests/unitgrade_data/HelloWorld.pkl deleted file mode 100644 index 7468017d026bfc3611371e29cfd3f261a7ff7e60..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/HelloWorld.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/HelloWorld2.pkl b/cp/tests/unitgrade_data/HelloWorld2.pkl deleted file mode 100644 index 7a6c14e65ac4ca5174c2f4da822bf4d435d0547f..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/HelloWorld2.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Math.pkl b/cp/tests/unitgrade_data/Math.pkl deleted file mode 100644 index 2b011897a8ddbd5a2d938b1fe691b70dd8da2c14..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Math.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Palindrome.pkl b/cp/tests/unitgrade_data/Palindrome.pkl deleted file mode 100644 index 2c574525ad14c369ea638eba3476716ba98bfb31..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Palindrome.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Parenthesis.pkl b/cp/tests/unitgrade_data/Parenthesis.pkl deleted file mode 100644 index d7534eb6d2aeaba77e449509bb44a05f66abe933..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Parenthesis.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Prefix.pkl b/cp/tests/unitgrade_data/Prefix.pkl deleted file mode 100644 index 3ba120b24d7e34733356326e298da9a31086feb4..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Prefix.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/SayHelloWorld.pkl b/cp/tests/unitgrade_data/SayHelloWorld.pkl deleted file mode 100644 index 8ac3059c3b0e6890f87831faa86fbe70077821e1..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/SayHelloWorld.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/SolarPanelTests.pkl b/cp/tests/unitgrade_data/SolarPanelTests.pkl deleted file mode 100644 index 670de247d6c5fdf88e037bfd4efb5f735cab8adb..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/SolarPanelTests.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Taylor.pkl b/cp/tests/unitgrade_data/Taylor.pkl deleted file mode 100644 index 8b70f18e571912d24cc12438ab05c8fb26380936..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Taylor.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TaylorVariants.pkl b/cp/tests/unitgrade_data/TaylorVariants.pkl deleted file mode 100644 index ab4f3e20529d3af01f442f59790d42f3220c1916..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TaylorVariants.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestDoctor.pkl b/cp/tests/unitgrade_data/TestDoctor.pkl deleted file mode 100644 index 5e134ac0f7cab8914ec5e2e6f123c01b892586a3..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestDoctor.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestIntersection.pkl b/cp/tests/unitgrade_data/TestIntersection.pkl deleted file mode 100644 index 48440b2efea173d9e4e311568a6c6e23d59f47fa..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestIntersection.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestLineSegmentMethods.pkl b/cp/tests/unitgrade_data/TestLineSegmentMethods.pkl deleted file mode 100644 index 1c8915c79bcf2a4392e53329a8d887f8dfb9409e..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestLineSegmentMethods.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestMakeARectangle.pkl b/cp/tests/unitgrade_data/TestMakeARectangle.pkl deleted file mode 100644 index 5ce5246ce230dbadc67860780456420f0519bcb6..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestMakeARectangle.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestMakeVector.pkl b/cp/tests/unitgrade_data/TestMakeVector.pkl deleted file mode 100644 index 9456269dbea6ac5b6d1179b785b68aa865fe5727..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestMakeVector.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestPatient.pkl b/cp/tests/unitgrade_data/TestPatient.pkl deleted file mode 100644 index 98e8e06d8cc3e4ef30ce68022586e8342f3c3deb..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestPatient.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestPerson.pkl b/cp/tests/unitgrade_data/TestPerson.pkl deleted file mode 100644 index e3f2ede64d31e312dc1f5aebab255889c386b854..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestPerson.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestRectangleArea.pkl b/cp/tests/unitgrade_data/TestRectangleArea.pkl deleted file mode 100644 index 3be1f347e6ee80000a49e85093ba4d3efbf22f11..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestRectangleArea.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestRectangleInception.pkl b/cp/tests/unitgrade_data/TestRectangleInception.pkl deleted file mode 100644 index be08539bfdeacf266af3c6bfc54582ec46a074c0..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestRectangleInception.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestSplitRectangle.pkl b/cp/tests/unitgrade_data/TestSplitRectangle.pkl deleted file mode 100644 index 1704cb1a03d0cbda77ef206a0ff9318b9f75f152..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestSplitRectangle.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/TestVectorOperations.pkl b/cp/tests/unitgrade_data/TestVectorOperations.pkl deleted file mode 100644 index 2f8b9c9f8f91eacee4a9abd39522e98dbd6c41b4..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/TestVectorOperations.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Week03BACCalculator.pkl b/cp/tests/unitgrade_data/Week03BACCalculator.pkl deleted file mode 100644 index 1227cd89e7027b3667dc58fc8f28e0e1d696e43b..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Week03BACCalculator.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Week03BodyTemperature.pkl b/cp/tests/unitgrade_data/Week03BodyTemperature.pkl deleted file mode 100644 index 8a1b312d58841dee2207ce09baf674c1da488050..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Week03BodyTemperature.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Week03CompareNumbers.pkl b/cp/tests/unitgrade_data/Week03CompareNumbers.pkl deleted file mode 100644 index 2cd1319bf671d915fa5d6babc508fab859122eac..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Week03CompareNumbers.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Week05Indexing.pkl b/cp/tests/unitgrade_data/Week05Indexing.pkl deleted file mode 100644 index 855a64ccaf4f790a2c229521e6d400e9c2103d75..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Week05Indexing.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Week05Primes.pkl b/cp/tests/unitgrade_data/Week05Primes.pkl deleted file mode 100644 index b448dc2769dd02ef287fa7206b46f285eb1aa16a..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Week05Primes.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Week05UpdatingLists.pkl b/cp/tests/unitgrade_data/Week05UpdatingLists.pkl deleted file mode 100644 index 769074bad5f4f725a472dc0af0c16882184d882c..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Week05UpdatingLists.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Week11BMICalc.pkl b/cp/tests/unitgrade_data/Week11BMICalc.pkl deleted file mode 100644 index 74b935c405b09efb235eb42fd9eb0ee850b18663..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Week11BMICalc.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Week11DotProducta.pkl b/cp/tests/unitgrade_data/Week11DotProducta.pkl deleted file mode 100644 index a31288fe9438187fea86de10d69ab141a5e40144..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Week11DotProducta.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Week11DotProductb.pkl b/cp/tests/unitgrade_data/Week11DotProductb.pkl deleted file mode 100644 index fa6c7fb56d3b07e6a8007170121ac2d8eb8effa6..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Week11DotProductb.pkl and /dev/null differ diff --git a/cp/tests/unitgrade_data/Week11StableMeasurements.pkl b/cp/tests/unitgrade_data/Week11StableMeasurements.pkl deleted file mode 100644 index cd5ba44b1709325e68f60062a9109c1acb21dfef..0000000000000000000000000000000000000000 Binary files a/cp/tests/unitgrade_data/Week11StableMeasurements.pkl and /dev/null differ