diff --git a/hw/hw01/construct_check.py b/hw/hw01/construct_check.py deleted file mode 100644 index bee096e7e..000000000 --- a/hw/hw01/construct_check.py +++ /dev/null @@ -1,180 +0,0 @@ -from ast import parse, NodeVisitor, Name - -# For error messages (student-facing) only -_NAMES = { - 'Add': '+', - 'And': 'and', - 'Assert': 'assert', - 'Assign': '=', - 'AnnAssign': '=', - 'AugAssign': 'op=', - 'BitAnd': '&', - 'BitOr': '|', - 'BitXor': '^', - 'Break': 'break', - 'Recursion': 'recursive call', - 'ClassDef': 'class', - 'Continue': 'continue', - 'Del': 'del', - 'Delete': 'delete', - 'Dict': '{...}', - 'DictComp': '{...}', - 'Div': '/', - 'Ellipsis': '...', - 'Eq': '==', - 'ExceptHandler': 'except', - 'ExtSlice': '[::]', - 'FloorDiv': '//', - 'For': 'for', - 'FunctionDef': 'def', - 'Filter': 'filter', - 'GeneratorExp': '(... for ...)', - 'Global': 'global', - 'Gt': '>', - 'GtE': '>=', - 'If': 'if', - 'IfExp': '...if...else...', - 'Import': 'import', - 'ImportFrom': 'from ... import ...', - 'In': 'in', - 'Index': '...[...]', - 'Invert': '~', - 'Is': 'is', - 'IsNot': 'is not ', - 'LShift': '<<', - 'Lambda': 'lambda', - 'List': '[...]', - 'ListComp': '[...for...]', - 'Lt': '<', - 'LtE': '<=', - 'Mod': '%', - 'Mult': '*', - 'NamedExpr': ':=', - 'Nonlocal': 'nonlocal', - 'Not': 'not', - 'NotEq': '!=', - 'NotIn': 'not in', - 'Or': 'or', - 'Pass': 'pass', - 'Pow': '**', - 'RShift': '>>', - 'Raise': 'raise', - 'Return': 'return', - 'Set': '{ ... } (set)', - 'SetComp': '{ ... for ... } (set)', - 'Slice': '[ : ]', - 'Starred': '', - 'Str': 'str', - 'Sub': '-', - 'Subscript': '[]', - 'Try': 'try', - 'Tuple': '(... , ... )', - 'UAdd': '+', - 'USub': '-', - 'While': 'while', - 'With': 'with', - 'Yield': 'yield', - 'YieldFrom': 'yield from', -} - -def check(source_file, checked_funcs, disallow, source=None): - """Checks that AST nodes whose type names are present in DISALLOW - (an object supporting 'in') are not present in the function(s) named - CHECKED_FUNCS in SOURCE. By default, SOURCE is the contents of the - file SOURCE_FILE. CHECKED_FUNCS is either a string (indicating a single - name) or an object of some other type that supports 'in'. CHECKED_FUNCS - may contain __main__ to indicate an entire module. Prints reports of - each prohibited node and returns True iff none are found. - See ast.__dir__() for AST type names. The special node name 'Recursion' - checks for overtly recursive calls (i.e., calls of the form NAME(...) where - NAME is an enclosing def.""" - return ExclusionChecker(disallow).check(source_file, checked_funcs, source) - -class ExclusionChecker(NodeVisitor): - """An AST visitor that checks that certain constructs are excluded from - parts of a program. ExclusionChecker(EXC) checks that AST node types - whose names are in the sequence or set EXC are not present. Its check - method visits nodes in a given function of a source file checking that the - indicated node types are not used.""" - - def __init__(self, disallow=()): - """DISALLOW is the initial default list of disallowed - node-type names.""" - self._disallow = set(disallow) - self._checking = False - self._errs = 0 - - def generic_visit(self, node): - if self._checking and type(node).__name__ in self._disallow: - self._report(node) - super().generic_visit(node) - - def visit_Module(self, node): - if "__main__" in self._checked_funcs: - self._checking = True - self._checked_name = self._source_file - super().generic_visit(node) - - def visit_Call(self, node): - if 'Recursion' in self._disallow and \ - type(node.func) is Name and \ - node.func.id in self._func_nest: - self._report(node, "should not be recursive") - self.generic_visit(node) - - def visit_FunctionDef(self, node): - self._func_nest.append(node.name) - if self._checking: - self.generic_visit(node) - elif node.name in self._checked_funcs: - self._checked_name = "Function " + node.name - checking0 = self._checking - self._checking = True - super().generic_visit(node) - self._checking = checking0 - self._func_nest.pop() - - def _report(self, node, msg=None): - node_name = _NAMES.get(type(node).__name__, type(node).__name__) - if msg is None: - msg = "should not contain '{}'".format(node_name) - print("{} {}".format(self._checked_name, msg)) - self._errs += 1 - - def errors(self): - """Returns the number of number of prohibited constructs found in - the last call to check.""" - return self._errs - - def check(self, source_file, checked_funcs, disallow=None, source=None): - """Checks that AST nodes whose type names are present in DISALLOW - (an object supporting the contains test) are not present in - the function(s) named CHECKED_FUNCS in SOURCE. By default, SOURCE - is the contents of the file SOURCE_FILE. DISALLOW defaults to the - argument given to the constructor (and resets that value if it is - present). CHECKED_FUNCS is either a string (indicating a single - name) or an object of some other type that supports 'in'. - CHECKED_FUNCS may contain __main__ to indicate an entire module. - Prints reports of each prohibited node and returns True iff none - are found. - See ast.__dir__() for AST type names. The special node name - 'Recursion' checks for overtly recursive calls (i.e., calls of the - form NAME(...) where NAME is an enclosing def.""" - - self._checking = False - self._source_file = source_file - self._func_nest = [] - if type(checked_funcs) is str: - self._checked_funcs = { checked_funcs } - else: - self._checked_funcs = set(checked_funcs) - if disallow is not None: - self._disallow = set(disallow) - if source is None: - with open(source_file, 'r', errors='ignore') as inp: - source = inp.read() - p = parse(source, source_file) - self._errs = 0 - - self.visit(p) - return self._errs == 0 \ No newline at end of file diff --git a/hw/hw01/hw01.ok b/hw/hw01/hw01.ok deleted file mode 100644 index 5ccfd9042..000000000 --- a/hw/hw01/hw01.ok +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "Homework 1", - "endpoint": "cal/cs61a/fa24/hw01", - "src": [ - "hw01.py" - ], - "tests": { - "hw*.py": "doctest", - "tests/*.py": "ok_test" - }, - "default_tests": [ - "a_plus_abs_b", - "a_plus_abs_b_syntax_check", - "two_of_three", - "two_of_three_syntax_check", - "largest_factor", - "hailstone" - ], - "protocols": [ - "file_contents", - "grading", - "analytics", - "help", - "backup" - ] -} \ No newline at end of file diff --git a/hw/hw01/hw01.py b/hw/hw01/hw01.py deleted file mode 100644 index a06963e47..000000000 --- a/hw/hw01/hw01.py +++ /dev/null @@ -1,91 +0,0 @@ -from operator import add, sub - -def a_plus_abs_b(a, b): - """Return a+abs(b), but without calling abs. - - >>> a_plus_abs_b(2, 3) - 5 - >>> a_plus_abs_b(2, -3) - 5 - >>> a_plus_abs_b(-1, 4) - 3 - >>> a_plus_abs_b(-1, -4) - 3 - """ - if b < 0: - f = _____ - else: - f = _____ - return f(a, b) - -def a_plus_abs_b_syntax_check(): - """Check that you didn't change the return statement of a_plus_abs_b. - - >>> # You aren't expected to understand the code of this test. - >>> import inspect, re - >>> re.findall(r'^\s*(return .*)', inspect.getsource(a_plus_abs_b), re.M) - ['return f(a, b)'] - """ - # You don't need to edit this function. It's just here to check your work. - - -def two_of_three(i, j, k): - """Return m*m + n*n, where m and n are the two smallest members of the - positive numbers i, j, and k. - - >>> two_of_three(1, 2, 3) - 5 - >>> two_of_three(5, 3, 1) - 10 - >>> two_of_three(10, 2, 8) - 68 - >>> two_of_three(5, 5, 5) - 50 - """ - return _____ - -def two_of_three_syntax_check(): - """Check that your two_of_three code consists of nothing but a return statement. - - >>> # You aren't expected to understand the code of this test. - >>> import inspect, ast - >>> [type(x).__name__ for x in ast.parse(inspect.getsource(two_of_three)).body[0].body] - ['Expr', 'Return'] - """ - # You don't need to edit this function. It's just here to check your work. - - -def largest_factor(n): - """Return the largest factor of n that is smaller than n. - - >>> largest_factor(15) # factors are 1, 3, 5 - 5 - >>> largest_factor(80) # factors are 1, 2, 4, 5, 8, 10, 16, 20, 40 - 40 - >>> largest_factor(13) # factor is 1 since 13 is prime - 1 - """ - "*** YOUR CODE HERE ***" - - -def hailstone(n): - """Print the hailstone sequence starting at n and return its - length. - - >>> a = hailstone(10) - 10 - 5 - 16 - 8 - 4 - 2 - 1 - >>> a - 7 - >>> b = hailstone(1) - 1 - >>> b - 1 - """ - "*** YOUR CODE HERE ***" - diff --git a/hw/hw01/hw01.zip b/hw/hw01/hw01.zip deleted file mode 100644 index a72964d40..000000000 Binary files a/hw/hw01/hw01.zip and /dev/null differ diff --git a/hw/hw01/index.html b/hw/hw01/index.html deleted file mode 100644 index e2aa33045..000000000 --- a/hw/hw01/index.html +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Homework 1 | CS 61A Fall 2024 - - - - - - -
- -
-
-
-

