person
Open a College

Computer Science Arts English Psychology Yoga Entrepreneurship
but you can still pick the better path.
AstraPath is a growing collection of free resources you can use to learn a new subject or skill, ranging from video lectures to text-based tutorials.
Problem Set 1 Solutions by elizabethmcclaire MIT 6.0001 by johnh by Ofekhod Introduction by chenyi by Sherry
and learn from others.
AstraNote not just your notepad, but also a web of notes. Simply put, you get to use notes from other learners, and others can also see yours.
Of course, you also have the option to keep all your notes private.

#### Problem Set 1 Solutions

```#1a:
annual_salary = float(input('Enter your annual salary: '))
portion_saved = float(input('Enter the percent of your salary to save, as a decimal:​ '))
total_cost = float(input('Enter the cost of your dream home: '))
current_savings = 0
portion_down_payment = 0.25
down_cost = total_cost * portion_down_payment
r = 0.04
monthly_salary = annual_salary/12
num_months = 0

while current_savings < down_cost:
current_savings += monthly_salary * portion_saved + current_savings * r/12
num_months += 1

num_years = num_months/12

print('Number of months:', num_months)
print('Number of years:',num_years)

#1b
annual_salary = float(input('Enter your annual salary: '))
portion_saved = float(input('Enter the percent of your salary to save, as a decimal:​ '))
total_cost = float(input('Enter the cost of your dream home: '))
semi_annual_raise = float(input('Enter the semi­annual raise, as a decimal: '))
current_savings = 0
portion_down_payment = 0.25
down_cost = total_cost * portion_down_payment
r = 0.04
monthly_salary = annual_salary/12
num_months = 0

while current_savings < down_cost:
current_savings += monthly_salary * portion_saved + current_savings * r/12
num_months += 1
if num_months%6 == 0:
monthly_salary *= (1 + semi_annual_raise)

num_years = num_months/12

print('Number of months:', num_months)
print('Number of years:',num_years)

#1c
def whatrate():
annual_salary = int(input('Enter the starting salary: '))
total_cost = 1000000
semi_annual_raise = 0.07
current_savings = 0
portion_down_payment = 0.25
down_cost = total_cost * portion_down_payment
r = 0.04
monthly_salary = annual_salary/12
num_months = 36
high = 10000
low = 0
ans = (high + low)/2
numofsteps = 0

max_savings = 0
for i in range(1,num_months+1):
max_savings += monthly_salary + current_savings * r/12
if i%6 == 0:
monthly_salary *= (1 + semi_annual_raise)
if max_savings < down_cost:
return print('It is not possible to pay the down payment in three years.')

min_savings = 0
for i in range(1,num_months+1):
min_savings += monthly_salary * 0.0001 + current_savings * r/12
if i%6 == 0:
monthly_salary *= (1 + semi_annual_raise)
if min_savings > down_cost:
return print('You don\'t really need to save, mate.')

while abs(current_savings - down_cost) > 100:
current_savings = 0
monthly_salary = annual_salary/12
numofsteps += 1
for i in range(1,num_months+1):
current_savings += monthly_salary * ans/10000 + current_savings * r/12
if i%6 == 0:
monthly_salary *= (1 + semi_annual_raise)
if current_savings > down_cost:
high = ans
else:
low = ans
ans = (high + low)/2
print('Best savings rate:', round(ans/10000,4))
print('Steps in bisection search:​', numofsteps)```

#### MIT 6.0001

