Compare commits
	
		
			No commits in common. "709e6713e18271d27a939bc3f0b6bba57b23916b" and "dff57cf324821148bb25c879ac8e18c28eeb784e" have entirely different histories. 
		
	
	
		
			709e6713e1
			...
			dff57cf324
		
	
		|  | @ -1,4 +0,0 @@ | ||||||
| # nano |  | ||||||
| *.swp |  | ||||||
| 
 |  | ||||||
| __pycache__ |  | ||||||
							
								
								
									
										343
									
								
								lambdaV.py
								
								
								
								
							
							
						
						
									
										343
									
								
								lambdaV.py
								
								
								
								
							|  | @ -1,343 +0,0 @@ | ||||||
| #!/usr/bin/env python3 |  | ||||||
| 
 |  | ||||||
| import re |  | ||||||
| 
 |  | ||||||
| debug_mode = True |  | ||||||
| 
 |  | ||||||
| cursor_up    = 'Λ' |  | ||||||
| cursor_down  = 'V' |  | ||||||
| cursor_left  = '<' |  | ||||||
| cursor_right = '>' |  | ||||||
| 
 |  | ||||||
| empty_field = [ |  | ||||||
|     " ________________ ", |  | ||||||
|     "|                |", |  | ||||||
|     "|                |", |  | ||||||
|     "|                |", |  | ||||||
|     "|                |", |  | ||||||
|     "|                |", |  | ||||||
|     "|                |", |  | ||||||
|     "|                |", |  | ||||||
|     "|                |", |  | ||||||
|     " ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ " |  | ||||||
| ] |  | ||||||
| 
 |  | ||||||
| wall  = '#' |  | ||||||
| apple = 'ó' |  | ||||||
| goal  = '$' |  | ||||||
| 
 |  | ||||||
| cursor_position = [0, 0] |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def debug_message(text): |  | ||||||
|     if debug_mode: |  | ||||||
|         print("DEBUG: ", end="") |  | ||||||
|         print(text) |  | ||||||
| 
 |  | ||||||
| def condition_in_front_of_wall(inverted): |  | ||||||
|     return False |  | ||||||
| 
 |  | ||||||
| def condition_goal_reached(inverted): |  | ||||||
|     return False |  | ||||||
| 
 |  | ||||||
| def condition_on_apple(inverted): |  | ||||||
|     return False |  | ||||||
| 
 |  | ||||||
| def condition_facing_north(inverted): |  | ||||||
|     return False |  | ||||||
| 
 |  | ||||||
| def condition_facing_south(inverted): |  | ||||||
|     return False |  | ||||||
| 
 |  | ||||||
| def condition_facing_east(inverted): |  | ||||||
|     return False |  | ||||||
| 
 |  | ||||||
| def condition_facing_west(inverted): |  | ||||||
|     return False |  | ||||||
| 
 |  | ||||||
| # condition prefixed with ! |  | ||||||
| def modifier_not(condition): |  | ||||||
|     return condition(true) |  | ||||||
| 
 |  | ||||||
| # return value: "" or error message |  | ||||||
| def command_step(): |  | ||||||
|     #TODO |  | ||||||
|     return "" |  | ||||||
| 
 |  | ||||||
| def command_left(): |  | ||||||
|     return "" |  | ||||||
| 
 |  | ||||||
| def command_right(): |  | ||||||
|     return "" |  | ||||||
| 
 |  | ||||||
| def command_repeat(number, parsed_code): |  | ||||||
|     return "" |  | ||||||
| 
 |  | ||||||
| def command_while(parsed_condition, parsed_code): |  | ||||||
|     return "" |  | ||||||
| 
 |  | ||||||
| def command_take(): |  | ||||||
|     return "" |  | ||||||
| 
 |  | ||||||
