diff --git a/aboutMe.yml b/aboutMe.yml index 4c5d0780a..12fcae9b9 100644 --- a/aboutMe.yml +++ b/aboutMe.yml @@ -1,11 +1,11 @@ # This file is SUPER IMPORTANT. It's what joins your github name to your # student number, and that's what makes sure that you get a mark. -first_name: Ben -studentNumber: z1234567 # if you're not at UNSW, your org name, e.g. BVN +first_name: Brian +studentNumber: z5491986 # if you're not at UNSW, your org name, e.g. BVN # accounts -stackOverflowLink: https://stackoverflow.com/users/1835727/ben -github: notionparallax +stackOverflowLink: https://stackoverflow.com/users/25304061/brian-thai +github: BrianThai12 # This format is called YAML which stands for Yet Another Markup Language # It's supposed to be machine readable, and human readable. It does a pretty # good job of both of those goals, but there are some gotchas: diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..f73275383 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,20 @@ +GitPython +black +colorama +func_timeout +ipykernel +matplotlib +mypy +numpy +openpyxl +pandas +pillow +pip-tools +pipwin +pytest +requests +ruamel.yaml +wheel +seaborn +pyogrio +geopandas diff --git a/set1/checkID.json b/set1/checkID.json new file mode 100644 index 000000000..d60cb5603 --- /dev/null +++ b/set1/checkID.json @@ -0,0 +1,34 @@ +{ + "architecture": [ + "64bit", + "WindowsPE" + ], + "machine": "AMD64", + "os_name": "nt", + "platform": "Windows-10-10.0.19045-SP0", + "processor": "Intel64 Family 6 Model 158 Stepping 10, GenuineIntel", + "release": "10", + "system": "Windows", + "uname": [ + "Windows", + "DESKTOP-6F80KR6", + "10", + "10.0.19045", + "AMD64", + "Intel64 Family 6 Model 158 Stepping 10, GenuineIntel" + ], + "version": "10.0.19045", + "python_build": [ + "main", + "Jun 18 2024 15:03:56" + ], + "python_compiler": "MSC v.1929 64 bit (AMD64)", + "python_implementation(": "CPython", + "python_version(": "3.12.4", + "python_version_tuple": [ + "3", + "12", + "4" + ], + "cpu_count": 6 +} \ No newline at end of file diff --git a/set1/readme.md b/set1/readme.md index 7d385139d..127bc46fc 100644 --- a/set1/readme.md +++ b/set1/readme.md @@ -1 +1,3 @@ TODO: Reflect on what you learned this week and what is still unclear. + +How to write and print out words, specifically "Hello world!" diff --git a/set1/requestsWorking.txt b/set1/requestsWorking.txt new file mode 100644 index 000000000..658b63dfb --- /dev/null +++ b/set1/requestsWorking.txt @@ -0,0 +1,7 @@ +🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝 +🍝 🍝 +🍝 Python and requests are working! 🍝 +🍝 🍝 +🍝 All hail his noodly appendage! 🍝 +🍝 🍝 +🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝🍝 diff --git a/set10/readme.md b/set10/readme.md index 7d385139d..88729b3f2 100644 --- a/set10/readme.md +++ b/set10/readme.md @@ -1 +1 @@ -TODO: Reflect on what you learned this week and what is still unclear. +TODO: I learnt how to more effectively utilise functions and how powerful they can be to clean up your work diff --git a/set2/exercise0.py b/set2/exercise0.py index e1a6caa93..0ff7ff6be 100644 --- a/set2/exercise0.py +++ b/set2/exercise0.py @@ -44,7 +44,7 @@ def add_5(a_number): except expressed in python, not english """ # If you need to do any working steps, do them in here - the_answer = None # 👈 whenever you see the_answer = None, you need to change that to your actual answer + the_answer = a_number + 5 # 👈 whenever you see the_answer = None, you need to change that to your actual answer return the_answer @@ -53,7 +53,7 @@ def adder(a_number, another_number): Same as above, but with any two numbers. """ - the_answer = None + the_answer = a_number + another_number return the_answer @@ -68,7 +68,7 @@ def shout(a_string): they all do different things. You'll need to actually read the docs to find out which one you actually need. """ - the_answer = None + the_answer = a_string.upper() return the_answer @@ -81,7 +81,7 @@ def really_shout(a_string): that you've reused the function you already wrote. Look up how to 'concatinate' strings to make this happen. """ - the_answer = None + the_answer = shout(a_string) + '!' return the_answer @@ -97,7 +97,7 @@ def shout_with_a_number(a_string, a_number): challenge, see if you can make the test pass with at least two ways of doing the same job. """ - the_answer = None + the_answer = f"{a_string.upper()} {a_number}" return the_answer diff --git a/set2/exercise2.py b/set2/exercise2.py index bc75f99a6..83d4e9a71 100644 --- a/set2/exercise2.py +++ b/set2/exercise2.py @@ -11,27 +11,27 @@ import string # E.g. det isn't a reserved word, it should be def -det getLetter(index): +def getLetter(index): the_alphabet = string.ascii_lowercase + " " - return the_alphabet(index] # <-- this should be using [] to index into a list + return the_alphabet[index] # <-- this should be using [] to index into a list -def set2exersise2(); # this is semi-right - indices = [12: 2, 26, 7, 0, 12, 12, 4, 17] # the error messages aren't always helpful 😿 +def set2exersise2(): # this is semi-right + indices = [12, 2, 26, 7, 0, 12, 12, 4, 17] # the error messages aren't always helpful 😿 wordArray = [getLetter(x) for x in indices] wordArray[0] = wordArray[0].upper() - wordArray{1} = wordArray[1].upper() # <-- assigning to an array, another bracket problem - wordArray[3} = wordArray[3].upper{} + wordArray[1] = wordArray[1].upper() # <-- assigning to an array, another bracket problem + wordArray[3] = wordArray[3].upper() secret_word="".join(wordArray) print(secret_word) return secret_word -if __name__ = = "__main__": +if __name__ == "__main__": # ⟰-- we use = for asignment, # and == for checking if things are equal, # this isn't either! hero = set2exersise2() - prin(hero) + print(hero) # Say what this prints in your readme file for this week, along with any # comments about what you learnt by doing this exercise \ No newline at end of file diff --git a/set2/exercise3.py b/set2/exercise3.py index 248e1127f..391ee4963 100644 --- a/set2/exercise3.py +++ b/set2/exercise3.py @@ -13,13 +13,12 @@ def is_odd(a_number): Look into modulo division using the '%' operator as one way of doing this. e.g. 4 % 2 = 0 - 13 %12 = 1 + 13 % 12 = 1 3 % 2 = 1 So if a_number modulo two is zero, then it's even. """ - return None - + return a_number %2 != 0 def fix_it(moves=True, should_move=True): """Decide what to do. @@ -36,12 +35,18 @@ def fix_it(moves=True, should_move=True): Most people write this function with 4 return statements. As an extra challenge, see if you can get that down to three. """ - return None - + if moves and should_move: + return "No Problem" + elif moves and not should_move: + return "Duct Tape" + elif not moves and not should_move: + return "No Problem" + elif not moves and should_move: + return "WD-40" + def loops_preview(): """Make 8 poops. - Using a for loop return a list of 8 items, each one a string with exacly one 💩 in it. E.g.: ['💩', '💩', '💩', '💩', '💩', '💩', '💩', '💩'] @@ -59,7 +64,10 @@ def loops_1a(): return a list of 10 items, each one a string with exacly one star in it. E.g.: ['*', '*', '*', '*', '*', '*', '*', '*', '*', '*'] """ - return None + star_list = [] + for i in range(10): + star_list.append("*") + return star_list def loops_1c(number_of_items=5, symbol="#"): @@ -72,7 +80,10 @@ def loops_1c(number_of_items=5, symbol="#"): Remember that you're being passed arguments here. Don't hard code the number or the symbol, let it be whatever it wants to be. """ - return None + hash_list = [] + for i in range(number_of_items): + hash_list.append(symbol) + return hash_list def loops_2_preview(): @@ -114,7 +125,14 @@ def loops_2(): ['*', '*', '*', '*', '*', '*', '*', '*', '*', '*'], ] """ - return None + field = [] + for i in range(10): + row = [] + for j in range(10): + row.append("*") + field.append(row) + return field + def loops_3(): @@ -138,7 +156,13 @@ def loops_3(): TIP: notice that this needs to to return strings of numbers, so call str(number) to cast. """ - return None + number_square = [] + for i in range(10): + number_row =[] + for j in range(10): + number_row.append(str(i)) + number_square.append(number_row) + return number_square def loops_4(): @@ -158,7 +182,13 @@ def loops_4(): ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] ] """ - return None + number_square = [] + for i in range(10): + number_row =[] + for j in range(10): + number_row.append(str(j)) + number_square.append(number_row) + return number_square def loops_5(): @@ -188,7 +218,14 @@ def loops_5(): f"There are {num_bottles} green bottles" you'll come to see the pros and cons of each over time. """ - return None + number_square = [] + for i in range(10): + coordinate_row =[] + for j in range(5): + coordinate_row.append("(i{}, j{})".format(i, j)) + number_square.append(coordinate_row) + return(number_square) + def loops_6(): @@ -211,7 +248,13 @@ def loops_6(): You can use a variable. TIP: look out for the starting condition. """ - return None + wedge = [] + for i in range(10): + row =[] + for j in range(i + 1): + row.append(str(j)) + wedge.append(row) + return(wedge) def loops_7(): @@ -235,8 +278,17 @@ def loops_7(): This is a hard problem. Use lots of experimentation and draw lots of diagrams! """ - return None - +def loops_7(): + pyramid = [] + for i in range(5): + row = [] + for j in range(9): + if j >= 4 - i and j <= 4 + i: + row.append('*') + else: + row.append(' ') + pyramid.append(row) + return pyramid if __name__ == "__main__": # this section does a quick test on your results and prints them nicely. diff --git a/set2/readme.md b/set2/readme.md index 7d385139d..ec625321a 100644 --- a/set2/readme.md +++ b/set2/readme.md @@ -1 +1,9 @@ TODO: Reflect on what you learned this week and what is still unclear. + +In exercise 0 I learned about how to write with variables, strings and integers + +In exercise 1 I learned how to debug and pause a line to test what it does + +In exercise 2 I fixed up code that was broken. The secret word was: MC Hammer + +In exercise 3 I leared how to use for loops, append things. diff --git a/set3/exercise1.py b/set3/exercise1.py index 02fc2aca3..fa9d557e8 100644 --- a/set3/exercise1.py +++ b/set3/exercise1.py @@ -4,7 +4,6 @@ Modify each function until the tests pass. """ - def loop_ranger(start, stop=None, step=1): """Return a list of numbers between start and stop in steps of step. @@ -17,7 +16,14 @@ def loop_ranger(start, stop=None, step=1): Look up for how range() works in the python docs. You could answer this with just the range function, but we'd like you to do it the long way. """ - return None + list = [] + i = start + while i < stop: + list.append(i) + i += step + return list + + def two_step_ranger(start, stop): @@ -28,7 +34,8 @@ def two_step_ranger(start, stop): You can either reuse loop_ranger, or the range function that in the standard library """ - return None + return loop_ranger(start, stop , step = 2) + def stubborn_asker(low, high): @@ -39,7 +46,17 @@ def stubborn_asker(low, high): Look up the docs for a function called "input" """ - return None + while True: + try: + user_number = int(input(f'Enter a number which is between {low} and {high}: ')) + if low < user_number < high: + print(f'{user_number} is between {low} and {high}') + return user_number + else: print(f'Number is not between {low} and {high}. Please enter another number.') + except ValueError: + print("Invalid input. Please enter an integer.") + + def not_number_rejector(message): @@ -49,7 +66,16 @@ def not_number_rejector(message): (e.g. "cow", "six", "8!") then throw it out and ask for an actual number. When you do get a number, return it. """ - return None + while True: + try: + user_number = int(input('Enter a number: ')) + if int: + print(f'{user_number} is a number') + return user_number + except ValueError: + print("Invalid input. Please enter an number.") + + def super_asker(low, high): @@ -58,7 +84,17 @@ def super_asker(low, high): Combine what you learnt from stubborn_asker and not_number_rejector to make a function that does it all! """ - return None + while True: + try: + user_number = int(input(f'Enter a number which is between {low} and {high}: ')) + if low < user_number < high: + print(f'{user_number} is between {low} and {high}') + return user_number + else: print(f'Number is not between {low} and {high}. Please enter another number.') + except ValueError: + print("Invalid input. Please enter an integer.") + + if __name__ == "__main__": @@ -75,4 +111,4 @@ def super_asker(low, high): print("\nnot_number_rejector") not_number_rejector("Enter a number: ") print("\nsuper_asker") - super_asker(33, 42) + super_asker(33, 42) \ No newline at end of file diff --git a/set3/exercise3.py b/set3/exercise3.py index af8b297b9..881110e92 100644 --- a/set3/exercise3.py +++ b/set3/exercise3.py @@ -6,6 +6,23 @@ import random +def bounded_int_input(low, high, message="Enter a number which is between"): + """Robust asking function. + + Combine what you learnt from stubborn_asker and not_number_rejector + to make a function that does it all! + """ + while True: + try: + user_number = int(input(f'{message} {low} and {high}: ')) + if low < user_number < high: + print(f'{user_number} is between {low} and {high}') + return user_number + else: print(f'Number is not between {low} and {high}. Please enter another number.') + except ValueError: + print("Invalid input. Please enter an integer.") + + def advancedGuessingGame(): """Play a guessing game with a user. @@ -19,6 +36,7 @@ def advancedGuessingGame(): * see if you can find the other failure modes. There are three that I can think of. (They are tested for.) + NOTE: whilst you CAN write this from scratch, and it'd be good for you to be able to eventually, it'd be better to take the code from exercise 2 and merge it with code from excercise 1. @@ -28,9 +46,33 @@ def advancedGuessingGame(): Remember to think modular. Try to keep your functions small and single purpose if you can! """ + print("\nWelcome to the guessing game!") + lowerBound = bounded_int_input(-50000, 50000, message="Enter a lower bound: ") + upperBound = bounded_int_input(lowerBound+2, 50000, message="Enter an upper bound: ") + + if lowerBound >= upperBound: + print("The lower bound must be less than the upper bound. Please try again.") + elif upperBound - lowerBound == 1: + print("The difference between the lower bound and upper bound must be at least 1. Please try again.") + else: + print(f"OK then, your lower bound is {lowerBound} and your upper bound is {upperBound}") - return "You got it!" - # the tests are looking for the exact string "You got it!". Don't modify that! + actualNumber = random.randint(lowerBound + 1, upperBound - 1) + while True: + guessedNumber = bounded_int_input(lowerBound, upperBound, message="Guess a number: ") + print(f"You guessed {guessedNumber},") + if guessedNumber == actualNumber: + print(f"You got it!! It was {actualNumber}") + guessed = True + return "You got it!" + # the tests are looking for the exact string "You got it!". Don't modify that! + elif guessedNumber < actualNumber: + print("Too small, try again :'(") + lowerBound = guessedNumber + else: + print("Too big, try again :'(") + upperBound = guessedNumber + if __name__ == "__main__": diff --git a/set3/exercise4.py b/set3/exercise4.py index fb4d4caed..bd1bf2218 100644 --- a/set3/exercise4.py +++ b/set3/exercise4.py @@ -3,9 +3,7 @@ import math - -def binary_search(low, high, actual_number): - """Do a binary search. +"""Do a binary search. This is going to be your first 'algorithm' in the usual sense of the word! you'll give it a range to guess inside, and then use binary search to home @@ -21,12 +19,26 @@ def binary_search(low, high, actual_number): Use the VS Code debugging tools a lot here. It'll make understanding things much easier. """ - tries = 0 - guess = 0 - # Write your code in here - return {"guess": guess, "tries": tries} +def binary_search(low, high, actual_number): + tries = 0 + print(f"{low}, {high}, {actual_number}") + + if high >= low: + while True: + mid = (high + low) // 2 + + if mid == actual_number: + return {"guess": mid, "tries": tries} + elif mid > actual_number: + high = mid - 1 + elif mid < actual_number: + low = mid + 1 + else: + print("wtf!?") + + tries += 1 if __name__ == "__main__": diff --git a/set3/readme.md b/set3/readme.md index 7d385139d..38628a714 100644 --- a/set3/readme.md +++ b/set3/readme.md @@ -1 +1,9 @@ TODO: Reflect on what you learned this week and what is still unclear. + +I learnt how to use while loops with if, else and elif statements + +I learnt how to use f strings properly + +I learnt how to use "try" - end with except or finally + +I learnt how to make a binary search and how they work diff --git a/set4/exercise1.py b/set4/exercise1.py index fda848780..3408e904e 100644 --- a/set4/exercise1.py +++ b/set4/exercise1.py @@ -1,6 +1,5 @@ """All about IO.""" - import json import os import requests @@ -29,18 +28,28 @@ def get_some_details(): Return a new dictionary that just has the last name, password, and the number you get when you add the postcode to the id-value. TIP: Make sure that you add the numbers, not concatinate the strings. - E.g. 2000 + 3000 = 5000 not 20003000 + E.g. 2000 + 3000 = 5000 not 20003000 TIP: Keep a close eye on the format you get back. JSON is nested, so you - might need to go deep. E.g to get the name title you would need to: - data["results"][0]["name"]["title"] - Look out for the type of brackets. [] means list and {} means - dictionary, you'll need integer indeces for lists, and named keys for - dictionaries. + might need to go deep. E.g to get the name title you would need to: + data["results"][0]["name"]["title"] + Look out for the type of brackets. [] means list and {} means + dictionary, you'll need integer indeces for lists, and named keys for + dictionaries. """ json_data = open(LOCAL + "/lazyduck.json").read() data = json.loads(json_data) - return {"lastName": None, "password": None, "postcodePlusID": None} + + dr0 = data["results"][0] + last_name = dr0["name"]["last"] + password = dr0["login"]["password"] + postcodePlusID = int(dr0["location"]["postcode"]) + int(dr0["id"]["value"]) + + return { + "lastName": last_name, + "password": password, + "postcodePlusID": postcodePlusID, + } def wordy_pyramid(): @@ -79,9 +88,27 @@ def wordy_pyramid(): """ pyramid = [] + for i in range(3, 21, 2): + url = f"https://us-central1-waldenpondpress.cloudfunctions.net/give_me_a_word?wordlength={i}" + response = requests.get(url) + if response.status_code == 200: + word = response.text + pyramid.append(word) + + for i in range(20, 2, -2): + url = f"https://us-central1-waldenpondpress.cloudfunctions.net/give_me_a_word?wordlength={i}" + response = requests.get(url) + if response.status_code == 200: + word = response.text + pyramid.append(word) + return pyramid +pyramid = wordy_pyramid +print(pyramid) + + def pokedex(low=1, high=5): """Return the name, height and weight of the tallest pokemon in the range low to high. @@ -91,18 +118,40 @@ def pokedex(low=1, high=5): Parse the json and extract the values needed. TIP: reading json can someimes be a bit confusing. Use a tool like - http://www.jsoneditoronline.org/ to help you see what's going on. + http://www.jsoneditoronline.org/ to help you see what's going on. TIP: these long json accessors base["thing"]["otherThing"] and so on, can - get very long. If you are accessing a thing often, assign it to a - variable and then future access will be easier. + get very long. If you are accessing a thing often, assign it to a + variable and then future access will be easier. """ - id = 5 - url = f"https://pokeapi.co/api/v2/pokemon/{id}" - r = requests.get(url) - if r.status_code is 200: - the_json = json.loads(r.text) - - return {"name": None, "weight": None, "height": None} + # id = 5 + # url = f"https://pokeapi.co/api/v2/pokemon/{id}" + # r = requests.get(url) + # if r.status_code is 200: + # the_json = json.loads(r.text) + + name_of_tallest = "" + weight_of_tallest = 0 + height_of_tallest = 0 + + for i in range(low, high): + url = f"https://pokeapi.co/api/v2/pokemon/{i}" + r = requests.get(url) + if r.status_code is 200: + the_json = json.loads(r.text) + name = the_json["name"] + height = the_json["height"] + weight = the_json["weight"] + + if height > height_of_tallest: + height_of_tallest = height + name_of_tallest = name + weight_of_tallest = weight + + return { + "name": name_of_tallest, + "weight": weight_of_tallest, + "height": height_of_tallest, + } def diarist(): @@ -122,6 +171,18 @@ def diarist(): NOTE: this function doesn't return anything. It has the _side effect_ of modifying the file system """ + f = open(LOCAL + "\Trispokedovetiles(laser).gcode", "r") + + off_count = 0 + + for x in f: + if "M10 P1" in x: + off_count += 1 + g = open(LOCAL + "\lasers.pew", "w") + g.write(str(off_count)) + g.close() + + print(off_count) pass @@ -144,4 +205,4 @@ def diarist(): "diarist did create lasers.pew, but in the me folder, it should be in the set4 folder" ) elif in_set4: - print("lasers.pew is in the right place") + print("lasers.pew is in the right place") \ No newline at end of file diff --git a/set4/lasers.pew b/set4/lasers.pew new file mode 100644 index 000000000..62f945751 --- /dev/null +++ b/set4/lasers.pew @@ -0,0 +1 @@ +6 \ No newline at end of file diff --git a/set4/readme.md b/set4/readme.md index 7d385139d..cf056372d 100644 --- a/set4/readme.md +++ b/set4/readme.md @@ -1 +1,10 @@ TODO: Reflect on what you learned this week and what is still unclear. +I learned how to access json files + +I learned how to convert json to dictionaries + +I learned how to query website APIs using requests + +I learned how to read and write into files + +I learned how to use the git commits and push better \ No newline at end of file diff --git a/set5/readme.md b/set5/readme.md index 7d385139d..4298568bc 100644 --- a/set5/readme.md +++ b/set5/readme.md @@ -1 +1,2 @@ -TODO: Reflect on what you learned this week and what is still unclear. +TODO: +I learnt how to use some basic basic code for python notebooks \ No newline at end of file diff --git a/set6/readme.md b/set6/readme.md index 7d385139d..12023c35e 100644 --- a/set6/readme.md +++ b/set6/readme.md @@ -1 +1,2 @@ -TODO: Reflect on what you learned this week and what is still unclear. +TODO: +I learnt how to generate tables and graphs from a data set with thousands of values diff --git a/set7/readme.md b/set7/readme.md index 7d385139d..6966cb986 100644 --- a/set7/readme.md +++ b/set7/readme.md @@ -1 +1 @@ -TODO: Reflect on what you learned this week and what is still unclear. +TODO: I learnt how to generate and plot points onto a geographical map using latitude and longitude values diff --git a/set8/readme.md b/set8/readme.md index 7d385139d..d52db3b05 100644 --- a/set8/readme.md +++ b/set8/readme.md @@ -1 +1,2 @@ -TODO: Reflect on what you learned this week and what is still unclear. +TODO: +I learnt that working together with other students on problems is really helpful in terms of unknown issues. diff --git a/set9/readme.md b/set9/readme.md index 7d385139d..7e6e2cc89 100644 --- a/set9/readme.md +++ b/set9/readme.md @@ -1 +1 @@ -TODO: Reflect on what you learned this week and what is still unclear. +TODO: I learnt how to sync vs code's python notebook and jupyter lab to make an interactive notebook as a presentation with slides and different sizes and fonts diff --git a/trace.json b/trace.json new file mode 100644 index 000000000..f76a621c8 --- /dev/null +++ b/trace.json @@ -0,0 +1,364 @@ +[ + { + "of_total": 11, + "mark": 11, + "results": [ + { + "value": 1, + "name": "Run a trace on your system details" + }, + { + "value": 1, + "name": "check that Python and Requests are installed" + }, + { + "value": 1, + "name": "Exercise1: Print 'Hello world!'" + }, + { + "value": 1, + "name": "Lab book entry completed" + }, + { + "value": 1, + "name": "Update your aboutMe.yml" + }, + { + "value": 1, + "name": "requestsWorking.txt exists" + }, + { + "value": 1, + "name": "checkID.json exists" + }, + { + "value": 1, + "name": "You've forked the me repo" + }, + { + "value": 1, + "name": "You've pushed your work to GitHub: requestsWorking.txt" + }, + { + "value": 1, + "name": "You've pushed your work to GitHub: checkID.json" + }, + { + "value": 1, + "name": "You've got a photo for your GitHub account" + } + ], + "week_number": 1 + }, + { + "of_total": 35, + "mark": 35, + "results": [ + { + "value": 1, + "name": "Exercise 0: add_1 - 55 + 1 = 56" + }, + { + "value": 1, + "name": "Exercise 0: add_1 - -5 + 1 = -4" + }, + { + "value": 1, + "name": "Exercise 0: add_1 - 0.1 + 1 = 1.1" + }, + { + "value": 1, + "name": "Exercise 0: add_5 - 55 + 5 = 60" + }, + { + "value": 1, + "name": "Exercise 0: add_5 - -5 + 5 = 0" + }, + { + "value": 1, + "name": "Exercise 0: add_5 - 0.1 + 5 = 5.1" + }, + { + "value": 1, + "name": "Exercise 0: adder - 5 + 5 = 10" + }, + { + "value": 1, + "name": "Exercise 0: adder - -5 + -5 = -10" + }, + { + "value": 1, + "name": "Exercise 0: adder - 0.1 + 0.9 = 1" + }, + { + "value": 1, + "name": "Exercise 0: shout - you've => YOU'VE" + }, + { + "value": 1, + "name": "Exercise 0: shout - got => GOT" + }, + { + "value": 1, + "name": "Exercise 0: shout - to => TO" + }, + { + "value": 1, + "name": "Exercise 0: shout - fight => FIGHT" + }, + { + "value": 1, + "name": "Exercise 0: shout - for => FOR" + }, + { + "value": 1, + "name": "Exercise 0: shout - your => YOUR" + }, + { + "value": 1, + "name": "Exercise 0: shout - right => RIGHT" + }, + { + "value": 1, + "name": "Exercise 0: shout - to => TO" + }, + { + "value": 1, + "name": "Exercise 0: shout - party => PARTY" + }, + { + "value": 1, + "name": "Exercise 0: shout_with_a_number - hi, 1 => HI 1" + }, + { + "value": 1, + "name": "Exercise 2: debug the file" + }, + { + "value": 1, + "name": "Exercise 3: is_odd - is 2 odd" + }, + { + "value": 1, + "name": "Exercise 3: is_odd - is 5 odd" + }, + { + "value": 1, + "name": "Exercise 3: fix_it - it moves, and it should move" + }, + { + "value": 1, + "name": "Exercise 3: fix_it - it moves, and it should not move" + }, + { + "value": 1, + "name": "Exercise 3: fix_it - it does not move, and it should move" + }, + { + "value": 1, + "name": "Exercise 3: fix_it - it does not move, and it should not move" + }, + { + "value": 1, + "name": "Exercise 3: loops_1a - 1d for loop" + }, + { + "value": 1, + "name": "Exercise 3: loops_1c - 1d with arguments" + }, + { + "value": 1, + "name": "Exercise 3: loops_2 - 10\u00d710 stars" + }, + { + "value": 1, + "name": "Exercise 3: loops_3 - 10 matching lists" + }, + { + "value": 1, + "name": "Exercise 3: loops_4 - ten rising lists" + }, + { + "value": 1, + "name": "Exercise 3: loops_5 - write the coords" + }, + { + "value": 1, + "name": "Exercise 3: loops_6 - make a wedge" + }, + { + "value": 1, + "name": "Exercise 3: loops_7 - pyramid of stars" + }, + { + "value": 1, + "name": "Lab book entry completed" + } + ], + "week_number": 2 + }, + { + "of_total": 29, + "mark": 29, + "results": [ + { + "value": 1, + "name": "Exercise 1: Loop ranger (3, 8, 1)" + }, + { + "value": 1, + "name": "Exercise 1: Loop ranger (100, 104, 2)" + }, + { + "value": 1, + "name": "Exercise 1: Two step ranger (100, 104)" + }, + { + "value": 1, + "name": "Exercise 1: Two step ranger (100, 104)" + }, + { + "value": 1, + "name": "Exercise 1: Stubborn asker" + }, + { + "value": 1, + "name": "Exercise 1: Stubborn asker" + }, + { + "value": 1, + "name": "Exercise 1: not_number_rejector" + }, + { + "value": 1, + "name": "Exercise 1: test_super_asker" + }, + { + "value": 1, + "name": "Exercise 2: example guessing game" + }, + { + "value": 1, + "name": "Exercise 3: guessing game, U&L" + }, + { + "value": 1, + "name": "Exercise 3: guessing game, polite failures" + }, + { + "value": 1, + "name": "Exercise 3: guessing game, lowerBound bigger than upperBound" + }, + { + "value": 1, + "name": "Exercise 3: guessing game, no range to guess in (delta 1)" + }, + { + "value": 1, + "name": "Exercise 3: guessing game, no range to guess in (equal)" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 1, high: 100, target: 5) Look low" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 1, high: 100, target: 6) Look low" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 1, high: 100, target: 95) Look high" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 1, high: 51, target: 5) Look low" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 1, high: 50, target: 5) Look low" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 0, high: 100, target: 5) randomly generated test value" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 0, high: 100, target: 86) randomly generated test value" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 0, high: 100, target: 33) randomly generated test value" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 0, high: 100, target: 80) randomly generated test value" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 0, high: 100, target: 80) randomly generated test value" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 0, high: 100, target: 3) randomly generated test value" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 0, high: 100, target: 7) randomly generated test value" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 0, high: 100, target: 83) randomly generated test value" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 0, high: 100, target: 4) randomly generated test value" + }, + { + "value": 1, + "name": "Exercise 4: binary_search (low: 0, high: 100, target: 92) randomly generated test value" + } + ], + "week_number": 3 + }, + { + "of_total": 7, + "mark": 7, + "results": [ + { + "value": 1, + "name": "Exercise 1: get some data out of a JSON file" + }, + { + "value": 1, + "name": "Exercise 1: request some words from the internet" + }, + { + "value": 1, + "name": "Exercise 1: Consult the Pokedex." + }, + { + "value": 1, + "name": "Exercise 1: Consult the Pokedex." + }, + { + "value": 1, + "name": "Exercise 1: Consult the Pokedex." + }, + { + "value": 1, + "name": "Exercise 1: Consult the Pokedex." + }, + { + "value": 1, + "name": "Exercise 1: count the lasers." + } + ], + "week_number": 4 + }, + "5", + "6", + "7", + "8", + "9", + "10" +] \ No newline at end of file