# Lecture 1: What is Computation?
1.1 Topics of the courses
* iteration and recursion
* organize and modularize
* ALGORITHMS!
* complexity of algorithms
1.2 Construction of languages
* primitive constructs - numbers, strings, simple operators
* syntax - 3.2 * 5
* static semantics - syntactically valid strings have meaning; e.g. 3.2 * "hi" #static semantic error
* semantics - meaning associated with a syntactically correct string of symbols with no static semantic errors
# syntactic + static semantic + semantic = all those errors come from
1.3 Objects (or type)
1.3.1 scalar object (can not be subdivided)
* int - represents integers, ex. 5
* float - represent real numbers, ex. 3.27
* bool - represent Boolean values True and False
* Nonetype - special and has one value, None
# type() - see the type of an object
# int() or float() - type conversions (cast)
1.3.2 non-scalar (internal structure)
* list - [1, 2, 3]
1.4 Expression <object><operator><object>
# an expression has a value, which has a type
* i + j - the sum
* i - j - the difference
* i * j - the product
* i / j - the division #result is float
** i % j - the remainder when i is divided by j
** i ** j - i to the power of j
# use parentheses () to tell Python to do these operations first
1.5 Binding variables and values
* equal sign is an assignment of a value to a variable name
* pi = 3.14159; radius = 2.2; area = pi * (radius ** 2)

# Lecture 2: Branching and iteration
2.1 string object type
2.1.1 strings - letters, special characters, spaces, digits
* hi = "hello there"; name = "qixiang"; - enclose in quotation marks or single quotes
* greeting = hi + " " + name - concatenate strings
* silly = hi + " " + name * 3 - operations on string
2.1.2 INPUT/OUTPUT - print("") & input("")
* 2 way of printing sentences - print("My name is", x, "."); print("My name is " + x + " .")
2.1.3 comparision operators on int, float, string (ascii table)
* i == j - equality test
* i != j - inequality test
2.1.4 logic operators on bools
* not a - True if a is False, False if a is True
* a and b - True if both are True
* a or b - True if either or both are True
2.2 branching and conditionals (CONTROL FLOW)
2.2.1 if<condition> + <expression>
2.2.2 elif<condition> + <expression>
2.2.3 else: +<expression>
* <condition> has a value True or False
* evaluate expressions in the block if <condition> is True
2.3 indentation - how you denote (indiate) block of code
* vs == and !=
2.4 iteration and loops
2.4.1 while loops
* while <condition>: <expression>
# <condition> evaluates to a Boolean;
if <condition> is True do <expression>;
check <condition> again;
repeat until <condition> is False
* iteration through nums in a sequence - i = 0; while num < i: <expression>
2.4.2 for loops
* for <variable> in range(start, stop, step)
# loop until value is stop -1
2.4.3 break STATEMENT
* exits only innermost loop!
2.4.4 comparation between for and while LOOPS
* for LOOPS -
# known number of iterations;
with an inner counter;
rewritiable through while LOOPS
* while LOOPS -
# unbounded number of iterations;
can use a counter but must initialize;
MAYNOT rewritiable through for LOOPS

# Lecture 3: String Manipulation, Guess and Check, Approximations, Bisection
# last 3 are ALGORITHMS for guessing
3.1 string manipulation
3.1.1 definition and basic operation
* sequence of case sensitive characters
* compare operation - ==, >, < etc.
* length operation - len()
3.1.2 indexing
* square brackets to index string
# s = "abc" index: 0 1 2 or -3 -2 -1
s == s[-3] = "a"; s == s[-2] = "b"; s == s[-1] = "c"
3.1.3 slicing
* slice strings using [start: stop: step]
# s = "abcdefgh"
s[3: 6: 2] = "df"
* strings are "IMMUTABLE" - cannot be modified
# change s = "hello" to s = "yello"
s = 'y' - ERROR!
s = 'y' + s[1: len(s)]
3.1.4 LOOPS RECAP (string loops)
* loop variable
- numbers - for var in range(4, 6): <expression>
- indexing in string - for index in range(len(s)): <expression>
- CHAR - for char in s: <expression>
# more pythonic for char in word
* example - Robot cheerleader & Common letter
3.2 guess and check algorithms (exhuasted enumeration)
* for guess in range(cube + 1) - test from 0 to cube
if guess ** 3 == cube:
print("Cube root of", cube, "is", guess)
# guess a value for solution
# check if the solution is correct
# keep guessing and checking ...unitil find solution or guessed all values
3.3 approximate solutions (find an approximate solution)
* Initial value
- epsilon (how close to the target) and increment (how large each step is)
- target and guess, and num_guesses
* while abs(guess ** 3 - cube) >= epsilon and guess <=cube:
guess += increment
num_guesses += 1
# good enough approximation
# keep guessing if abs(guess ** 3 - cube) >= epsilon, for some small epsilon
# decreasing increment size - slower program
increasing epsilon - less accurate answer
3.4 bisection search method
* half interval each iteration and new guess is halfway in between
* guess CONVERGES on the order of log2N steps
* Initial low and high value - low = 0, high = guess, guess = (high + low) / 2.0
While abs(guess ** 3 - cube) >= epsilon:
if guess ** 3 < cube:
low = guess  #re-define the low boundary
else:
high = guess  #re-define the high boundary
guess = (high + low) / 2.0
num_guesses +=1

