Spaces:
No application file
No application file
TurkuPythonExercises
/
Week 7 Libraries and More Python
/[FIXED]18. Own programming language, Part 1
| '''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 | |
| ''' | |