- -Homework 1: Functions, Control - - - - - - -

-
- - -

Due by 11:59pm on Monday, September 9

- - - - - -

Instructions

- -

Download hw01.zip.

- -

Submission: When you are done, submit the assignment by uploading all code files you've edited to Gradescope. You may submit more than once before the deadline; only the -final submission will be scored. Check that you have successfully submitted -your code on Gradescope. See Lab 0 for more instructions on -submitting assignments.

- -

Using Ok: If you have any questions about using Ok, please -refer to this guide. - - -

Readings: You might find the following references - useful:

- - - -

Grading: Homework is graded based on -correctness. Each incorrect problem will decrease the total score by one point. -This homework is out of 2 points. - - - - - -
- - -

- -

Getting Started Videos

- - -

These videos may provide some helpful direction for tackling the -problems on this assignment.

- -

To see these videos, you should be logged into your berkeley.edu email. - -

YouTube link

-

- - -

Required Questions

- - - -

Q1: A Plus Abs B

- - -

Python's operator module contains two-argument functions such as add and -sub for Python's built-in arithmetic operators. For example, add(2, 3) -evalutes to 5, just like the expression 2 + 3.

- -

Fill in the blanks in the following function for adding a to the -absolute value of b, without calling abs. You may not modify any -of the provided code other than the two blanks.