#### Introduction

Lecture 1

Concepts

• computer - calculations, storage, result memorization, - tell them what to do!
• 1. statement of facts  2. order/recipe/ the sequence of steps
• flow of control: making decisions
• 6 primitives --> types of result -- > instruction flow --> output
• expression: primitives + programming languages
• expression - value - type

[Revisit]

Programming

• 35:00
• give names, reuse names
• = assignment (left - variable)

Remaining Question:

#### `u``sa_gold = 46``uk_gold = 27``romania_gold = 1``total_gold = usa_gold + uk_gold + romania_gold``print(total_gold)``romania_gold += 1`

```    total_gold = usa_gold + uk_gold + romania_gold
print(total_gold)```

My question:

Why do we get 75 for the second print?

From John's notes:

so, romania_gold + = 1 is equal to romania_gold = romania gold + 1

With Mind Palace, memorizing a whole book can be both fun and easy.
Mind Palace is a memory technique invented by Greek poet, Simonides of Ceos, beloved by Sherlock Holmes, and used by memory champions.
Create a web app using Django Drawing for charity

This feature is still in beta. Leave your email to
get early access.

Learn by doing real projects provided big companies, startups, and NGOs.
If you don't practise, you're not really learning.
If you don't know how to practise, you won't pick up a skill.
Start a company Get a job at Tesla

This feature is still in beta. Leave your email to
get early access.

Launch your career while you're learning.
With AstraConnect, you can connect with companies and organisations early and learn on-demand skills.
Or, you can connect with startup founders and investors to launch your startup--that's how Astrasum was born!

#### Sunday 25 Oct 2020

Learn computer science on Astrasum ...

### Routines:

- Learn computer science on Astrasum
- Every Sunday
...
Mastery comes from the power of repetition
Set your routines on AstraPanel and your daily to-dos will be automatically generated every morning.

### AstraPath Info +

• Subject: Computer Science
• Level: Beginner
• Prerequisite: High school algebra
• Skills unlocked: an understanding of the role computation can play in solving problems and writing small programmes in Python
• Learning media: Video lectures, readings, problem sets
• Open Original Source in New Tab

### AstraNote Collection +

• elizabethmcclaire's notes
• johnh's notes
• Ofekhod's notes
• chenyi's notes
• Sherry's notes

#### Problem Set 1 Solutions