| def command_if(parsed_condition, parsed_then_code, parsed_else_code): |  | ||||||
|     return "" |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # returns -1 for generic error |  | ||||||
| # returns -2 if end can’t be found |  | ||||||
| def get_length_of_condition(code): |  | ||||||
|     if len(code)==0: |  | ||||||
|         return -1 |  | ||||||
|     if code[0] == '<': |  | ||||||
|         length = 0 |  | ||||||
|         while length<len(code) and code[length]!='>': |  | ||||||
|             length = length+1 |  | ||||||
|         if length==len(code) and code[-1]!='>': |  | ||||||
|             return -2 |  | ||||||
|         return length+1 |  | ||||||
|     else: |  | ||||||
|         return -1 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # returns -1 for generic error |  | ||||||
| # returns -2 if end can’t be found |  | ||||||
| def get_length_of_contained_code(code): |  | ||||||
|     if len(code)==0: |  | ||||||
|         return -1 |  | ||||||
|     if code[0] == '(': |  | ||||||
|         length = 1 |  | ||||||
|         nesting_level = 1 |  | ||||||
|         while length<len(code) and nesting_level>0: |  | ||||||
|             if code[length] == '(': |  | ||||||
|                 nesting_level = nesting_level+1 |  | ||||||
|             elif code[length] == ')': |  | ||||||
|                 nesting_level = nesting_level-1 |  | ||||||
|             length = length+1 |  | ||||||
|         if length==len(code) and nesting_level > 0: |  | ||||||
|             return -2 |  | ||||||
|         return length |  | ||||||
|     else: |  | ||||||
|         return -1 |  | ||||||
| 
 |  | ||||||
| # clean up whitespace |  | ||||||
| def format_code(code): |  | ||||||
|     regex_pattern = re.compile(r'\s+') |  | ||||||
|     code = " ".join(re.sub(regex_pattern, ' ', code).lower().split()) |  | ||||||
|     code = code.replace(" (", "(") |  | ||||||
|     code = code.replace("( ", "(") |  | ||||||
|     code = code.replace(" )", ")") |  | ||||||
|     code = code.replace(") ", ")") |  | ||||||
|     code = code.replace(" <", "<") |  | ||||||
|     code = code.replace("< ", "<") |  | ||||||
|     code = code.replace(" >", ">") |  | ||||||
|     code = code.replace("< ", "<") |  | ||||||
|     code = code.replace("! ", "!") |  | ||||||
|     # add spaces back after closing parenthesis |  | ||||||
|     code = code.replace(")", ") ") |  | ||||||
|     code = code.replace(") )", "))") |  | ||||||
|     code = code.replace(") )", "))") |  | ||||||
|     if len(code)>0 and code[-1]==' ': |  | ||||||
|         return code[:-1] |  | ||||||
|     return code |  | ||||||
| 
 |  | ||||||
| # returns [function, inverted?, error message] |  | ||||||
| def parse_condition(condition_code, allowed_conditions): |  | ||||||
|     inverted = False |  | ||||||
|     condition = None |  | ||||||
|     if len(condition_code)==0: |  | ||||||
|         debug_message("  No condition specified") |  | ||||||
|         return [condition, inverted, "Syntax error: No condition specified"] |  | ||||||
|     if condition_code[0]=='!': |  | ||||||
|         debug_message("  Condition is inverted") |  | ||||||
|         inverted = True |  | ||||||
|         condition_code = condition_code[1:] |  | ||||||
|         if len(condition_code)==0: |  | ||||||
|             debug_message("  No condition specified") |  | ||||||
|             return [condition, inverted, "Syntax error: No condition specified"] |  | ||||||
| 
 |  | ||||||
|     if condition_code == "in front of wall": |  | ||||||
|         condition = condition_in_front_of_wall |  | ||||||
|     elif condition_code == "goal reached": |  | ||||||
|         condition = condition_goal_reached |  | ||||||
|     elif condition_code == "on apple": |  | ||||||
|         condition = condition_on_apple |  | ||||||
|     elif condition_code == "facing north": |  | ||||||
|         condition = condition_facing_north |  | ||||||
|     elif condition_code == "facing south": |  | ||||||
|         condition = condition_facing_south |  | ||||||
|     elif condition_code == "facing east": |  | ||||||
|         condition = condition_facing_east |  | ||||||
|     elif condition_code == "facing west": |  | ||||||
|         condition = condition_facing_west |  | ||||||
|     else: |  | ||||||
|         debug_message("  Unknown condition: "+condition_code) |  | ||||||
|         return [condition, inverted, "Unknown condition: "+condition_code] |  | ||||||
|     return [condition, inverted, ""] |  | ||||||
| 
 |  | ||||||