- -
def a_plus_abs_b(a, b):
-    """Return a+abs(b), but without calling abs.
-
-    >>> a_plus_abs_b(2, 3)
-    5
-    >>> a_plus_abs_b(2, -3)
-    5
-    >>> a_plus_abs_b(-1, 4)
-    3
-    >>> a_plus_abs_b(-1, -4)
-    3
-    """
-    if b < 0:
-        f = _____
-    else:
-        f = _____
-    return f(a, b)
- -

Use Ok to test your code:

python3 ok -q a_plus_abs_b
- -
- -

Use Ok to run the local syntax checker (which checks that you didn't modify any of the provided code other than the two blanks):

- -
python3 ok -q a_plus_abs_b_syntax_check
- - - - - - -

Q2: Two of Three

- - -

Write a function that takes three positive numbers as arguments and returns -the sum of the squares of the two smallest numbers. Use only a single line -for the body of the function.

- -
def two_of_three(i, j, k):
-    """Return m*m + n*n, where m and n are the two smallest members of the
-    positive numbers i, j, and k.
-
-    >>> two_of_three(1, 2, 3)
-    5
-    >>> two_of_three(5, 3, 1)
-    10
-    >>> two_of_three(10, 2, 8)
-    68
-    >>> two_of_three(5, 5, 5)
-    50
-    """
-    return _____
-
- -

Hint: Consider using the max or min function:

- -
>>> max(1, 2, 3)
-3
->>> min(-1, -2, -3)
--3
- -

Use Ok to test your code:

python3 ok -q two_of_three
- -
- -

Use Ok to run the local syntax checker (which checks that you used only a single line for the body of the function):

- -
python3 ok -q two_of_three_syntax_check
- - - - - - -

Q3: Largest Factor

- - -

Write a function that takes an integer n that is greater than 1 and -returns the largest integer that is smaller than n and evenly divides n.

- -
def largest_factor(n):
-    """Return the largest factor of n that is smaller than n.
-
-    >>> largest_factor(15) # factors are 1, 3, 5
-    5
-    >>> largest_factor(80) # factors are 1, 2, 4, 5, 8, 10, 16, 20, 40
-    40
-    >>> largest_factor(13) # factor is 1 since 13 is prime
-    1
-    """
-    "*** YOUR CODE HERE ***"
-
- -

Hint: To check if b evenly divides a, -use the expression a % b == 0, which can be read as, -"the remainder when dividing a by b is 0."

- -

Use Ok to test your code:

python3 ok -q largest_factor
- -
- - - - -

Q4: Hailstone

- - -

Douglas Hofstadter's Pulitzer-prize-winning book, Gödel, Escher, Bach, poses -the following mathematical puzzle.

- -
    -
  1. Pick a positive integer n as the start.
  2. -
  3. If n is even, divide it by 2.
  4. -
  5. If n is odd, multiply it by 3 and add 1.
  6. -
  7. Continue this process until n is 1.
  8. -
- -

The number n will travel up and down but eventually end at 1 (at least for -all numbers that have ever been tried -- nobody has ever proved that the -sequence will terminate). Analogously, a hailstone travels up and down in the -atmosphere before eventually landing on earth.

- -

This sequence of values of n is often called a Hailstone sequence. Write a -function that takes a single argument with formal parameter name n, prints -out the hailstone sequence starting at n, and returns the number of steps in -the sequence:

- -
def hailstone(n):
-    """Print the hailstone sequence starting at n and return its
-    length.
-
-    >>> a = hailstone(10)
-    10
-    5
-    16
-    8
-    4
-    2
-    1
-    >>> a
-    7
-    >>> b = hailstone(1)
-    1
-    >>> b
-    1
-    """
-    "*** YOUR CODE HERE ***"
-
- -

Hailstone sequences can get quite long! Try 27. What's the longest you can -find?

- -

Note that if n == 1 initially, then the sequence is one step long.
-Hint: If you see 4.0 but want just 4, try using floor division // instead of regular division /.

- -

Use Ok to test your code:

python3 ok -q hailstone
- -
- -

Curious about hailstones or hailstone sequences? Take a look at these articles:

- -
    -
  • Check out this article to learn more about how hailstones work!
  • -
  • In 2019, there was a major development in understanding how the hailstone conjecture works for most numbers!
  • -
- - - - -

Check Your Score Locally

- -

You can locally check your score on each question of this assignment by running

- -
python3 ok --score
- -

This does NOT submit the assignment! When you are satisfied with your score, submit the assignment to Gradescope to receive credit for it.

- - -

Submit Assignment

- - -

Submit this assignment by uploading any files you've edited to the appropriate Gradescope assignment. Lab 00 has detailed instructions.

- - - - -
- - -
- -
- - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/hw/hw01/ok b/hw/hw01/ok deleted file mode 100644 index 88874ff1a..000000000 Binary files a/hw/hw01/ok and /dev/null differ