TurkuPythonExercises / Week 7 Libraries and More Python /[FIXED]18. Own programming language, Part 1
KaiquanMah's picture
[FIX] Add linebreak
05f08c7 verified
raw
history blame
4.54 kB
'''Setting and printing
Write a function
execute(code: str) -> str
which takes a program written in your programming language as a parameter and returns the output of the program.
At this point, the program must know the following commands:
LET variable=value
The command sets the value of the variable to the given integer. The variable is one of a, b, c or d - no other variable names are allowed. If the variable already has a value, the old value is overwritten.
PRINT variable
This command adds the value of the variable and the line break to the output. The value of the variable must be defined before it is printed.
Three example programs for testing:
LET a=10
PRINT a
The program returns a printout
10
Program 2:
LET a=100
LET b=200
PRINT a
PRINT b
The program returns the result:
100
200
Program 3:
LET c=10000
LET d=-10000
PRINT c
PRINT d
LET c=10
LET d=-10
PRINT c
PRINT d
The program returns the result:
10000
-10000
10
-10
'''
# approach 1
def execute(code: str) -> str:
variables = {'a': 0, 'b': 0, 'c': 0, 'd': 0}
output = []
for line in code.split('\n'):
line = line.strip()
if line.startswith('LET'):
_, assignment = line.split(' ', 1)
var, value = assignment.split('=')
if var in variables:
variables[var] = int(value)
else:
raise ValueError(f"Invalid variable name: {var}")
elif line.startswith('PRINT'):
_, var = line.split()
if var in variables:
output.append(str(variables[var]))
else:
raise ValueError(f"Undefined variable: {var}")
elif line: # Ignore empty lines
raise ValueError(f"Invalid command: {line}")
# approach 1A - 2/20 pts, less points, correct output BUT expected output (35 lines) vs actual output (33 lines)
# return '\n'.join(output)
# approach 1B - 13/20 pts
# for num in output:
# print(num)
# approach 1C - 20/20 pts -> OK NOW. added linebreak after each return statement. Expected vs actual output (35 lines)
joined_output = '\n'.join(output)
joined_output+='\n'
return joined_output
eg1='''LET a=10
PRINT a
'''
execute(eg1)
'''output
10
'''
eg2='''LET a=100
LET b=200
PRINT a
PRINT b
'''
execute(eg2)
'''output
10
100
200
'''
eg3='''LET c=10000
LET d=-10000
PRINT c
PRINT d
LET c=10
LET d=-10
PRINT c
PRINT d
'''
execute(eg3)
'''output
10
100
200
10000
-10000
10
-10
'''
################################################
# approach 1A
'''autograder expected output
Testing code:
LET a=73
PRINT a
Program outputs:
73
Testing code:
LET a=1
LET b=96
PRINT a
PRINT b
Program outputs:
1
96
Testing code:
LET c=1669
LET d=-557
PRINT c
PRINT d
LET c=1169
LET d=-1114
PRINT c
PRINT d
Program outputs:
1669
-557
1169
-1114
'''
'''autograder actual output
Testing code:
LET a=73
PRINT a
Program outputs:
73
# ok
Testing code:
LET a=1
LET b=96
PRINT a
PRINT b
Program outputs:
1
96
# ok
Testing code:
LET c=1669
LET d=-557
PRINT c
PRINT d
LET c=1169
LET d=-1114
PRINT c
PRINT d
Program outputs:
1669
-557
1169
-1114
# ok
'''
################################################
# approach 1B
'''autograder expected output
Testing code:
LET a=21
PRINT a
Program outputs:
21
Testing code:
LET a=32
LET b=72
PRINT a
PRINT b
Program outputs:
32
72
Testing code:
LET c=2276
LET d=-557
PRINT c
PRINT d
LET c=1776
LET d=-1114
PRINT c
PRINT d
Program outputs:
2276
-557
1776
-1114
'''
'''autograder actual output
Testing code:
LET a=21
PRINT a
Program outputs:
21
None
Testing code:
LET a=32
LET b=72
PRINT a
PRINT b
Program outputs:
32
72
None
Testing code:
LET c=2276
LET d=-557
PRINT c
PRINT d
LET c=1776
LET d=-1114
PRINT c
PRINT d
Program outputs:
2276
-557
1776
-1114
None
'''
################################################
# approach 1C
'''autograder expected output
Testing code:
LET a=21
PRINT a
Program outputs:
21
Testing code:
LET a=32
LET b=72
PRINT a
PRINT b
Program outputs:
32
72
Testing code:
LET c=2276
LET d=-557
PRINT c
PRINT d
LET c=1776
LET d=-1114
PRINT c
PRINT d
Program outputs:
2276
-557
1776
-1114
'''
'''autograder actual output
Testing code:
LET a=24
PRINT a
Program outputs:
24
Testing code:
LET a=30
LET b=40
PRINT a
PRINT b
Program outputs:
30
40
Testing code:
LET c=2126
LET d=-477
PRINT c
PRINT d
LET c=1626
LET d=-954
PRINT c
PRINT d
Program outputs:
2126
-477
1626
-954
'''