```#1a:
annual_salary = float(input('Enter your annual salary: '))
portion_saved = float(input('Enter the percent of your salary to save, as a decimal:​ '))
total_cost = float(input('Enter the cost of your dream home: '))
current_savings = 0
portion_down_payment = 0.25
down_cost = total_cost * portion_down_payment
r = 0.04
monthly_salary = annual_salary/12
num_months = 0

while current_savings < down_cost:
current_savings += monthly_salary * portion_saved + current_savings * r/12
num_months += 1

num_years = num_months/12

print('Number of months:', num_months)
print('Number of years:',num_years)

#1b
annual_salary = float(input('Enter your annual salary: '))
portion_saved = float(input('Enter the percent of your salary to save, as a decimal:​ '))
total_cost = float(input('Enter the cost of your dream home: '))
semi_annual_raise = float(input('Enter the semi­annual raise, as a decimal: '))
current_savings = 0
portion_down_payment = 0.25
down_cost = total_cost * portion_down_payment
r = 0.04
monthly_salary = annual_salary/12
num_months = 0

while current_savings < down_cost:
current_savings += monthly_salary * portion_saved + current_savings * r/12
num_months += 1
if num_months%6 == 0:
monthly_salary *= (1 + semi_annual_raise)

num_years = num_months/12

print('Number of months:', num_months)
print('Number of years:',num_years)

#1c
def whatrate():
annual_salary = int(input('Enter the starting salary: '))
total_cost = 1000000
semi_annual_raise = 0.07
current_savings = 0
portion_down_payment = 0.25
down_cost = total_cost * portion_down_payment
r = 0.04
monthly_salary = annual_salary/12
num_months = 36
high = 10000
low = 0
ans = (high + low)/2
numofsteps = 0

max_savings = 0
for i in range(1,num_months+1):
max_savings += monthly_salary + current_savings * r/12
if i%6 == 0:
monthly_salary *= (1 + semi_annual_raise)
if max_savings < down_cost:
return print('It is not possible to pay the down payment in three years.')

min_savings = 0
for i in range(1,num_months+1):
min_savings += monthly_salary * 0.0001 + current_savings * r/12
if i%6 == 0:
monthly_salary *= (1 + semi_annual_raise)
if min_savings > down_cost:
return print('You don\'t really need to save, mate.')

while abs(current_savings - down_cost) > 100:
current_savings = 0
monthly_salary = annual_salary/12
numofsteps += 1
for i in range(1,num_months+1):
current_savings += monthly_salary * ans/10000 + current_savings * r/12
if i%6 == 0:
monthly_salary *= (1 + semi_annual_raise)
if current_savings > down_cost:
high = ans
else:
low = ans
ans = (high + low)/2
print('Best savings rate:', round(ans/10000,4))
print('Steps in bisection search:​', numofsteps)```

#### MIT 6.0001

# Lecture 1: What is Computation?
1.1 Topics of the courses
* iteration and recursion
* organize and modularize
* ALGORITHMS!
* complexity of algorithms
1.2 Construction of languages
* primitive constructs - numbers, strings, simple operators
* syntax - 3.2 * 5
* static semantics - syntactically valid strings have meaning; e.g. 3.2 * "hi" #static semantic error
* semantics - meaning associated with a syntactically correct string of symbols with no static semantic errors
# syntactic + static semantic + semantic = all those errors come from
1.3 Objects (or type)
1.3.1 scalar object (can not be subdivided)
* int - represents integers, ex. 5
* float - represent real numbers, ex. 3.27
* bool - represent Boolean values True and False
* Nonetype - special and has one value, None
# type() - see the type of an object
# int() or float() - type conversions (cast)
1.3.2 non-scalar (internal structure)
* list - [1, 2, 3]
1.4 Expression <object><operator><object>
# an expression has a value, which has a type
* i + j - the sum
* i - j - the difference
* i * j - the product
* i / j - the division #result is float
** i % j - the remainder when i is divided by j
** i ** j - i to the power of j
# use parentheses () to tell Python to do these operations first
1.5 Binding variables and values
* equal sign is an assignment of a value to a variable name
* pi = 3.14159; radius = 2.2; area = pi * (radius ** 2)