| # returns [[functions], [arguments], -1, ""] or [[], [], error_position, "error message"] |  | ||||||
| def parse_code(code, allowed_commands, allowed_conditions, unformatted_code=True): |  | ||||||
|     if unformatted_code: |  | ||||||
|         code = format_code(code) |  | ||||||
|         debug_message("Formatted code: "+code) |  | ||||||
| 
 |  | ||||||
|     parse_position = 0 |  | ||||||
|     parsed_code = [[], [], -1, ""] |  | ||||||
|     while parse_position < len(code): |  | ||||||
|         # find next command |  | ||||||
|         next_space = code.find(' ', parse_position) |  | ||||||
|         next_condition = code.find('<', parse_position) |  | ||||||
|         if next_space == -1: |  | ||||||
|             next_space = len(code) |  | ||||||
|         if next_condition == -1: |  | ||||||
|             next_condition = len(code) |  | ||||||
|         # Are we working with a simple command? |  | ||||||
|         if next_condition>next_space or next_condition==next_space: |  | ||||||
|             next_command = code[parse_position:next_space] |  | ||||||
|             debug_message("Next command is: "+next_command) |  | ||||||
| 
 |  | ||||||
|             parsed_code[1].append(()) |  | ||||||
|             #TODO: add function to to the function list |  | ||||||
|             if next_command == "step": |  | ||||||
|                 parsed_code[0].append(command_step) |  | ||||||
|             elif next_command == "left": |  | ||||||
|                 parsed_code[0].append(command_left) |  | ||||||
|             elif next_command == "right": |  | ||||||
|                 parsed_code[0].append(command_right) |  | ||||||
|             elif next_command == "take": |  | ||||||
|                 parsed_code[0].append(command_take) |  | ||||||
|             elif next_command == "repeat": |  | ||||||
|                 return [[], [], next_space, "Syntax error: Condition missing"] |  | ||||||
|             elif next_command == "while": |  | ||||||
|                 return [[], [], next_space, "Syntax error: Condition missing"] |  | ||||||
|             elif next_command == "if": |  | ||||||
|                 return [[], [], next_space, "Syntax error: Condition missing"] |  | ||||||
|             elif next_command == "else": |  | ||||||
|                 return [[], [], parse_position, "Syntax error: Else without if statement"] |  | ||||||
|             else: |  | ||||||
|                 #TODO: better error message (especially when special chars are detected inside next_command or a known command) |  | ||||||
|                 return [[], [], parse_position, "Unknown command: "+next_command] |  | ||||||
|             parse_position = next_space+1 |  | ||||||
|         else: |  | ||||||
|             debug_message("Found control structure...") |  | ||||||
|             control_structure = code[parse_position:next_condition] |  | ||||||
|             if control_structure == "repeat": |  | ||||||
|                 debug_message("  Type: repeat loop") |  | ||||||
|                 parse_position = next_condition |  | ||||||
|                 repetitions_length = get_length_of_condition(code[parse_position:]) |  | ||||||
|                 if repetitions_length == -2: |  | ||||||
|                     debug_message("  Mismatched <>") |  | ||||||
|                     return [[], [], parse_position, "Syntax error: Cannot not find matching '>' for this '<'"] |  | ||||||
|                 repetitions = code[parse_position:parse_position+repetitions_length] |  | ||||||
|                 debug_message("  Number of repetitions: "+repetitions) |  | ||||||
|                 repetitions_int = 0 |  | ||||||
|                 try: |  | ||||||
|                     repetitions_int = int(repetitions[1:-1]) |  | ||||||
|                 except ValueError: |  | ||||||
|                     return [[], [], parse_position, "Not a valid number: "+repetitions[1:-1]] |  | ||||||
|                 parse_position = parse_position+len(repetitions) |  | ||||||
|                 contained_code_length = get_length_of_contained_code(code[parse_position:]) |  | ||||||
|                 if contained_code_length == -1: |  | ||||||
|                     debug_message("  Missing (") |  | ||||||
|                     return [[], [], parse_position, "Syntax error: Cannot not find '(' for contained code"] |  | ||||||
|                 if contained_code_length == -2: |  | ||||||
|                     debug_message("  Mismatched ()") |  | ||||||
|                     return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('"] |  | ||||||
|                 contained_code = code[parse_position:parse_position+contained_code_length] |  | ||||||
|                 debug_message("  Contained code: "+contained_code) |  | ||||||
|                 parsed_contained_code = parse_code(contained_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False) |  | ||||||
|                 if not parsed_contained_code[2]==-1: |  | ||||||
|                     debug_message("  Error while parsing contained code") |  | ||||||
|                     return [[], [], parse_position+1+parsed_contained_code[2], parsed_contained_code[3]] |  | ||||||
|                 parse_position = parse_position+contained_code_length+1 |  | ||||||
| 
 |  | ||||||
|                 parsed_code[1].append((repetitions_int, parsed_contained_code)) |  | ||||||
|                 parsed_code[0].append(command_repeat) |  | ||||||
|                 continue |  | ||||||
|             elif control_structure == "if": |  | ||||||
|                 debug_message("  Type: if statement") |  | ||||||
|                 parse_position = next_condition |  | ||||||
|                 condition_length = get_length_of_condition(code[parse_position:]) |  | ||||||
|                 if condition_length == -2: |  | ||||||
|                     debug_message("  Mismatched <>") |  | ||||||
|                     return [[], [], parse_position, "Syntax error: Cannot not find matching '>' for this '<'"] |  | ||||||
|                 condition = code[parse_position:parse_position+condition_length] |  | ||||||
|                 debug_message("  Condition is: "+condition) |  | ||||||
|                 parsed_condition = parse_condition(condition[1:-1], allowed_conditions) |  | ||||||
|                 if not parsed_condition[2]=="": |  | ||||||
|                     return [[], [], parse_position, parsed_condition[2]] |  | ||||||
|                 parse_position = parse_position+len(condition) |  | ||||||
|                 then_code_length = get_length_of_contained_code(code[parse_position:]) |  | ||||||
|                 if then_code_length == -1: |  | ||||||
|                     debug_message("  Missing (") |  | ||||||
|                     return [[], [], parse_position, "Syntax error: Cannot not find '(' for then-code"] |  | ||||||
|                 if then_code_length == -2: |  | ||||||
|                     debug_message("  Mismatched ()") |  | ||||||
|                     return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('"] |  | ||||||
|                 then_code = code[parse_position:parse_position+then_code_length] |  | ||||||
|                 debug_message("  Then-code: "+then_code) |  | ||||||
|                 parsed_then_code = parse_code(then_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False) |  | ||||||
|                 if not parsed_then_code[2]==-1: |  | ||||||
|                     debug_message("  Error while parsing then-code") |  | ||||||
|                     return [[], [], parse_position+1+parsed_then_code[2], parsed_then_code[3]] |  | ||||||
|                 parse_position = parse_position+then_code_length+1 |  | ||||||
|                 parsed_else_code = None |  | ||||||
|                 if parse_position<len(code)+4 and code[parse_position:parse_position+4]=="else": |  | ||||||
|                     parse_position = parse_position+4 |  | ||||||
|                     else_code_length = get_length_of_contained_code(code[parse_position:]) |  | ||||||
|                     if else_code_length == -1: |  | ||||||
|                         debug_message("  Missing (") |  | ||||||
|                         return [[], [], parse_position, "Syntax error: Cannot not find '(' for else-code"] |  | ||||||
|                     if else_code_length == -2: |  | ||||||
|                         debug_message("  Mismatched ()") |  | ||||||
|                         return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('"] |  | ||||||
|                     else_code = code[parse_position:parse_position+else_code_length] |  | ||||||
|                     debug_message("  Else-code: "+else_code) |  | ||||||
|                     parsed_else_code = parse_code(else_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False) |  | ||||||
|                     parse_position = parse_position+else_code_length+1 |  | ||||||
| 
 |  | ||||||
|                 parsed_code[1].append((parsed_condition, parsed_then_code, parsed_else_code)) |  | ||||||
|                 parsed_code[0].append(command_if) |  | ||||||
|                 continue |  | ||||||
|             elif control_structure == "while": |  | ||||||
|                 debug_message("  Type: while loop") |  | ||||||
|                 parse_position = next_condition |  | ||||||
|                 condition_length = get_length_of_condition(code[parse_position:]) |  | ||||||
|                 if condition_length == -2: |  | ||||||
|                     debug_message("  Mismatched <>") |  | ||||||
|                     return [[], [], parse_position, "Syntax error: Cannot not find matching '>' for this '<'"] |  | ||||||
|                 condition = code[parse_position:parse_position+condition_length] |  | ||||||
|                 debug_message("  Condition is: "+condition) |  | ||||||
|                 parsed_condition = parse_condition(condition[1:-1], allowed_conditions) |  | ||||||
|                 if not parsed_condition[2]=="": |  | ||||||
|                     return [[], [], parse_position, parsed_condition[2]] |  | ||||||
|                 parse_position = parse_position+len(condition) |  | ||||||
|                 contained_code_length = get_length_of_contained_code(code[parse_position:]) |  | ||||||
|                 if contained_code_length == -1: |  | ||||||
|                     debug_message("  Missing (") |  | ||||||
|                     return [[], [], parse_position, "Syntax error: Cannot not find '(' for contained code"] |  | ||||||
|                 if contained_code_length == -2: |  | ||||||
|                     debug_message("  Mismatched ()") |  | ||||||
|                     return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('"] |  | ||||||
|                 contained_code = code[parse_position:parse_position+contained_code_length] |  | ||||||
|                 debug_message("  Contained code: "+contained_code) |  | ||||||
|                 parsed_contained_code = parse_code(contained_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False) |  | ||||||
|                 if not parsed_contained_code[2]==-1: |  | ||||||
|                     debug_message("  Error while parsing contained code") |  | ||||||
|                     return [[], [], parse_position+1+parsed_contained_code[2], parsed_contained_code[3]] |  | ||||||
|                 parse_position = parse_position+contained_code_length+1 |  | ||||||
| 
 |  | ||||||
|                 parsed_code[1].append((parsed_condition, parsed_contained_code)) |  | ||||||
|                 parsed_code[0].append(command_while) |  | ||||||
|             else: |  | ||||||
|                 debug_message("  Type: unknown control structure: "+control_structure) |  | ||||||
|                 #TODO: better error message (especially when special chars are detected inside control_structure or a known command) |  | ||||||
|                 return [[], [], parse_position, "Syntax error: Unknown control structure: "+control_structure] |  | ||||||
|     return parsed_code |  | ||||||
| 
 |  | ||||||
| # returns success or error message |  | ||||||
| # Parsed code is the result of running the parser. |  | ||||||
| def run_code(parsed_code): |  | ||||||
|     return "" |  | ||||||
| 
 |  | ||||||
| if __name__ == "__main__": |  | ||||||
|     pass |  | ||||||
							
								
								
									
										266
									
								
								outline.txt
								
								
								
								
							
							
						
						
									
										266
									
								
								outline.txt
								
								
								
								
							|  | @ -1,266 +0,0 @@ | ||||||
| This file contains materials I created to teach programming. It is more or less a precursor to ΛV. |  | ||||||
| Since then, I have decided to replace the A for the upwards-pointing cursor with a capital lambda. |  | ||||||
| ΛV will also only have one of each condition and use ! to negate them. |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Prerequisite: |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
|  _______________ |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
|  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| This needs to show up as a roughly square box. |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 1) |  | ||||||
| Let’s start out by familiarizing ourselves with what things look like: |  | ||||||
| 
 |  | ||||||
| Cursor: |  | ||||||
| `< A > V` |  | ||||||
| Wall/barrier: |  | ||||||
| `| _ ¯ #` |  | ||||||
| Goal: |  | ||||||
| `$` |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
|  _______________ |  | ||||||
| |   #     $#    | |  | ||||||
| |   # ######    | |  | ||||||
| |#### #         | |  | ||||||
| | >   #         | |  | ||||||
| |######         | |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
|  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |  | ||||||
| ``` |  | ||||||
| Available instructions: |  | ||||||
| step |  | ||||||
| left |  | ||||||
| right |  | ||||||
| 
 |  | ||||||
| Possible solution: step step step left step step step right step step step step step |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 2) |  | ||||||
| That’s quite simple. But it can get tedious really quickly: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
|  _______________ |  | ||||||
| |V#$            | |  | ||||||
| | ############# | |  | ||||||
| | #           # | |  | ||||||
| | #           # | |  | ||||||
| | #           # | |  | ||||||
| | ############# | |  | ||||||
| |               | |  | ||||||
|  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |  | ||||||
| ``` |  | ||||||
| Available instructions: |  | ||||||
| step |  | ||||||
| left |  | ||||||
| right |  | ||||||
| repeat<NUMBER>(INSTRUCTIONS) |  | ||||||
| 
 |  | ||||||
| Possible solution: repeat<6>(step) left repeat<14>(step) left repeat<6>(step) left repeat<12>(step) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 3) |  | ||||||
| Same concept, different problem: |  | ||||||
| ``` |  | ||||||
|  _______________ |  | ||||||
| |>##            | |  | ||||||
| |  ##           | |  | ||||||
| |#  ##          | |  | ||||||
| |##  ##         | |  | ||||||
| | ##  ##        | |  | ||||||
| |  ##  ##       | |  | ||||||
| |   ## $#       | |  | ||||||
|  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |  | ||||||
| ``` |  | ||||||
| Avaliable instructions: |  | ||||||
| step |  | ||||||
| left |  | ||||||
| right |  | ||||||
| repeat<NUMBER>(INSTRUCTIONS) |  | ||||||
| 
 |  | ||||||
| Possible solution: repeat<6>(right step left step) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 4) |  | ||||||
| Now in actual programming, running code repeatedly is a bit different. |  | ||||||
| Instead of running a set number of times, which is certainly possible but |  | ||||||
| not always desired, they usually run as long as a certain condition is met. |  | ||||||
| This is called a loop. The most basic form it is known as a "while loop". |  | ||||||
| ``` |  | ||||||
|  _______________ |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
| |############   | |  | ||||||
| |>         $#   | |  | ||||||
| |############   | |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
|  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |  | ||||||
| ``` |  | ||||||
| Available instructions: |  | ||||||
| step |  | ||||||
| left |  | ||||||
| right |  | ||||||
| while<CONDITION>(INSTRUCTIONS) |  | ||||||
| 
 |  | ||||||
| Available conditions: |  | ||||||
| facing wall |  | ||||||
| not facing wall |  | ||||||
| 
 |  | ||||||
| Possible solution: while<not facing wall>(step) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Additional practice: |  | ||||||
| ``` |  | ||||||
|  _______________ |  | ||||||
| |    #$ #       | |  | ||||||
| |    ## #       | |  | ||||||
| |     # #       | |  | ||||||
| |     # #       | |  | ||||||
| |     # #       | |  | ||||||
| |     # #       | |  | ||||||
| |     #A#       | |  | ||||||
|  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 5) |  | ||||||
| Let’s turn this up a notch (copy+paste is gonna be real handy for this one): |  | ||||||
| ``` |  | ||||||
|  _______________ |  | ||||||
| |               | |  | ||||||
| | ############# | |  | ||||||
| | #$#         # | |  | ||||||
| | # #         # | |  | ||||||
| | # #         # | |  | ||||||
| | # ########### | |  | ||||||
| |A#             | |  | ||||||
|  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |  | ||||||
| ``` |  | ||||||
| Available instructions: |  | ||||||
| step |  | ||||||
| left |  | ||||||
| right |  | ||||||
| while<CONDITION>(INSTRUCTIONS) |  | ||||||
| 
 |  | ||||||
| Available conditions: |  | ||||||
| facing wall |  | ||||||
| not facing wall |  | ||||||
| 
 |  | ||||||
| Possible solution: while<not facing wall>(step) right while<not facing wall>(step) right while<not facing wall>(step) right while<not facing wall>(step) right while<not facing wall>(step) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 6) |  | ||||||
| Loops can also be nested inside other loops: |  | ||||||
| ``` |  | ||||||
|  _______________ |  | ||||||
| |               | |  | ||||||
| | ############# | |  | ||||||
| | #           # | |  | ||||||
| | # ######### # | |  | ||||||
| | # #$        # | |  | ||||||
| | # ########### | |  | ||||||
| |A#             | |  | ||||||
|  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |  | ||||||
| ``` |  | ||||||
| Available instructions: |  | ||||||
| step |  | ||||||
| left |  | ||||||
| right |  | ||||||
| while<CONDITION>(INSTRUCTIONS) |  | ||||||
| 
 |  | ||||||
| Available conditions: |  | ||||||
| facing wall |  | ||||||
| not facing wall |  | ||||||
| goal reached |  | ||||||
| goal not reached |  | ||||||
| 
 |  | ||||||
| Possible solution: while<goal not reached>(while<not facing wall>(step) right) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 7) |  | ||||||
| We’ve already seen that conditions can be used to control loops. They can also be used to control if/else statements. |  | ||||||
| 
 |  | ||||||
| I am going to introduce a new item here: |  | ||||||
| `ó` apple |  | ||||||
| Pick up all the apples in the area. |  | ||||||
| You cannot use the "take" action when there is no apple to take. |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
|  _______________ |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
| |     ##########| |  | ||||||
| |     #$ ó   ó <| |  | ||||||
| |     ##########| |  | ||||||
| |               | |  | ||||||
| |               | |  | ||||||
|  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |  | ||||||
| ``` |  | ||||||
| Available instructions: |  | ||||||
| step |  | ||||||
| left |  | ||||||
| right |  | ||||||
| take |  | ||||||
| while<CONDITION>(INSTRUCTIONS) |  | ||||||
| if<CONDITION>(INSTRUCTIONS) |  | ||||||
| if<CONDITION>(INSTRUCTIONS) else(INSTRUCTIONS) |  | ||||||
| 
 |  | ||||||
| Available conditions: |  | ||||||
| facing wall |  | ||||||
| not facing wall |  | ||||||
| goal reached |  | ||||||
| goal not reached |  | ||||||
| on apple |  | ||||||
| not on apple |  | ||||||
| 
 |  | ||||||
| Possible solution: while<goal not reached>(if<on apple>(take) step) |  | ||||||
| 
 |  | ||||||
| 8) |  | ||||||
| Let’s do the same but more: |  | ||||||
| ``` |  | ||||||
|  _______________ |  | ||||||
| |ó             $| |  | ||||||
| |  ó        ó   | |  | ||||||
| |               | |  | ||||||
| |    ó          | |  | ||||||
| |          ó    | |  | ||||||
| |   ó       ó   | |  | ||||||
| |>      ó      ó| |  | ||||||
|  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |  | ||||||
| ``` |  | ||||||
| Available instructions: |  | ||||||
| step |  | ||||||
| left |  | ||||||
| right |  | ||||||
| take |  | ||||||
| while<CONDITION>(INSTRUCTIONS) |  | ||||||
| if<CONDITION>(INSTRUCTIONS) |  | ||||||
| if<CONDITION>(INSTRUCTIONS) else(INSTRUCTIONS) |  | ||||||
| 
 |  | ||||||
| Available conditions: |  | ||||||
| facing wall |  | ||||||
| not facing wall |  | ||||||
| goal reached |  | ||||||
| goal not reached |  | ||||||
| on apple |  | ||||||
| not on apple |  | ||||||
| facing north |  | ||||||
| facing south |  | ||||||
| facing east |  | ||||||
| facing west |  | ||||||
| 
 |  | ||||||
| Possible solution: while<goal not reached>(if<on apple>(take) while<not facing wall>(step if<on apple>(take)) if<facing east>(left step left) else(right step right)) |  | ||||||
		Loading…
	
		Reference in New Issue