# Lecture 2: Branching and iteration
2.1 string object type
2.1.1 strings - letters, special characters, spaces, digits
* hi = "hello there"; name = "qixiang"; - enclose in quotation marks or single quotes
* greeting = hi + " " + name - concatenate strings
* silly = hi + " " + name * 3 - operations on string
2.1.2 INPUT/OUTPUT - print("") & input("")
* 2 way of printing sentences - print("My name is", x, "."); print("My name is " + x + " .")
2.1.3 comparision operators on int, float, string (ascii table)
* i == j - equality test
* i != j - inequality test
2.1.4 logic operators on bools
* not a - True if a is False, False if a is True
* a and b - True if both are True
* a or b - True if either or both are True
2.2 branching and conditionals (CONTROL FLOW)
2.2.1 if<condition> + <expression>
2.2.2 elif<condition> + <expression>
2.2.3 else: +<expression>
* <condition> has a value True or False
* evaluate expressions in the block if <condition> is True
2.3 indentation - how you denote (indiate) block of code
* vs == and !=
2.4 iteration and loops
2.4.1 while loops
* while <condition>: <expression>
# <condition> evaluates to a Boolean;
if <condition> is True do <expression>;
check <condition> again;
repeat until <condition> is False
* iteration through nums in a sequence - i = 0; while num < i: <expression>
2.4.2 for loops
* for <variable> in range(start, stop, step)
# loop until value is stop -1
2.4.3 break STATEMENT
* exits only innermost loop!
2.4.4 comparation between for and while LOOPS
* for LOOPS -
# known number of iterations;
with an inner counter;
rewritiable through while LOOPS
* while LOOPS -
# unbounded number of iterations;
can use a counter but must initialize;
MAYNOT rewritiable through for LOOPS

# Lecture 3: String Manipulation, Guess and Check, Approximations, Bisection
# last 3 are ALGORITHMS for guessing
3.1 string manipulation
3.1.1 definition and basic operation
* sequence of case sensitive characters
* compare operation - ==, >, < etc.
* length operation - len()
3.1.2 indexing
* square brackets to index string
# s = "abc" index: 0 1 2 or -3 -2 -1
s == s[-3] = "a"; s == s[-2] = "b"; s == s[-1] = "c"
3.1.3 slicing
* slice strings using [start: stop: step]
# s = "abcdefgh"
s[3: 6: 2] = "df"
* strings are "IMMUTABLE" - cannot be modified
# change s = "hello" to s = "yello"
s = 'y' - ERROR!
s = 'y' + s[1: len(s)]
3.1.4 LOOPS RECAP (string loops)
* loop variable
- numbers - for var in range(4, 6): <expression>
- indexing in string - for index in range(len(s)): <expression>
- CHAR - for char in s: <expression>
# more pythonic for char in word
* example - Robot cheerleader & Common letter
3.2 guess and check algorithms (exhuasted enumeration)
* for guess in range(cube + 1) - test from 0 to cube
if guess ** 3 == cube:
print("Cube root of", cube, "is", guess)
# guess a value for solution
# check if the solution is correct
# keep guessing and checking ...unitil find solution or guessed all values
3.3 approximate solutions (find an approximate solution)
* Initial value
- epsilon (how close to the target) and increment (how large each step is)
- target and guess, and num_guesses
* while abs(guess ** 3 - cube) >= epsilon and guess <=cube:
guess += increment
num_guesses += 1
# good enough approximation
# keep guessing if abs(guess ** 3 - cube) >= epsilon, for some small epsilon
# decreasing increment size - slower program
increasing epsilon - less accurate answer
3.4 bisection search method
* half interval each iteration and new guess is halfway in between
* guess CONVERGES on the order of log2N steps
* Initial low and high value - low = 0, high = guess, guess = (high + low) / 2.0
While abs(guess ** 3 - cube) >= epsilon:
if guess ** 3 < cube:
low = guess  #re-define the low boundary
else:
high = guess  #re-define the high boundary
guess = (high + low) / 2.0
num_guesses +=1

#### Introduction

Lecture 1

Concepts

• computer - calculations, storage, result memorization, - tell them what to do!
• 1. statement of facts  2. order/recipe/ the sequence of steps
• flow of control: making decisions
• 6 primitives --> types of result -- > instruction flow --> output
• expression: primitives + programming languages
• expression - value - type

[Revisit]

Programming

• 35:00
• give names, reuse names
• = assignment (left - variable)

Remaining Question:

#### `u``sa_gold = 46``uk_gold = 27``romania_gold = 1``total_gold = usa_gold + uk_gold + romania_gold``print(total_gold)``romania_gold += 1`

```    total_gold = usa_gold + uk_gold + romania_gold
print(total_gold)```

My question:

Why do we get 75 for the second print?

From John's notes:

so, romania_gold + = 1 is equal to romania_gold = romania gold + 1