-
-
Save galli-leo/51acf1d0e35e056c502e2cef84d9e61a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python3 | |
| import socket | |
| import curses | |
| import time | |
| import sys | |
| import random | |
| import os | |
| sys.path.append(os.getcwd()) | |
| import implementation | |
| import json | |
| import testing | |
| import traceback | |
| if len(sys.argv) != 3: | |
| print("Usage: python3 client.py <HOST> <PORT>") | |
| exit() | |
| HOST = sys.argv[1] | |
| PORT = int(sys.argv[2]) | |
| def receive_until_prompt(sock, prompt=b"\n"): | |
| received = b"" | |
| buf_size = len(prompt) | |
| while True: | |
| new = sock.recv(buf_size) | |
| received += new | |
| for i in range(1, len(prompt) + 1): | |
| if received.endswith(prompt[-i:]): | |
| if i == len(prompt): | |
| return received | |
| else: | |
| buf_size = len(prompt) - i + 1 | |
| if not new: | |
| raise Exception(f"Connection closed before {prompt} was found.") | |
| def recv(sock): | |
| data = receive_until_prompt(sock) | |
| data = data.strip() | |
| data = data.split(b"\x00") | |
| return data | |
| def send(sock, data): | |
| sock.sendall(f"{data}\n".encode()) | |
| NOTHING = "0" | |
| PIT = "1" | |
| FLAG_CHAR = "2" | |
| BREEZE = "3" | |
| SMELL = "4" | |
| actual_flag = "A"*42 | |
| map_data = {(0, 0) : NOTHING} | |
| with open("explored_map.json") as f: | |
| mod_map = json.load(f) | |
| for key, val in mod_map.items(): | |
| no_b = key[1:-1] | |
| x, y = no_b.split(", ") | |
| x = int(x) | |
| y = int(y) | |
| map_data[(x, y)] = val | |
| testing.write_map(map_data) | |
| flag_chars = [] | |
| bounds = (49, 49) | |
| current_pos = (0, 0) | |
| def add_pos(pos, move): | |
| return (pos[0] + move[0], pos[1] + move[1]) | |
| def next_pos(move): | |
| global current_pos | |
| return add_pos(current_pos, move) | |
| def add_to_pos(pos, value): | |
| global map_data | |
| map_data[pos] = value#.add(value) | |
| def parse_data(data, n_pos): | |
| global flag_chars, actual_flag | |
| if data[0] == b"iw": | |
| # invalid move | |
| print(f"found potential bounds: {n_pos}") | |
| return False, False | |
| elif data[0] == b"d": | |
| # dead | |
| print(f"found pit: {n_pos}") | |
| if map_pos(n_pos) == NOTHING: | |
| print(f"*"*20) | |
| print(f"Found pit at {n_pos}, but we previously recorded nothing there! Something bad happened for sure!") | |
| print("*"*20) | |
| add_to_pos(n_pos, PIT) | |
| correct_square_grid() | |
| return False, False | |
| elif data[0] == b"f": | |
| # flag char | |
| remote_char = data[1].decode("utf8") | |
| print(f"found flag char: {remote_char}") | |
| local_char = testing.flag_char_for_pos(n_pos) | |
| if local_char is None: | |
| print("*"*80) | |
| print(f"Local char is none for pos: {n_pos}, maybe we made a mistake?") | |
| print("*"*80) | |
| return False, False | |
| else: | |
| idx = testing.flag_char_to_index(local_char) | |
| print(f"According to local game, position of {remote_char} is {idx}") | |
| update_flag(remote_char, idx) | |
| print(f"Currently recovered flag: {actual_flag}") | |
| flag_chars.append(remote_char) | |
| #add_to_pos(n_pos, FLAG_CHAR) | |
| #add_to_pos(n_pos, data[1].decode("utf-8")) | |
| add_to_pos(n_pos, NOTHING) | |
| return True, True | |
| #return False | |
| elif data[0] == b"i": | |
| # if b"breeze" in data: | |
| # add_to_pos(n_pos, BREEZE) | |
| # if b"smell" in data: | |
| # add_to_pos(n_pos, SMELL) | |
| #if len(data) < 2: | |
| add_to_pos(n_pos, NOTHING) | |
| elif data[0] == b"e": | |
| print("Had an error: ", data) | |
| return False, False | |
| return True, False | |
| MOVE_LIST = { | |
| (1, 0) : "d", | |
| (-1, 0) : "a", | |
| (0, 1) : "s", | |
| (0, -1) : "w" | |
| } | |
| def update_flag(char, pos): | |
| global actual_flag | |
| actual_flag = actual_flag[:pos] + char + actual_flag[pos+1:] | |
| def one_iter(s, move): | |
| mv_char = MOVE_LIST[move] | |
| send(s, mv_char) | |
| again = True | |
| while again: | |
| data = recv(s) | |
| alive, again = parse_data(data, next_pos(move)) | |
| if not alive: | |
| return False | |
| return True | |
| def game_loop(next_move): | |
| global current_pos, next_explore, did_visit_flag, outside_recs, flag_pos, flag_chars, map_data | |
| with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: | |
| s.connect((HOST, PORT)) | |
| current_pos = (0, 0) | |
| outside_recs = 0 | |
| next_explore = find_next_unexplored() | |
| did_visit_flag = False | |
| cnt = 0 | |
| testing.initialize_map(map_data) | |
| try: | |
| alive = True | |
| data = recv(s) | |
| print(f"Initial Data: {data}") | |
| while alive: | |
| move = next_move() | |
| alive = one_iter(s, move) | |
| if alive: | |
| current_pos = next_pos(move) | |
| testing.tick_game(current_pos) | |
| else: | |
| if flag_pos == current_pos or flag_pos == next_pos(move): | |
| print(f"This char seems good!: {flag_chars[-1]}") | |
| print(f"Died after {cnt} {cnt // 2}") | |
| except KeyboardInterrupt as e: | |
| raise | |
| except Exception as e: | |
| print(e) | |
| traceback_str = ''.join(traceback.format_tb(e.__traceback__)) | |
| print(traceback_str) | |
| except: | |
| print("Had an error") | |
| def map_pos(pos): | |
| global map_data | |
| if pos in map_data: | |
| return map_data[pos] | |
| return "" | |
| def find_bounds(): | |
| global current_pos | |
| right = (0, 1) | |
| down = (1, 0) | |
| n_pos = next_pos(down) | |
| nn_pos = add_pos(n_pos, right) | |
| if PIT in map_pos(nn_pos): | |
| nnn_pos = add_pos(next_pos(right), right) | |
| if PIT in map_pos(nnn_pos): | |
| print(current_pos) | |
| return (0, -1) | |
| return right | |
| if PIT in map_pos(n_pos): | |
| return right | |
| return down | |
| def is_in_bounds(pos): | |
| global bounds | |
| x, y = pos | |
| return x >= 0 and y >= 0 and x < bounds[0] and y < bounds[1] | |
| def explore(): | |
| global current_pos, map_data, outside_recs | |
| outside_recs += 1 | |
| if outside_recs > 10: | |
| return (0, 0) | |
| options = [(0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (-1, 0), (0, -1), (0, -1), (0, -1), (0, -1), (0, -1), (0, -1), (0, -1)] | |
| random.shuffle(options) | |
| possibilities = [] | |
| for move in options: | |
| n_pos = next_pos(move) | |
| if is_in_bounds(n_pos) and PIT not in map_pos(n_pos): | |
| possibilities.append((n_pos, move)) | |
| # first find anything with a smell | |
| for poss in possibilities: | |
| n_pos, move = poss | |
| if SMELL in map_pos(n_pos): | |
| return move | |
| # next find anything with nothing | |
| for poss in possibilities: | |
| n_pos, move = poss | |
| if NOTHING in map_pos(n_pos): | |
| return move | |
| if len(possibilities) > 0: | |
| return possibilities[0][0] | |
| return options[0] | |
| def find_next_unexplored(): | |
| global map_data | |
| for y in range(50): | |
| for x in range(50): | |
| if (x, y) not in map_data: | |
| return (x, y) | |
| return None | |
| next_explore = (0, 1) | |
| square_grid = implementation.GridWithWeights(50, 50) | |
| def correct_square_grid(): | |
| global square_grid, map_data | |
| walls = [] | |
| for y in range(50): | |
| for x in range(50): | |
| pos = (x,y) | |
| if pos in map_data: | |
| if map_data[pos] == PIT: | |
| walls.append(pos) | |
| square_grid.walls = walls | |
| #implementation.draw_grid(square_grid) | |
| correct_square_grid() | |
| def make_path(pos): | |
| global map_data, current_pos, square_grid | |
| path, _ = implementation.a_star_search(square_grid, current_pos, pos) | |
| real_path = [] | |
| current = pos | |
| if current not in path: | |
| return None | |
| while current != current_pos: | |
| real_path.append(current) | |
| current = path[current] | |
| real_path.reverse() | |
| return real_path | |
| def explore2(): | |
| global next_explore, current_pos | |
| if current_pos == next_explore: | |
| next_explore = find_next_unexplored() | |
| if next_explore is None: | |
| print("Nothing left to explore!") | |
| return (0, 0) | |
| path = make_path(next_explore) | |
| if path is None or len(path) < 1: | |
| #add_to_pos(next_explore, NOTHING) | |
| print("*"*20) | |
| print(f"Could not find a path to {next_explore} from {current_pos}") | |
| print("*"*20) | |
| next_explore = find_next_unexplored() | |
| path = make_path(next_explore) | |
| if (48, 0) in path: | |
| print(f"Path has 48, 0, cur_pos: {current_pos}, target: {next_explore}") | |
| nxt = path[0] | |
| move = (nxt[0] - current_pos[0], nxt[1] - current_pos[1]) | |
| return move | |
| def flag_char_pos(idx): | |
| return (26 - 22 + idx, 26) | |
| did_visit_flag = False | |
| flag_pos = flag_char_pos(4) | |
| outside_recs = 0 | |
| def explore3(): | |
| global did_visit_flag, current_pos, flag_pos | |
| if did_visit_flag: | |
| return (0,0) | |
| return explore() | |
| if current_pos == flag_pos: | |
| did_visit_flag = True | |
| return (0,0) | |
| path = make_path(flag_pos) | |
| if path is None or len(path) < 1: | |
| return explore() | |
| nxt = path[0] | |
| move = (nxt[0] - current_pos[0], nxt[1] - current_pos[1]) | |
| return move | |
| exp_next_location = (38, 33) | |
| my_rand = random.Random() | |
| def new_location(): | |
| global my_rand | |
| while True: | |
| rand_pos = my_rand.randint(2, 47), my_rand.randint(10, 40) | |
| if map_pos(rand_pos) != PIT: | |
| return rand_pos | |
| def explore4(): | |
| global exp_next_location, current_pos | |
| if exp_next_location == current_pos: | |
| exp_next_location = new_location() | |
| path = make_path(exp_next_location) | |
| if path is None or len(path) < 1: | |
| return (0, 0) | |
| nxt = path[0] | |
| move = (nxt[0] - current_pos[0], nxt[1] - current_pos[1]) | |
| return move | |
| corner = (49, 49) | |
| def explore_bounds(): | |
| global corner, current_pos | |
| if corner == current_pos: | |
| corner = (corner[0] + 1, corner[1]) | |
| path = make_path(corner) | |
| if path is None or len(path) < 1: | |
| print("No path!") | |
| return (0, 0) | |
| nxt = path[0] | |
| move = (nxt[0] - current_pos[0], nxt[1] - current_pos[1]) | |
| return move | |
| def print_map(): | |
| global map_data | |
| s = "y |" | |
| for x in range(50): | |
| s += f" {x:02} |" | |
| print(s) | |
| print("-"*len(s)) | |
| for y in range(50): | |
| s = f"{y:02} |" | |
| for x in range(50): | |
| data = map_pos((x, y)) | |
| #inner = " ".join(data) | |
| s += f"{data: ^3} |" | |
| print(s) | |
| def save_map(): | |
| global map_data | |
| mod_map = {} | |
| for key, val in map_data.items(): | |
| mod_map[f"{key[0], key[1]}"] = val | |
| with open("explored_map.json", "w+") as f: | |
| json.dump(mod_map, f) | |
| ### For figuring out the bounds | |
| # game_loop(explore_bounds) | |
| ### For dumping the map data | |
| # for i in range(200): | |
| # game_loop(explore2) | |
| # #print_map() | |
| # save_map() | |
| ### For figuring out the amount of chars in the flag | |
| # flag_chars = [] | |
| # game_loop(explore4) | |
| # print(len(flag_chars), flag_chars) | |
| ### For actually finding the flag | |
| game_loop(explore4) | |
| print(actual_flag) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {"(0, 0)": "0", "(1, 0)": "0", "(2, 0)": "0", "(3, 0)": "0", "(4, 0)": "0", "(5, 0)": "0", "(6, 0)": "0", "(7, 0)": "0", "(8, 0)": "0", "(9, 0)": "0", "(10, 0)": "0", "(11, 0)": "0", "(12, 0)": "0", "(13, 0)": "0", "(14, 0)": "0", "(15, 0)": "0", "(16, 0)": "0", "(17, 0)": "0", "(18, 0)": "0", "(19, 0)": "0", "(20, 0)": "0", "(21, 0)": "0", "(22, 0)": "0", "(23, 0)": "0", "(24, 0)": "0", "(25, 0)": "0", "(26, 0)": "0", "(27, 0)": "0", "(28, 0)": "0", "(29, 0)": "0", "(30, 0)": "0", "(31, 0)": "0", "(32, 0)": "0", "(33, 0)": "1", "(32, 1)": "0", "(33, 1)": "0", "(34, 1)": "0", "(34, 0)": "0", "(35, 0)": "0", "(36, 0)": "0", "(37, 0)": "1", "(35, 1)": "0", "(36, 1)": "0", "(37, 1)": "0", "(38, 1)": "0", "(38, 0)": "0", "(39, 0)": "0", "(40, 0)": "1", "(39, 1)": "0", "(40, 1)": "0", "(41, 1)": "1", "(40, 2)": "0", "(41, 2)": "1", "(40, 3)": "0", "(41, 3)": "0", "(42, 3)": "1", "(41, 4)": "0", "(42, 4)": "0", "(43, 4)": "1", "(41, 5)": "0", "(42, 5)": "0", "(43, 5)": "0", "(44, 5)": "0", "(44, 4)": "0", "(44, 3)": "0", "(43, 3)": "0", "(43, 2)": "0", "(42, 2)": "0", "(42, 1)": "0", "(42, 0)": "0", "(41, 0)": "0", "(43, 0)": "0", "(44, 0)": "0", "(45, 0)": "0", "(46, 0)": "0", "(47, 0)": "0", "(48, 0)": "0", "(49, 0)": "1", "(0, 1)": "0", "(1, 1)": "0", "(2, 1)": "0", "(3, 1)": "0", "(4, 1)": "0", "(5, 1)": "0", "(6, 1)": "0", "(7, 1)": "0", "(8, 1)": "0", "(9, 1)": "0", "(10, 1)": "0", "(11, 1)": "0", "(12, 1)": "0", "(13, 1)": "0", "(14, 1)": "0", "(15, 1)": "0", "(16, 1)": "1", "(17, 1)": "0", "(18, 1)": "1", "(19, 1)": "0", "(20, 1)": "1", "(21, 1)": "1", "(22, 1)": "0", "(23, 1)": "0", "(24, 1)": "0", "(25, 1)": "0", "(26, 1)": "0", "(27, 1)": "0", "(28, 1)": "0", "(29, 1)": "0", "(30, 1)": "0", "(31, 1)": "0", "(43, 1)": "0", "(44, 1)": "0", "(45, 1)": "0", "(46, 1)": "0", "(47, 1)": "0", "(48, 1)": "0", "(49, 1)": "0", "(44, 2)": "0", "(40, 5)": "0", "(39, 5)": "0", "(38, 5)": "1", "(0, 2)": "0", "(1, 2)": "0", "(2, 2)": "0", "(3, 2)": "0", "(4, 2)": "0", "(5, 2)": "0", "(6, 2)": "0", "(7, 2)": "0", "(8, 2)": "0", "(9, 2)": "1", "(10, 2)": "0", "(11, 2)": "0", "(12, 2)": "0", "(13, 2)": "0", "(14, 2)": "0", "(15, 2)": "1", "(14, 3)": "0", "(15, 3)": "0", "(16, 3)": "0", "(16, 2)": "0", "(17, 2)": "0", "(18, 2)": "0", "(19, 2)": "0", "(20, 2)": "1", "(19, 3)": "0", "(20, 3)": "0", "(21, 3)": "0", "(21, 2)": "0", "(22, 2)": "0", "(23, 2)": "0", "(24, 2)": "0", "(25, 2)": "0", "(26, 2)": "0", "(27, 2)": "0", "(28, 2)": "0", "(29, 2)": "0", "(30, 2)": "0", "(31, 2)": "0", "(32, 2)": "0", "(33, 2)": "0", "(34, 2)": "0", "(35, 2)": "0", "(36, 2)": "0", "(37, 2)": "0", "(38, 2)": "0", "(39, 2)": "0", "(45, 2)": "1", "(45, 3)": "0", "(46, 3)": "1", "(46, 2)": "0", "(47, 2)": "0", "(48, 2)": "0", "(49, 2)": "0", "(47, 3)": "0", "(47, 4)": "0", "(46, 4)": "0", "(45, 4)": "0", "(39, 4)": "0", "(38, 4)": "0", "(37, 4)": "0", "(36, 4)": "0", "(35, 4)": "0", "(34, 4)": "0", "(33, 4)": "0", "(32, 4)": "0", "(31, 4)": "1", "(0, 3)": "0", "(1, 3)": "0", "(2, 3)": "0", "(3, 3)": "0", "(4, 3)": "0", "(5, 3)": "0", "(6, 3)": "0", "(7, 3)": "0", "(8, 3)": "0", "(9, 3)": "0", "(10, 3)": "0", "(11, 3)": "0", "(12, 3)": "0", "(13, 3)": "0", "(17, 3)": "0", "(18, 3)": "0", "(22, 3)": "0", "(23, 3)": "0", "(24, 3)": "0", "(25, 3)": "0", "(26, 3)": "0", "(27, 3)": "0", "(28, 3)": "0", "(29, 3)": "0", "(30, 3)": "0", "(31, 3)": "0", "(32, 3)": "0", "(33, 3)": "0", "(34, 3)": "0", "(35, 3)": "0", "(36, 3)": "1", "(37, 3)": "0", "(38, 3)": "0", "(39, 3)": "1", "(48, 3)": "0", "(49, 3)": "0", "(0, 4)": "0", "(1, 4)": "1", "(2, 4)": "0", "(3, 4)": "0", "(4, 4)": "0", "(5, 4)": "0", "(6, 4)": "0", "(7, 4)": "0", "(8, 4)": "0", "(9, 4)": "0", "(10, 4)": "0", "(11, 4)": "0", "(12, 4)": "0", "(13, 4)": "0", "(14, 4)": "0", "(15, 4)": "0", "(16, 4)": "0", "(17, 4)": "0", "(18, 4)": "0", "(19, 4)": "0", "(20, 4)": "0", "(21, 4)": "0", "(22, 4)": "0", "(23, 4)": "0", "(24, 4)": "1", "(25, 4)": "0", "(26, 4)": "0", "(27, 4)": "0", "(28, 4)": "0", "(29, 4)": "0", "(30, 4)": "0", "(40, 4)": "0", "(48, 4)": "0", "(49, 4)": "1", "(0, 5)": "0", "(1, 5)": "0", "(2, 5)": "1", "(3, 5)": "0", "(4, 5)": "0", "(5, 5)": "0", "(6, 5)": "0", "(7, 5)": "0", "(8, 5)": "1", "(9, 5)": "0", "(10, 5)": "0", "(11, 5)": "0", "(12, 5)": "0", "(13, 5)": "0", "(14, 5)": "0", "(15, 5)": "1", "(16, 5)": "0", "(17, 5)": "0", "(18, 5)": "0", "(19, 5)": "0", "(20, 5)": "0", "(21, 5)": "0", "(22, 5)": "0", "(23, 5)": "0", "(24, 5)": "0", "(25, 5)": "0", "(26, 5)": "0", "(27, 5)": "0", "(28, 5)": "0", "(29, 5)": "0", "(30, 5)": "0", "(31, 5)": "0", "(32, 5)": "0", "(33, 5)": "1", "(34, 5)": "0", "(35, 5)": "1", "(36, 5)": "0", "(37, 5)": "0", "(45, 5)": "0", "(46, 5)": "0", "(47, 5)": "0", "(48, 5)": "0", "(49, 5)": "0", "(39, 6)": "1", "(0, 6)": "0", "(1, 6)": "1", "(0, 7)": "0", "(1, 7)": "0", "(2, 7)": "1", "(3, 6)": "0", "(2, 6)": "0", "(4, 6)": "0", "(5, 6)": "0", "(6, 6)": "0", "(7, 6)": "0", "(8, 6)": "0", "(9, 6)": "0", "(10, 6)": "0", "(11, 6)": "0", "(12, 6)": "1", "(13, 6)": "0", "(14, 6)": "0", "(15, 6)": "0", "(16, 6)": "0", "(17, 6)": "0", "(18, 6)": "0", "(19, 6)": "1", "(20, 6)": "0", "(21, 6)": "0", "(22, 6)": "0", "(23, 6)": "1", "(24, 6)": "0", "(25, 6)": "0", "(26, 6)": "0", "(27, 6)": "0", "(28, 6)": "0", "(29, 6)": "0", "(30, 6)": "1", "(31, 6)": "0", "(32, 6)": "1", "(31, 7)": "0", "(32, 7)": "0", "(33, 7)": "0", "(33, 6)": "0", "(34, 6)": "0", "(35, 6)": "0", "(36, 6)": "0", "(37, 6)": "0", "(38, 6)": "0", "(38, 7)": "0", "(39, 7)": "0", "(40, 7)": "0", "(40, 6)": "1", "(41, 6)": "0", "(42, 6)": "1", "(43, 6)": "1", "(44, 6)": "1", "(45, 6)": "1", "(46, 6)": "0", "(47, 6)": "0", "(48, 6)": "0", "(49, 6)": "0", "(46, 7)": "0", "(45, 7)": "0", "(44, 7)": "0", "(43, 7)": "0", "(42, 7)": "0", "(41, 7)": "0", "(37, 7)": "1", "(3, 7)": "0", "(4, 7)": "0", "(5, 7)": "0", "(6, 7)": "0", "(7, 7)": "1", "(8, 7)": "0", "(9, 7)": "0", "(10, 7)": "0", "(11, 7)": "0", "(12, 7)": "1", "(13, 7)": "1", "(14, 7)": "0", "(15, 7)": "0", "(16, 7)": "0", "(17, 7)": "0", "(18, 7)": "0", "(19, 7)": "0", "(20, 7)": "0", "(21, 7)": "0", "(22, 7)": "0", "(23, 7)": "0", "(24, 7)": "0", "(25, 7)": "0", "(26, 7)": "0", "(27, 7)": "0", "(28, 7)": "0", "(29, 7)": "1", "(28, 8)": "0", "(29, 8)": "0", "(30, 8)": "0", "(30, 7)": "1", "(34, 7)": "0", "(35, 7)": "0", "(36, 7)": "0", "(47, 7)": "0", "(48, 7)": "0", "(49, 7)": "0", "(38, 8)": "0", "(37, 8)": "0", "(36, 8)": "0", "(35, 8)": "1", "(0, 8)": "0", "(1, 8)": "0", "(2, 8)": "0", "(3, 8)": "0", "(4, 8)": "0", "(5, 8)": "0", "(6, 8)": "0", "(7, 8)": "0", "(8, 8)": "0", "(9, 8)": "0", "(10, 8)": "0", "(11, 8)": "0", "(12, 8)": "0", "(13, 8)": "0", "(14, 8)": "0", "(15, 8)": "0", "(16, 8)": "0", "(17, 8)": "0", "(18, 8)": "0", "(19, 8)": "0", "(20, 8)": "0", "(21, 8)": "0", "(22, 8)": "0", "(23, 8)": "1", "(24, 8)": "0", "(25, 8)": "0", "(26, 8)": "0", "(27, 8)": "0", "(31, 8)": "0", "(32, 8)": "0", "(33, 8)": "0", "(34, 8)": "0", "(39, 8)": "0", "(40, 8)": "0", "(41, 8)": "1", "(42, 8)": "0", "(43, 8)": "0", "(44, 8)": "0", "(45, 8)": "0", "(46, 8)": "0", "(47, 8)": "0", "(48, 8)": "0", "(49, 8)": "0", "(42, 9)": "0", "(41, 9)": "0", "(40, 9)": "0", "(39, 9)": "0", "(38, 9)": "0", "(37, 9)": "0", "(36, 9)": "0", "(35, 9)": "0", "(34, 9)": "0", "(33, 9)": "1", "(0, 9)": "0", "(1, 9)": "0", "(2, 9)": "0", "(3, 9)": "0", "(4, 9)": "0", "(5, 9)": "0", "(6, 9)": "0", "(7, 9)": "1", "(8, 9)": "0", "(9, 9)": "0", "(10, 9)": "0", "(11, 9)": "0", "(12, 9)": "1", "(13, 9)": "0", "(14, 9)": "0", "(15, 9)": "0", "(16, 9)": "0", "(17, 9)": "0", "(18, 9)": "0", "(19, 9)": "1", "(20, 9)": "0", "(21, 9)": "0", "(22, 9)": "0", "(23, 9)": "0", "(24, 9)": "0", "(25, 9)": "0", "(26, 9)": "0", "(27, 9)": "0", "(28, 9)": "0", "(29, 9)": "0", "(30, 9)": "0", "(31, 9)": "0", "(32, 9)": "0", "(43, 9)": "0", "(44, 9)": "0", "(45, 9)": "0", "(46, 9)": "0", "(47, 9)": "1", "(48, 9)": "0", "(49, 9)": "0", "(48, 10)": "0", "(47, 10)": "0", "(46, 10)": "0", "(45, 10)": "0", "(44, 10)": "0", "(43, 10)": "0", "(42, 10)": "0", "(41, 10)": "0", "(40, 10)": "0", "(39, 10)": "0", "(38, 10)": "0", "(37, 10)": "0", "(36, 10)": "0", "(35, 10)": "0", "(34, 10)": "0", "(33, 10)": "0", "(32, 10)": "0", "(31, 10)": "0", "(30, 10)": "0", "(29, 10)": "0", "(28, 10)": "0", "(27, 10)": "0", "(26, 10)": "0", "(25, 10)": "0", "(24, 10)": "0", "(23, 10)": "0", "(22, 10)": "0", "(21, 10)": "0", "(20, 10)": "0", "(19, 10)": "0", "(18, 10)": "0", "(17, 10)": "0", "(16, 10)": "0", "(15, 10)": "0", "(14, 10)": "0", "(13, 10)": "0", "(12, 10)": "0", "(11, 10)": "0", "(10, 10)": "0", "(9, 10)": "1", "(0, 10)": "0", "(1, 10)": "0", "(2, 10)": "0", "(3, 10)": "0", "(4, 10)": "0", "(5, 10)": "0", "(6, 10)": "1", "(5, 11)": "0", "(6, 11)": "0", "(7, 11)": "0", "(7, 10)": "0", "(8, 10)": "0", "(49, 10)": "0", "(10, 11)": "0", "(9, 11)": "0", "(8, 11)": "0", "(4, 11)": "0", "(3, 11)": "0", "(2, 11)": "0", "(1, 11)": "0", "(0, 11)": "0", "(11, 11)": "0", "(12, 11)": "0", "(13, 11)": "0", "(14, 11)": "0", "(15, 11)": "0", "(16, 11)": "0", "(17, 11)": "0", "(18, 11)": "0", "(19, 11)": "0", "(20, 11)": "0", "(21, 11)": "1", "(22, 11)": "0", "(23, 11)": "1", "(24, 11)": "0", "(25, 11)": "0", "(26, 11)": "0", "(27, 11)": "0", "(28, 11)": "0", "(29, 11)": "0", "(30, 11)": "1", "(31, 11)": "0", "(32, 11)": "0", "(33, 11)": "0", "(34, 11)": "0", "(35, 11)": "0", "(36, 11)": "0", "(37, 11)": "0", "(38, 11)": "0", "(39, 11)": "0", "(40, 11)": "0", "(41, 11)": "0", "(42, 11)": "0", "(43, 11)": "0", "(44, 11)": "0", "(45, 11)": "0", "(46, 11)": "0", "(47, 11)": "0", "(48, 11)": "0", "(49, 11)": "0", "(31, 12)": "0", "(30, 12)": "0", "(29, 12)": "1", "(0, 12)": "0", "(1, 12)": "0", "(2, 12)": "0", "(3, 12)": "0", "(4, 12)": "0", "(5, 12)": "0", "(6, 12)": "0", "(7, 12)": "0", "(8, 12)": "0", "(9, 12)": "0", "(10, 12)": "0", "(11, 12)": "0", "(12, 12)": "0", "(13, 12)": "0", "(14, 12)": "0", "(15, 12)": "0", "(16, 12)": "0", "(17, 12)": "0", "(18, 12)": "0", "(19, 12)": "0", "(20, 12)": "0", "(21, 12)": "0", "(22, 12)": "0", "(23, 12)": "0", "(24, 12)": "0", "(25, 12)": "1", "(26, 12)": "0", "(27, 12)": "1", "(28, 12)": "0", "(28, 13)": "0", "(29, 13)": "1", "(32, 12)": "0", "(33, 12)": "0", "(34, 12)": "0", "(35, 12)": "0", "(36, 12)": "0", "(37, 12)": "0", "(38, 12)": "0", "(39, 12)": "0", "(40, 12)": "0", "(41, 12)": "0", "(42, 12)": "0", "(43, 12)": "1", "(44, 12)": "0", "(45, 12)": "0", "(46, 12)": "1", "(47, 12)": "0", "(48, 12)": "0", "(49, 12)": "0", "(47, 13)": "0", "(46, 13)": "0", "(45, 13)": "0", "(44, 13)": "0", "(43, 13)": "0", "(42, 13)": "0", "(41, 13)": "0", "(40, 13)": "0", "(39, 13)": "0", "(38, 13)": "0", "(37, 13)": "0", "(36, 13)": "0", "(35, 13)": "0", "(34, 13)": "0", "(33, 13)": "0", "(32, 13)": "0", "(31, 13)": "0", "(30, 13)": "0", "(30, 14)": "0", "(29, 14)": "1", "(0, 13)": "0", "(1, 13)": "0", "(2, 13)": "0", "(3, 13)": "0", "(4, 13)": "0", "(5, 13)": "1", "(6, 13)": "0", "(7, 13)": "0", "(8, 13)": "0", "(9, 13)": "0", "(10, 13)": "0", "(11, 13)": "0", "(12, 13)": "0", "(13, 13)": "0", "(14, 13)": "0", "(15, 13)": "0", "(16, 13)": "0", "(17, 13)": "0", "(18, 13)": "0", "(19, 13)": "0", "(20, 13)": "0", "(21, 13)": "0", "(22, 13)": "0", "(23, 13)": "0", "(24, 13)": "0", "(25, 13)": "0", "(26, 13)": "1", "(25, 14)": "0", "(26, 14)": "0", "(27, 14)": "0", "(27, 13)": "0", "(28, 14)": "0", "(28, 15)": "1", "(48, 13)": "0", "(49, 13)": "0", "(30, 15)": "0", "(29, 15)": "0", "(29, 16)": "0", "(28, 16)": "0", "(27, 16)": "0", "(26, 16)": "0", "(25, 16)": "0", "(24, 16)": "0", "(23, 16)": "0", "(22, 16)": "0", "(21, 16)": "0", "(20, 16)": "0", "(19, 16)": "0", "(18, 16)": "0", "(17, 16)": "0", "(16, 16)": "0", "(15, 16)": "0", "(14, 16)": "1", "(0, 14)": "0", "(1, 14)": "0", "(2, 14)": "0", "(3, 14)": "0", "(4, 14)": "0", "(5, 14)": "0", "(6, 14)": "0", "(7, 14)": "0", "(8, 14)": "0", "(9, 14)": "0", "(10, 14)": "0", "(11, 14)": "1", "(12, 14)": "0", "(13, 14)": "0", "(14, 14)": "0", "(15, 14)": "0", "(16, 14)": "0", "(17, 14)": "0", "(18, 14)": "0", "(19, 14)": "0", "(20, 14)": "0", "(21, 14)": "0", "(22, 14)": "0", "(23, 14)": "0", "(24, 14)": "0", "(27, 15)": "0", "(31, 14)": "0", "(32, 14)": "0", "(33, 14)": "0", "(34, 14)": "0", "(35, 14)": "0", "(36, 14)": "0", "(37, 14)": "0", "(38, 14)": "0", "(39, 14)": "0", "(40, 14)": "0", "(41, 14)": "0", "(42, 14)": "0", "(43, 14)": "0", "(44, 14)": "0", "(45, 14)": "0", "(46, 14)": "0", "(47, 14)": "0", "(48, 14)": "0", "(49, 14)": "0", "(15, 15)": "0", "(14, 15)": "0", "(13, 15)": "0", "(12, 15)": "0", "(11, 15)": "0", "(10, 15)": "0", "(9, 15)": "0", "(8, 15)": "0", "(7, 15)": "0", "(6, 15)": "0", "(5, 15)": "0", "(4, 15)": "0", "(3, 15)": "0", "(2, 15)": "0", "(1, 15)": "0", "(0, 15)": "0", "(16, 15)": "0", "(17, 15)": "0", "(18, 15)": "0", "(19, 15)": "0", "(20, 15)": "0", "(21, 15)": "0", "(22, 15)": "0", "(23, 15)": "0", "(24, 15)": "0", "(25, 15)": "0", "(26, 15)": "0", "(31, 15)": "0", "(32, 15)": "0", "(33, 15)": "0", "(34, 15)": "0", "(35, 15)": "0", "(36, 15)": "1", "(37, 15)": "0", "(38, 15)": "1", "(39, 15)": "1", "(40, 15)": "1", "(41, 15)": "0", "(42, 15)": "1", "(43, 15)": "0", "(44, 15)": "0", "(45, 15)": "0", "(46, 15)": "0", "(47, 15)": "0", "(48, 15)": "0", "(49, 15)": "0", "(43, 16)": "0", "(42, 16)": "0", "(41, 16)": "0", "(40, 16)": "0", "(39, 16)": "0", "(38, 16)": "0", "(37, 16)": "0", "(36, 16)": "0", "(35, 16)": "0", "(34, 16)": "0", "(33, 16)": "0", "(32, 16)": "0", "(31, 16)": "0", "(30, 16)": "0", "(0, 16)": "0", "(1, 16)": "0", "(2, 16)": "0", "(3, 16)": "0", "(4, 16)": "0", "(5, 16)": "0", "(6, 16)": "0", "(7, 16)": "0", "(8, 16)": "0", "(9, 16)": "0", "(10, 16)": "0", "(11, 16)": "0", "(12, 16)": "0", "(13, 16)": "0", "(44, 16)": "0", "(45, 16)": "0", "(46, 16)": "1", "(47, 16)": "0", "(48, 16)": "0", "(49, 16)": "0", "(47, 17)": "0", "(46, 17)": "0", "(45, 17)": "0", "(44, 17)": "0", "(43, 17)": "1", "(0, 17)": "0", "(1, 17)": "0", "(2, 17)": "1", "(3, 17)": "0", "(4, 17)": "0", "(5, 17)": "0", "(6, 17)": "0", "(7, 17)": "0", "(8, 17)": "0", "(9, 17)": "0", "(10, 17)": "0", "(11, 17)": "0", "(12, 17)": "0", "(13, 17)": "0", "(14, 17)": "0", "(15, 17)": "0", "(16, 17)": "0", "(17, 17)": "0", "(18, 17)": "0", "(19, 17)": "0", "(20, 17)": "0", "(21, 17)": "0", "(22, 17)": "0", "(23, 17)": "0", "(24, 17)": "0", "(25, 17)": "1", "(26, 17)": "1", "(27, 17)": "0", "(28, 17)": "1", "(29, 17)": "0", "(30, 17)": "0", "(31, 17)": "1", "(32, 17)": "0", "(33, 17)": "0", "(34, 17)": "0", "(35, 17)": "0", "(36, 17)": "0", "(37, 17)": "0", "(38, 17)": "0", "(39, 17)": "0", "(40, 17)": "0", "(41, 17)": "0", "(42, 17)": "0", "(48, 17)": "0", "(49, 17)": "0", "(44, 18)": "0", "(43, 18)": "0", "(42, 18)": "0", "(41, 18)": "0", "(40, 18)": "0", "(39, 18)": "0", "(38, 18)": "0", "(37, 18)": "0", "(36, 18)": "0", "(35, 18)": "0", "(34, 18)": "0", "(33, 18)": "0", "(32, 18)": "0", "(31, 18)": "0", "(30, 18)": "0", "(29, 18)": "1", "(0, 18)": "0", "(1, 18)": "0", "(2, 18)": "0", "(3, 18)": "0", "(4, 18)": "0", "(5, 18)": "0", "(6, 18)": "0", "(7, 18)": "0", "(8, 18)": "0", "(9, 18)": "0", "(10, 18)": "0", "(11, 18)": "0", "(12, 18)": "0", "(13, 18)": "0", "(14, 18)": "0", "(15, 18)": "0", "(16, 18)": "0", "(17, 18)": "0", "(18, 18)": "0", "(19, 18)": "0", "(20, 18)": "0", "(21, 18)": "0", "(22, 18)": "0", "(23, 18)": "0", "(24, 18)": "0", "(25, 18)": "0", "(26, 18)": "0", "(27, 18)": "0", "(28, 18)": "0", "(28, 19)": "0", "(29, 19)": "0", "(30, 19)": "0", "(45, 18)": "0", "(46, 18)": "0", "(47, 18)": "0", "(48, 18)": "0", "(49, 18)": "1", "(0, 19)": "0", "(1, 19)": "0", "(2, 19)": "0", "(3, 19)": "0", "(4, 19)": "0", "(5, 19)": "0", "(6, 19)": "0", "(7, 19)": "0", "(8, 19)": "0", "(9, 19)": "0", "(10, 19)": "0", "(11, 19)": "0", "(12, 19)": "0", "(13, 19)": "0", "(14, 19)": "0", "(15, 19)": "0", "(16, 19)": "0", "(17, 19)": "0", "(18, 19)": "0", "(19, 19)": "0", "(20, 19)": "0", "(21, 19)": "0", "(22, 19)": "1", "(23, 19)": "0", "(24, 19)": "0", "(25, 19)": "0", "(26, 19)": "0", "(27, 19)": "0", "(31, 19)": "0", "(32, 19)": "0", "(33, 19)": "0", "(34, 19)": "0", "(35, 19)": "1", "(36, 19)": "0", "(37, 19)": "0", "(38, 19)": "0", "(39, 19)": "0", "(40, 19)": "0", "(41, 19)": "0", "(42, 19)": "0", "(43, 19)": "0", "(44, 19)": "0", "(45, 19)": "0", "(46, 19)": "0", "(47, 19)": "0", "(48, 19)": "0", "(49, 19)": "0", "(36, 20)": "0", "(35, 20)": "0", "(34, 20)": "0", "(33, 20)": "0", "(32, 20)": "0", "(31, 20)": "0", "(30, 20)": "0", "(29, 20)": "0", "(28, 20)": "0", "(27, 20)": "0", "(26, 20)": "0", "(25, 20)": "0", "(24, 20)": "0", "(23, 20)": "0", "(22, 20)": "0", "(21, 20)": "0", "(20, 20)": "0", "(19, 20)": "1", "(0, 20)": "0", "(1, 20)": "0", "(2, 20)": "1", "(3, 20)": "0", "(4, 20)": "1", "(5, 20)": "1", "(6, 20)": "0", "(7, 20)": "0", "(8, 20)": "0", "(9, 20)": "0", "(10, 20)": "0", "(11, 20)": "0", "(12, 20)": "0", "(13, 20)": "0", "(14, 20)": "0", "(15, 20)": "0", "(16, 20)": "0", "(17, 20)": "0", "(18, 20)": "1", "(37, 20)": "0", "(38, 20)": "0", "(39, 20)": "0", "(40, 20)": "0", "(41, 20)": "1", "(42, 20)": "1", "(43, 20)": "0", "(44, 20)": "0", "(45, 20)": "0", "(46, 20)": "0", "(47, 20)": "1", "(48, 20)": "0", "(49, 20)": "0", "(48, 21)": "0", "(47, 21)": "0", "(46, 21)": "0", "(45, 21)": "0", "(44, 21)": "0", "(43, 21)": "0", "(42, 21)": "0", "(41, 21)": "0", "(40, 21)": "0", "(39, 21)": "0", "(38, 21)": "0", "(37, 21)": "1", "(0, 21)": "0", "(1, 21)": "1", "(0, 22)": "0", "(1, 22)": "0", "(2, 22)": "0", "(2, 21)": "0", "(3, 21)": "0", "(4, 21)": "0", "(5, 21)": "0", "(6, 21)": "0", "(7, 21)": "0", "(8, 21)": "0", "(9, 21)": "0", "(10, 21)": "0", "(11, 21)": "0", "(12, 21)": "0", "(13, 21)": "0", "(14, 21)": "0", "(15, 21)": "0", "(16, 21)": "0", "(17, 21)": "0", "(18, 21)": "0", "(19, 21)": "0", "(20, 21)": "1", "(21, 21)": "0", "(22, 21)": "0", "(23, 21)": "0", "(24, 21)": "0", "(25, 21)": "0", "(26, 21)": "0", "(27, 21)": "0", "(28, 21)": "0", "(29, 21)": "0", "(30, 21)": "0", "(31, 21)": "1", "(32, 21)": "0", "(33, 21)": "0", "(34, 21)": "0", "(35, 21)": "1", "(36, 21)": "0", "(49, 21)": "0", "(38, 22)": "0", "(37, 22)": "0", "(36, 22)": "0", "(35, 22)": "0", "(34, 22)": "0", "(33, 22)": "0", "(32, 22)": "0", "(31, 22)": "0", "(30, 22)": "0", "(29, 22)": "0", "(28, 22)": "0", "(27, 22)": "0", "(26, 22)": "0", "(25, 22)": "0", "(24, 22)": "0", "(23, 22)": "0", "(22, 22)": "0", "(21, 22)": "0", "(20, 22)": "0", "(19, 22)": "0", "(18, 22)": "0", "(17, 22)": "0", "(16, 22)": "0", "(15, 22)": "0", "(14, 22)": "0", "(13, 22)": "0", "(12, 22)": "0", "(11, 22)": "0", "(10, 22)": "0", "(9, 22)": "0", "(8, 22)": "0", "(7, 22)": "0", "(6, 22)": "0", "(5, 22)": "1", "(3, 22)": "0", "(4, 22)": "1", "(39, 22)": "0", "(40, 22)": "0", "(41, 22)": "0", "(42, 22)": "0", "(43, 22)": "0", "(44, 22)": "0", "(45, 22)": "0", "(46, 22)": "0", "(47, 22)": "0", "(48, 22)": "0", "(49, 22)": "0", "(6, 23)": "0", "(5, 23)": "0", "(4, 23)": "0", "(3, 23)": "0", "(2, 23)": "0", "(1, 23)": "0", "(0, 23)": "0", "(7, 23)": "1", "(8, 23)": "0", "(9, 23)": "0", "(10, 23)": "0", "(11, 23)": "0", "(12, 23)": "0", "(13, 23)": "0", "(14, 23)": "0", "(15, 23)": "1", "(16, 23)": "0", "(17, 23)": "0", "(18, 23)": "0", "(19, 23)": "0", "(20, 23)": "0", "(21, 23)": "0", "(22, 23)": "0", "(23, 23)": "0", "(24, 23)": "0", "(25, 23)": "0", "(26, 23)": "0", "(27, 23)": "0", "(28, 23)": "0", "(29, 23)": "0", "(30, 23)": "1", "(31, 23)": "0", "(32, 23)": "0", "(33, 23)": "0", "(34, 23)": "0", "(35, 23)": "0", "(36, 23)": "0", "(37, 23)": "0", "(38, 23)": "0", "(39, 23)": "0", "(40, 23)": "0", "(41, 23)": "0", "(42, 23)": "0", "(43, 23)": "0", "(44, 23)": "0", "(45, 23)": "0", "(46, 23)": "0", "(47, 23)": "0", "(48, 23)": "0", "(49, 23)": "0", "(31, 24)": "0", "(30, 24)": "0", "(29, 24)": "0", "(28, 24)": "0", "(27, 24)": "0", "(26, 24)": "0", "(25, 24)": "0", "(24, 24)": "0", "(23, 24)": "0", "(22, 24)": "1", "(0, 24)": "0", "(1, 24)": "0", "(2, 24)": "0", "(3, 24)": "0", "(4, 24)": "0", "(5, 24)": "0", "(6, 24)": "0", "(7, 24)": "0", "(8, 24)": "0", "(9, 24)": "0", "(10, 24)": "0", "(11, 24)": "0", "(12, 24)": "0", "(13, 24)": "0", "(14, 24)": "0", "(15, 24)": "0", "(16, 24)": "0", "(17, 24)": "0", "(18, 24)": "0", "(19, 24)": "0", "(20, 24)": "0", "(21, 24)": "0", "(32, 24)": "0", "(33, 24)": "0", "(34, 24)": "1", "(35, 24)": "0", "(36, 24)": "0", "(37, 24)": "0", "(38, 24)": "0", "(39, 24)": "0", "(40, 24)": "0", "(41, 24)": "0", "(42, 24)": "0", "(43, 24)": "1", "(44, 24)": "0", "(45, 24)": "0", "(46, 24)": "0", "(47, 24)": "1", "(48, 24)": "0", "(49, 24)": "0", "(48, 25)": "0", "(47, 25)": "0", "(46, 25)": "0", "(45, 25)": "0", "(44, 25)": "0", "(43, 25)": "0", "(42, 25)": "0", "(41, 25)": "0", "(40, 25)": "0", "(39, 25)": "0", "(38, 25)": "0", "(37, 25)": "0", "(36, 25)": "0", "(35, 25)": "0", "(34, 25)": "0", "(33, 25)": "0", "(32, 25)": "0", "(31, 25)": "0", "(30, 25)": "0", "(29, 25)": "0", "(28, 25)": "0", "(27, 25)": "0", "(26, 25)": "0", "(25, 25)": "0", "(24, 25)": "0", "(23, 25)": "0", "(22, 25)": "0", "(21, 25)": "0", "(20, 25)": "0", "(19, 25)": "0", "(18, 25)": "0", "(17, 25)": "0", "(16, 25)": "0", "(15, 25)": "0", "(14, 25)": "0", "(13, 25)": "0", "(12, 25)": "0", "(11, 25)": "0", "(10, 25)": "0", "(9, 25)": "0", "(8, 25)": "0", "(7, 25)": "0", "(6, 25)": "0", "(5, 25)": "0", "(4, 25)": "0", "(3, 25)": "0", "(2, 25)": "0", "(1, 25)": "0", "(0, 25)": "0", "(49, 25)": "0", "(0, 26)": "0", "(1, 26)": "0", "(2, 26)": "1", "(3, 26)": "0", "(4, 26)": "1", "(5, 26)": "0", "(6, 26)": "0", "(7, 26)": "0", "(8, 26)": "0", "(9, 26)": "0", "(10, 26)": "0", "(11, 26)": "0", "(12, 26)": "0", "(13, 26)": "1", "(14, 26)": "0", "(15, 26)": "1", "(16, 26)": "0", "(17, 26)": "0", "(18, 26)": "0", "(19, 26)": "0", "(20, 26)": "0", "(21, 26)": "0", "(22, 26)": "0", "(23, 26)": "0", "(24, 26)": "0", "(25, 26)": "0", "(26, 26)": "1", "(27, 26)": "0", "(28, 26)": "0", "(29, 26)": "0", "(30, 26)": "0", "(31, 26)": "0", "(32, 26)": "0", "(33, 26)": "0", "(34, 26)": "0", "(35, 26)": "0", "(36, 26)": "1", "(37, 26)": "1", "(38, 26)": "0", "(39, 26)": "0", "(40, 26)": "1", "(41, 26)": "0", "(42, 26)": "0", "(43, 26)": "0", "(44, 26)": "0", "(45, 26)": "0", "(46, 26)": "0", "(47, 26)": "0", "(48, 26)": "0", "(49, 26)": "1", "(0, 27)": "0", "(1, 27)": "0", "(2, 27)": "0", "(3, 27)": "0", "(4, 27)": "0", "(5, 27)": "0", "(6, 27)": "0", "(7, 27)": "0", "(8, 27)": "0", "(9, 27)": "0", "(10, 27)": "1", "(11, 27)": "0", "(12, 27)": "0", "(13, 27)": "0", "(14, 27)": "0", "(15, 27)": "0", "(16, 27)": "0", "(17, 27)": "0", "(18, 27)": "0", "(19, 27)": "0", "(20, 27)": "1", "(21, 27)": "0", "(22, 27)": "0", "(23, 27)": "0", "(24, 27)": "0", "(25, 27)": "0", "(26, 27)": "0", "(27, 27)": "0", "(28, 27)": "0", "(29, 27)": "0", "(30, 27)": "0", "(31, 27)": "0", "(32, 27)": "0", "(33, 27)": "0", "(34, 27)": "0", "(35, 27)": "0", "(36, 27)": "0", "(37, 27)": "0", "(38, 27)": "0", "(39, 27)": "0", "(40, 27)": "0", "(41, 27)": "1", "(42, 27)": "0", "(43, 27)": "0", "(44, 27)": "0", "(45, 27)": "0", "(46, 27)": "0", "(47, 27)": "0", "(48, 27)": "0", "(49, 27)": "0", "(42, 28)": "0", "(41, 28)": "0", "(40, 28)": "0", "(39, 28)": "0", "(38, 28)": "1", "(0, 28)": "0", "(1, 28)": "0", "(2, 28)": "0", "(3, 28)": "0", "(4, 28)": "0", "(5, 28)": "0", "(6, 28)": "0", "(7, 28)": "0", "(8, 28)": "0", "(9, 28)": "0", "(10, 28)": "0", "(11, 28)": "0", "(12, 28)": "0", "(13, 28)": "0", "(14, 28)": "0", "(15, 28)": "0", "(16, 28)": "0", "(17, 28)": "0", "(18, 28)": "1", "(19, 28)": "0", "(20, 28)": "0", "(21, 28)": "0", "(22, 28)": "0", "(23, 28)": "0", "(24, 28)": "0", "(25, 28)": "0", "(26, 28)": "0", "(27, 28)": "0", "(28, 28)": "0", "(29, 28)": "0", "(30, 28)": "0", "(31, 28)": "0", "(32, 28)": "0", "(33, 28)": "1", "(34, 28)": "0", "(35, 28)": "0", "(36, 28)": "0", "(37, 28)": "0", "(43, 28)": "0", "(44, 28)": "0", "(45, 28)": "0", "(46, 28)": "0", "(47, 28)": "0", "(48, 28)": "0", "(49, 28)": "0", "(39, 29)": "0", "(38, 29)": "0", "(37, 29)": "1", "(0, 29)": "0", "(1, 29)": "0", "(2, 29)": "0", "(3, 29)": "0", "(4, 29)": "0", "(5, 29)": "0", "(6, 29)": "0", "(7, 29)": "0", "(8, 29)": "0", "(9, 29)": "0", "(10, 29)": "0", "(11, 29)": "0", "(12, 29)": "0", "(13, 29)": "0", "(14, 29)": "0", "(15, 29)": "1", "(16, 29)": "0", "(17, 29)": "0", "(18, 29)": "1", "(19, 29)": "0", "(20, 29)": "0", "(21, 29)": "0", "(22, 29)": "0", "(23, 29)": "0", "(24, 29)": "1", "(25, 29)": "1", "(26, 29)": "0", "(27, 29)": "0", "(28, 29)": "1", "(29, 29)": "0", "(30, 29)": "0", "(31, 29)": "0", "(32, 29)": "0", "(33, 29)": "0", "(34, 29)": "1", "(35, 29)": "0", "(36, 29)": "0", "(36, 30)": "0", "(37, 30)": "0", "(38, 30)": "0", "(40, 29)": "0", "(41, 29)": "0", "(42, 29)": "0", "(43, 29)": "0", "(44, 29)": "0", "(45, 29)": "0", "(46, 29)": "0", "(47, 29)": "0", "(48, 29)": "0", "(49, 29)": "0", "(35, 30)": "0", "(34, 30)": "0", "(33, 30)": "0", "(32, 30)": "0", "(31, 30)": "0", "(30, 30)": "0", "(29, 30)": "0", "(28, 30)": "0", "(27, 30)": "0", "(26, 30)": "0", "(25, 30)": "0", "(24, 30)": "0", "(23, 30)": "1", "(0, 30)": "0", "(1, 30)": "0", "(2, 30)": "0", "(3, 30)": "0", "(4, 30)": "0", "(5, 30)": "0", "(6, 30)": "0", "(7, 30)": "0", "(8, 30)": "0", "(9, 30)": "0", "(10, 30)": "0", "(11, 30)": "0", "(12, 30)": "0", "(13, 30)": "0", "(14, 30)": "0", "(15, 30)": "0", "(16, 30)": "0", "(17, 30)": "0", "(18, 30)": "0", "(19, 30)": "1", "(20, 30)": "0", "(21, 30)": "0", "(22, 30)": "0", "(22, 31)": "0", "(23, 31)": "0", "(24, 31)": "0", "(39, 30)": "0", "(40, 30)": "0", "(41, 30)": "0", "(42, 30)": "0", "(43, 30)": "0", "(44, 30)": "0", "(45, 30)": "0", "(46, 30)": "0", "(47, 30)": "0", "(48, 30)": "0", "(49, 30)": "0", "(21, 31)": "0", "(20, 31)": "0", "(19, 31)": "0", "(18, 31)": "0", "(17, 31)": "1", "(0, 31)": "0", "(1, 31)": "0", "(2, 31)": "0", "(3, 31)": "0", "(4, 31)": "0", "(5, 31)": "0", "(6, 31)": "0", "(7, 31)": "0", "(8, 31)": "0", "(9, 31)": "0", "(10, 31)": "1", "(11, 31)": "0", "(12, 31)": "1", "(13, 31)": "0", "(14, 31)": "0", "(15, 31)": "0", "(16, 31)": "0", "(25, 31)": "1", "(26, 31)": "0", "(27, 31)": "0", "(28, 31)": "0", "(29, 31)": "0", "(30, 31)": "0", "(31, 31)": "0", "(32, 31)": "0", "(33, 31)": "0", "(34, 31)": "0", "(35, 31)": "0", "(36, 31)": "0", "(37, 31)": "0", "(38, 31)": "0", "(39, 31)": "0", "(40, 31)": "0", "(41, 31)": "0", "(42, 31)": "0", "(43, 31)": "0", "(44, 31)": "0", "(45, 31)": "0", "(46, 31)": "0", "(47, 31)": "0", "(48, 31)": "0", "(49, 31)": "0", "(26, 32)": "0", "(25, 32)": "0", "(24, 32)": "0", "(23, 32)": "0", "(22, 32)": "0", "(21, 32)": "0", "(20, 32)": "0", "(19, 32)": "0", "(18, 32)": "0", "(17, 32)": "0", "(16, 32)": "0", "(15, 32)": "1", "(0, 32)": "0", "(1, 32)": "1", "(2, 32)": "0", "(3, 32)": "0", "(4, 32)": "0", "(5, 32)": "0", "(6, 32)": "0", "(7, 32)": "0", "(8, 32)": "0", "(9, 32)": "1", "(8, 33)": "0", "(9, 33)": "0", "(10, 33)": "0", "(10, 32)": "0", "(11, 32)": "0", "(12, 32)": "0", "(13, 32)": "0", "(14, 32)": "0", "(27, 32)": "0", "(28, 32)": "0", "(29, 32)": "0", "(30, 32)": "0", "(31, 32)": "0", "(32, 32)": "1", "(33, 32)": "0", "(34, 32)": "0", "(35, 32)": "0", "(36, 32)": "0", "(37, 32)": "0", "(38, 32)": "0", "(39, 32)": "0", "(40, 32)": "0", "(41, 32)": "1", "(42, 32)": "1", "(43, 32)": "0", "(44, 32)": "0", "(45, 32)": "0", "(46, 32)": "0", "(47, 32)": "0", "(48, 32)": "0", "(49, 32)": "0", "(43, 33)": "0", "(42, 33)": "0", "(41, 33)": "0", "(40, 33)": "0", "(39, 33)": "0", "(38, 33)": "0", "(37, 33)": "0", "(36, 33)": "1", "(0, 33)": "0", "(1, 33)": "0", "(2, 33)": "0", "(3, 33)": "0", "(4, 33)": "0", "(5, 33)": "0", "(6, 33)": "1", "(7, 33)": "0", "(11, 33)": "1", "(12, 33)": "0", "(13, 33)": "0", "(14, 33)": "0", "(15, 33)": "0", "(16, 33)": "0", "(17, 33)": "0", "(18, 33)": "0", "(19, 33)": "0", "(20, 33)": "0", "(21, 33)": "1", "(22, 33)": "0", "(23, 33)": "0", "(24, 33)": "0", "(25, 33)": "0", "(26, 33)": "0", "(27, 33)": "0", "(28, 33)": "1", "(29, 33)": "0", "(30, 33)": "0", "(31, 33)": "0", "(32, 33)": "0", "(33, 33)": "0", "(34, 33)": "0", "(35, 33)": "1", "(44, 33)": "0", "(45, 33)": "0", "(46, 33)": "1", "(47, 33)": "0", "(48, 33)": "0", "(49, 33)": "0", "(47, 34)": "0", "(46, 34)": "0", "(45, 34)": "0", "(44, 34)": "0", "(43, 34)": "0", "(42, 34)": "0", "(41, 34)": "0", "(40, 34)": "0", "(39, 34)": "0", "(38, 34)": "0", "(37, 34)": "0", "(36, 34)": "0", "(35, 34)": "0", "(34, 34)": "0", "(33, 34)": "0", "(32, 34)": "0", "(31, 34)": "0", "(30, 34)": "0", "(29, 34)": "0", "(28, 34)": "0", "(27, 34)": "0", "(26, 34)": "0", "(25, 34)": "0", "(24, 34)": "0", "(23, 34)": "0", "(22, 34)": "0", "(21, 34)": "0", "(20, 34)": "0", "(19, 34)": "0", "(18, 34)": "0", "(17, 34)": "0", "(16, 34)": "0", "(15, 34)": "1", "(0, 34)": "1", "(1, 34)": "0", "(2, 34)": "0", "(3, 34)": "0", "(4, 34)": "0", "(5, 34)": "0", "(6, 34)": "0", "(7, 34)": "0", "(8, 34)": "0", "(9, 34)": "0", "(10, 34)": "0", "(11, 34)": "0", "(12, 34)": "0", "(13, 34)": "0", "(14, 34)": "0", "(48, 34)": "0", "(49, 34)": "0", "(16, 35)": "0", "(15, 35)": "0", "(14, 35)": "1", "(1, 35)": "0", "(0, 35)": "0", "(2, 35)": "0", "(3, 35)": "0", "(4, 35)": "0", "(5, 35)": "0", "(6, 35)": "1", "(7, 35)": "0", "(8, 35)": "0", "(9, 35)": "0", "(10, 35)": "0", "(11, 35)": "0", "(12, 35)": "0", "(13, 35)": "0", "(13, 36)": "0", "(14, 36)": "0", "(15, 36)": "1", "(17, 35)": "0", "(18, 35)": "1", "(19, 35)": "0", "(20, 35)": "0", "(21, 35)": "0", "(22, 35)": "0", "(23, 35)": "0", "(24, 35)": "0", "(25, 35)": "0", "(26, 35)": "0", "(27, 35)": "0", "(28, 35)": "0", "(29, 35)": "0", "(30, 35)": "0", "(31, 35)": "0", "(32, 35)": "0", "(33, 35)": "0", "(34, 35)": "1", "(35, 35)": "0", "(36, 35)": "0", "(37, 35)": "0", "(38, 35)": "0", "(39, 35)": "0", "(40, 35)": "0", "(41, 35)": "0", "(42, 35)": "0", "(43, 35)": "0", "(44, 35)": "0", "(45, 35)": "0", "(46, 35)": "0", "(47, 35)": "0", "(48, 35)": "0", "(49, 35)": "1", "(0, 36)": "0", "(1, 36)": "0", "(2, 36)": "0", "(3, 36)": "0", "(4, 36)": "1", "(5, 36)": "0", "(6, 36)": "0", "(7, 36)": "0", "(8, 36)": "0", "(9, 36)": "0", "(10, 36)": "0", "(11, 36)": "1", "(12, 36)": "0", "(14, 37)": "0", "(15, 37)": "1", "(16, 36)": "0", "(17, 36)": "0", "(18, 36)": "0", "(19, 36)": "0", "(20, 36)": "0", "(21, 36)": "0", "(22, 36)": "0", "(23, 36)": "0", "(24, 36)": "0", "(25, 36)": "0", "(26, 36)": "0", "(27, 36)": "0", "(28, 36)": "0", "(29, 36)": "0", "(30, 36)": "0", "(31, 36)": "0", "(32, 36)": "0", "(33, 36)": "0", "(34, 36)": "0", "(35, 36)": "0", "(36, 36)": "0", "(37, 36)": "0", "(38, 36)": "0", "(39, 36)": "0", "(40, 36)": "0", "(41, 36)": "0", "(42, 36)": "0", "(43, 36)": "0", "(44, 36)": "0", "(45, 36)": "0", "(46, 36)": "0", "(47, 36)": "0", "(48, 36)": "0", "(49, 36)": "0", "(16, 37)": "0", "(16, 38)": "0", "(15, 38)": "0", "(14, 38)": "0", "(13, 38)": "0", "(12, 38)": "0", "(11, 38)": "0", "(10, 38)": "0", "(9, 38)": "0", "(8, 38)": "0", "(7, 38)": "0", "(6, 38)": "0", "(5, 38)": "0", "(4, 38)": "0", "(3, 38)": "0", "(2, 38)": "0", "(1, 38)": "0", "(0, 38)": "0", "(0, 37)": "0", "(1, 37)": "0", "(2, 37)": "0", "(3, 37)": "0", "(4, 37)": "0", "(5, 37)": "0", "(6, 37)": "0", "(7, 37)": "0", "(8, 37)": "0", "(9, 37)": "0", "(10, 37)": "1", "(11, 37)": "0", "(12, 37)": "0", "(13, 37)": "0", "(17, 37)": "1", "(18, 37)": "0", "(19, 37)": "0", "(20, 37)": "0", "(21, 37)": "0", "(22, 37)": "0", "(23, 37)": "0", "(24, 37)": "0", "(25, 37)": "1", "(26, 37)": "0", "(27, 37)": "0", "(28, 37)": "0", "(29, 37)": "0", "(30, 37)": "0", "(31, 37)": "0", "(32, 37)": "0", "(33, 37)": "0", "(34, 37)": "0", "(35, 37)": "0", "(36, 37)": "0", "(37, 37)": "0", "(38, 37)": "0", "(39, 37)": "0", "(40, 37)": "0", "(41, 37)": "0", "(42, 37)": "0", "(43, 37)": "0", "(44, 37)": "0", "(45, 37)": "0", "(46, 37)": "0", "(47, 37)": "1", "(48, 37)": "0", "(49, 37)": "0", "(48, 38)": "0", "(47, 38)": "0", "(46, 38)": "0", "(45, 38)": "0", "(44, 38)": "0", "(43, 38)": "1", "(17, 38)": "0", "(18, 38)": "0", "(19, 38)": "0", "(20, 38)": "0", "(21, 38)": "0", "(22, 38)": "0", "(23, 38)": "0", "(24, 38)": "0", "(25, 38)": "0", "(26, 38)": "0", "(27, 38)": "0", "(28, 38)": "0", "(29, 38)": "0", "(30, 38)": "0", "(31, 38)": "0", "(32, 38)": "0", "(33, 38)": "0", "(34, 38)": "0", "(35, 38)": "0", "(36, 38)": "0", "(37, 38)": "0", "(38, 38)": "0", "(39, 38)": "0", "(40, 38)": "0", "(41, 38)": "0", "(42, 38)": "0", "(49, 38)": "0", "(44, 39)": "0", "(43, 39)": "0", "(42, 39)": "0", "(41, 39)": "0", "(40, 39)": "0", "(39, 39)": "0", "(38, 39)": "0", "(37, 39)": "0", "(36, 39)": "0", "(35, 39)": "0", "(34, 39)": "0", "(33, 39)": "0", "(32, 39)": "0", "(31, 39)": "0", "(30, 39)": "0", "(29, 39)": "0", "(28, 39)": "0", "(27, 39)": "0", "(26, 39)": "0", "(25, 39)": "0", "(24, 39)": "0", "(23, 39)": "0", "(22, 39)": "0", "(21, 39)": "0", "(20, 39)": "0", "(19, 39)": "0", "(18, 39)": "0", "(17, 39)": "0", "(16, 39)": "0", "(15, 39)": "0", "(14, 39)": "0", "(13, 39)": "0", "(12, 39)": "0", "(11, 39)": "0", "(10, 39)": "0", "(9, 39)": "0", "(8, 39)": "0", "(7, 39)": "0", "(6, 39)": "0", "(5, 39)": "0", "(4, 39)": "0", "(3, 39)": "0", "(2, 39)": "0", "(1, 39)": "0", "(0, 39)": "0", "(45, 39)": "0", "(46, 39)": "0", "(47, 39)": "0", "(48, 39)": "0", "(49, 39)": "0", "(0, 40)": "0", "(1, 40)": "0", "(2, 40)": "0", "(3, 40)": "0", "(4, 40)": "0", "(5, 40)": "0", "(6, 40)": "0", "(7, 40)": "0", "(8, 40)": "0", "(9, 40)": "1", "(10, 40)": "0", "(11, 40)": "0", "(12, 40)": "0", "(13, 40)": "0", "(14, 40)": "0", "(15, 40)": "0", "(16, 40)": "0", "(17, 40)": "0", "(18, 40)": "0", "(19, 40)": "0", "(20, 40)": "0", "(21, 40)": "0", "(22, 40)": "1", "(23, 40)": "0", "(24, 40)": "0", "(25, 40)": "1", "(26, 40)": "0", "(27, 40)": "0", "(28, 40)": "0", "(29, 40)": "0", "(30, 40)": "0", "(31, 40)": "0", "(32, 40)": "0", "(33, 40)": "0", "(34, 40)": "0", "(35, 40)": "0", "(36, 40)": "0", "(37, 40)": "0", "(38, 40)": "0", "(39, 40)": "0", "(40, 40)": "0", "(41, 40)": "0", "(42, 40)": "0", "(43, 40)": "0", "(44, 40)": "1", "(45, 40)": "0", "(46, 40)": "0", "(47, 40)": "0", "(48, 40)": "0", "(49, 40)": "0", "(45, 41)": "0", "(44, 41)": "1", "(0, 41)": "0", "(1, 41)": "0", "(2, 41)": "0", "(3, 41)": "0", "(4, 41)": "0", "(5, 41)": "0", "(6, 41)": "0", "(7, 41)": "0", "(8, 41)": "0", "(9, 41)": "0", "(10, 41)": "0", "(11, 41)": "0", "(12, 41)": "0", "(13, 41)": "0", "(14, 41)": "0", "(15, 41)": "0", "(16, 41)": "0", "(17, 41)": "0", "(18, 41)": "0", "(19, 41)": "1", "(20, 41)": "0", "(21, 41)": "0", "(22, 41)": "0", "(23, 41)": "0", "(24, 41)": "0", "(25, 41)": "0", "(26, 41)": "0", "(27, 41)": "0", "(28, 41)": "0", "(29, 41)": "0", "(30, 41)": "0", "(31, 41)": "0", "(32, 41)": "0", "(33, 41)": "0", "(34, 41)": "0", "(35, 41)": "0", "(36, 41)": "0", "(37, 41)": "0", "(38, 41)": "0", "(39, 41)": "0", "(40, 41)": "0", "(41, 41)": "0", "(42, 41)": "0", "(43, 41)": "0", "(43, 42)": "0", "(44, 42)": "1", "(46, 41)": "1", "(47, 41)": "1", "(48, 41)": "1", "(49, 41)": "0", "(49, 42)": "0", "(48, 42)": "0", "(47, 42)": "0", "(46, 42)": "0", "(45, 42)": "0", "(45, 43)": "0", "(44, 43)": "0", "(43, 43)": "0", "(42, 43)": "0", "(41, 43)": "0", "(40, 43)": "0", "(39, 43)": "0", "(38, 43)": "0", "(37, 43)": "1", "(0, 42)": "0", "(1, 42)": "0", "(2, 42)": "0", "(3, 42)": "0", "(4, 42)": "0", "(5, 42)": "0", "(6, 42)": "0", "(7, 42)": "1", "(8, 42)": "0", "(9, 42)": "0", "(10, 42)": "0", "(11, 42)": "0", "(12, 42)": "0", "(13, 42)": "0", "(14, 42)": "0", "(15, 42)": "0", "(16, 42)": "0", "(17, 42)": "0", "(18, 42)": "0", "(19, 42)": "0", "(20, 42)": "0", "(21, 42)": "0", "(22, 42)": "0", "(23, 42)": "0", "(24, 42)": "0", "(25, 42)": "0", "(26, 42)": "0", "(27, 42)": "0", "(28, 42)": "0", "(29, 42)": "0", "(30, 42)": "0", "(31, 42)": "1", "(32, 42)": "0", "(33, 42)": "0", "(34, 42)": "0", "(35, 42)": "0", "(36, 42)": "0", "(37, 42)": "0", "(38, 42)": "0", "(39, 42)": "0", "(40, 42)": "0", "(41, 42)": "0", "(42, 42)": "0", "(32, 43)": "0", "(31, 43)": "0", "(30, 43)": "0", "(29, 43)": "1", "(0, 43)": "0", "(1, 43)": "0", "(2, 43)": "0", "(3, 43)": "0", "(4, 43)": "0", "(5, 43)": "0", "(6, 43)": "1", "(5, 44)": "0", "(6, 44)": "0", "(7, 44)": "0", "(7, 43)": "0", "(8, 43)": "0", "(9, 43)": "0", "(10, 43)": "0", "(11, 43)": "0", "(12, 43)": "1", "(13, 43)": "0", "(14, 43)": "0", "(15, 43)": "0", "(16, 43)": "0", "(17, 43)": "0", "(18, 43)": "0", "(19, 43)": "0", "(20, 43)": "0", "(21, 43)": "1", "(22, 43)": "0", "(23, 43)": "1", "(24, 43)": "0", "(25, 43)": "0", "(26, 43)": "0", "(27, 43)": "1", "(28, 43)": "0", "(33, 43)": "0", "(34, 43)": "1", "(35, 43)": "0", "(36, 43)": "0", "(46, 43)": "0", "(47, 43)": "0", "(48, 43)": "0", "(49, 43)": "0", "(38, 44)": "0", "(37, 44)": "0", "(36, 44)": "0", "(35, 44)": "0", "(34, 44)": "0", "(33, 44)": "0", "(32, 44)": "0", "(31, 44)": "0", "(30, 44)": "0", "(29, 44)": "0", "(28, 44)": "0", "(27, 44)": "0", "(26, 44)": "1", "(0, 44)": "1", "(1, 44)": "0", "(2, 44)": "0", "(3, 44)": "0", "(4, 44)": "0", "(8, 44)": "0", "(9, 44)": "0", "(10, 44)": "0", "(11, 44)": "0", "(12, 44)": "0", "(13, 44)": "0", "(14, 44)": "0", "(15, 44)": "0", "(16, 44)": "0", "(17, 44)": "0", "(18, 44)": "1", "(19, 44)": "0", "(20, 44)": "0", "(21, 44)": "0", "(22, 44)": "0", "(23, 44)": "0", "(24, 44)": "0", "(25, 44)": "0", "(25, 45)": "0", "(26, 45)": "0", "(27, 45)": "0", "(39, 44)": "0", "(40, 44)": "0", "(41, 44)": "0", "(42, 44)": "0", "(43, 44)": "0", "(44, 44)": "0", "(45, 44)": "0", "(46, 44)": "1", "(47, 44)": "0", "(48, 44)": "0", "(49, 44)": "0", "(47, 45)": "0", "(46, 45)": "0", "(45, 45)": "0", "(44, 45)": "0", "(43, 45)": "0", "(42, 45)": "1", "(1, 45)": "0", "(0, 45)": "1", "(2, 45)": "1", "(3, 45)": "0", "(4, 45)": "0", "(5, 45)": "1", "(6, 45)": "0", "(7, 45)": "0", "(8, 45)": "0", "(9, 45)": "0", "(10, 45)": "0", "(11, 45)": "0", "(12, 45)": "0", "(13, 45)": "0", "(14, 45)": "0", "(15, 45)": "0", "(16, 45)": "0", "(17, 45)": "0", "(18, 45)": "1", "(19, 45)": "0", "(20, 45)": "0", "(21, 45)": "0", "(22, 45)": "0", "(23, 45)": "0", "(24, 45)": "1", "(28, 45)": "0", "(29, 45)": "0", "(30, 45)": "0", "(31, 45)": "0", "(32, 45)": "0", "(33, 45)": "0", "(34, 45)": "0", "(35, 45)": "0", "(36, 45)": "0", "(37, 45)": "1", "(38, 45)": "0", "(39, 45)": "1", "(40, 45)": "0", "(41, 45)": "0", "(48, 45)": "0", "(49, 45)": "0", "(43, 46)": "0", "(42, 46)": "0", "(41, 46)": "0", "(40, 46)": "1", "(1, 46)": "0", "(0, 46)": "0", "(2, 46)": "0", "(3, 46)": "0", "(4, 46)": "0", "(5, 46)": "0", "(6, 46)": "0", "(7, 46)": "0", "(8, 46)": "0", "(9, 46)": "0", "(10, 46)": "0", "(11, 46)": "0", "(12, 46)": "0", "(13, 46)": "0", "(14, 46)": "0", "(15, 46)": "1", "(16, 46)": "0", "(17, 46)": "0", "(18, 46)": "0", "(19, 46)": "1", "(20, 46)": "0", "(21, 46)": "0", "(22, 46)": "0", "(23, 46)": "1", "(22, 47)": "0", "(23, 47)": "0", "(24, 47)": "0", "(24, 46)": "0", "(25, 46)": "0", "(26, 46)": "0", "(27, 46)": "0", "(28, 46)": "0", "(29, 46)": "0", "(30, 46)": "0", "(31, 46)": "0", "(32, 46)": "0", "(33, 46)": "0", "(34, 46)": "0", "(35, 46)": "0", "(36, 46)": "0", "(37, 46)": "0", "(38, 46)": "1", "(37, 47)": "0", "(38, 47)": "0", "(39, 47)": "0", "(39, 46)": "1", "(44, 46)": "0", "(45, 46)": "0", "(46, 46)": "0", "(47, 46)": "0", "(48, 46)": "0", "(49, 46)": "0", "(41, 47)": "0", "(40, 47)": "1", "(0, 47)": "0", "(1, 47)": "1", "(2, 47)": "0", "(3, 47)": "0", "(4, 47)": "0", "(5, 47)": "0", "(6, 47)": "0", "(7, 47)": "0", "(8, 47)": "0", "(9, 47)": "1", "(10, 47)": "0", "(11, 47)": "0", "(12, 47)": "0", "(13, 47)": "0", "(14, 47)": "0", "(15, 47)": "0", "(16, 47)": "0", "(17, 47)": "0", "(18, 47)": "0", "(19, 47)": "1", "(20, 47)": "0", "(21, 47)": "0", "(25, 47)": "0", "(26, 47)": "0", "(27, 47)": "0", "(28, 47)": "0", "(29, 47)": "0", "(30, 47)": "0", "(31, 47)": "0", "(32, 47)": "0", "(33, 47)": "1", "(34, 47)": "1", "(35, 47)": "0", "(36, 47)": "0", "(39, 48)": "0", "(40, 48)": "0", "(41, 48)": "0", "(42, 47)": "1", "(43, 47)": "0", "(44, 47)": "0", "(45, 47)": "0", "(46, 47)": "0", "(47, 47)": "0", "(48, 47)": "0", "(49, 47)": "1", "(0, 48)": "0", "(1, 48)": "0", "(2, 48)": "0", "(3, 48)": "0", "(4, 48)": "0", "(5, 48)": "1", "(6, 48)": "0", "(7, 48)": "0", "(8, 48)": "0", "(9, 48)": "0", "(10, 48)": "0", "(11, 48)": "0", "(12, 48)": "0", "(13, 48)": "0", "(14, 48)": "0", "(15, 48)": "0", "(16, 48)": "0", "(17, 48)": "0", "(18, 48)": "0", "(19, 48)": "0", "(20, 48)": "0", "(21, 48)": "0", "(22, 48)": "0", "(23, 48)": "0", "(24, 48)": "0", "(25, 48)": "1", "(26, 48)": "0", "(27, 48)": "0", "(28, 48)": "0", "(29, 48)": "0", "(30, 48)": "0", "(31, 48)": "0", "(32, 48)": "0", "(33, 48)": "0", "(34, 48)": "0", "(35, 48)": "0", "(36, 48)": "0", "(37, 48)": "0", "(38, 48)": "0", "(42, 48)": "0", "(43, 48)": "1", "(44, 48)": "0", "(45, 48)": "0", "(46, 48)": "0", "(47, 48)": "0", "(48, 48)": "0", "(49, 48)": "0", "(44, 49)": "0", "(43, 49)": "0", "(42, 49)": "0", "(41, 49)": "0", "(40, 49)": "0", "(39, 49)": "0", "(38, 49)": "0", "(37, 49)": "0", "(36, 49)": "0", "(35, 49)": "1", "(0, 49)": "0", "(1, 49)": "0", "(2, 49)": "0", "(3, 49)": "1", "(4, 49)": "0", "(5, 49)": "0", "(6, 49)": "0", "(7, 49)": "0", "(8, 49)": "0", "(9, 49)": "0", "(10, 49)": "0", "(11, 49)": "0", "(12, 49)": "0", "(13, 49)": "0", "(14, 49)": "0", "(15, 49)": "1", "(16, 49)": "0", "(17, 49)": "1", "(18, 49)": "0", "(19, 49)": "0", "(20, 49)": "1", "(21, 49)": "0", "(22, 49)": "0", "(23, 49)": "0", "(24, 49)": "1", "(26, 49)": "0", "(25, 49)": "0", "(27, 49)": "0", "(28, 49)": "0", "(29, 49)": "0", "(30, 49)": "0", "(31, 49)": "0", "(32, 49)": "0", "(33, 49)": "0", "(34, 49)": "0", "(45, 49)": "0", "(46, 49)": "0", "(47, 49)": "1", "(48, 49)": "0", "(49, 49)": "0"} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| hxp{and_n0w_try_t0_c4tch_m3_w1th0ut_dy1ng} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import sys | |
| import random | |
| import time | |
| class FlagChar: | |
| def __init__(self, char, x, y, width, height): | |
| self.char = char | |
| self.x = x | |
| self.y = y | |
| self.width, self.height = width, height | |
| random.seed(int(time.time())) | |
| def move(self, fields): | |
| """ | |
| fields: (0,1,2,3) | |
| 1 | |
| 0 current 2 | |
| 3 | |
| True = something is there | |
| """ | |
| # 10 tries, else do not move | |
| for _ in range(10): | |
| s = random.randint(0,3) | |
| if s == 1 and (self.y <= 0 or fields[1]): | |
| continue | |
| if s == 0 and (self.x <= 0 or fields[0]): | |
| continue | |
| if s == 2 and (self.x >= (self.width - 1) or fields[2]): | |
| continue | |
| if s == 3 and (self.y >= (self.height - 1) or fields[3]): | |
| continue | |
| if s == 0: | |
| self.x -= 1 | |
| if s == 1: | |
| self.y -= 1 | |
| if s == 2: | |
| self.x += 1 | |
| if s == 3: | |
| self.y += 1 | |
| # we moved, break loop | |
| break | |
| def catch(self, x, y): | |
| if self.x == x and self.y == y: | |
| return self.char | |
| else: | |
| return None |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Sample code from https://www.redblobgames.com/pathfinding/a-star/ | |
| # Copyright 2014 Red Blob Games <redblobgames@gmail.com> | |
| # | |
| # Feel free to use this code in your own projects, including commercial projects | |
| # License: Apache v2.0 <http://www.apache.org/licenses/LICENSE-2.0.html> | |
| class SimpleGraph: | |
| def __init__(self): | |
| self.edges = {} | |
| def neighbors(self, id): | |
| return self.edges[id] | |
| example_graph = SimpleGraph() | |
| example_graph.edges = { | |
| 'A': ['B'], | |
| 'B': ['A', 'C', 'D'], | |
| 'C': ['A'], | |
| 'D': ['E', 'A'], | |
| 'E': ['B'] | |
| } | |
| import collections | |
| class Queue: | |
| def __init__(self): | |
| self.elements = collections.deque() | |
| def empty(self): | |
| return len(self.elements) == 0 | |
| def put(self, x): | |
| self.elements.append(x) | |
| def get(self): | |
| return self.elements.popleft() | |
| # utility functions for dealing with square grids | |
| def from_id_width(id, width): | |
| return (id % width, id // width) | |
| def draw_tile(graph, id, style, width): | |
| r = "." | |
| if 'number' in style and id in style['number']: r = "%d" % style['number'][id] | |
| if 'point_to' in style and style['point_to'].get(id, None) is not None: | |
| (x1, y1) = id | |
| (x2, y2) = style['point_to'][id] | |
| if x2 == x1 + 1: r = ">" | |
| if x2 == x1 - 1: r = "<" | |
| if y2 == y1 + 1: r = "v" | |
| if y2 == y1 - 1: r = "^" | |
| if 'start' in style and id == style['start']: r = "A" | |
| if 'goal' in style and id == style['goal']: r = "Z" | |
| if 'path' in style and id in style['path']: r = "@" | |
| if id in graph.walls: r = "#" * width | |
| return r | |
| def draw_grid(graph, width=2, **style): | |
| for y in range(graph.height): | |
| for x in range(graph.width): | |
| print("%%-%ds" % width % draw_tile(graph, (x, y), style, width), end="") | |
| print() | |
| # data from main article | |
| DIAGRAM1_WALLS = [from_id_width(id, width=30) for id in [21,22,51,52,81,82,93,94,111,112,123,124,133,134,141,142,153,154,163,164,171,172,173,174,175,183,184,193,194,201,202,203,204,205,213,214,223,224,243,244,253,254,273,274,283,284,303,304,313,314,333,334,343,344,373,374,403,404,433,434]] | |
| class SquareGrid: | |
| def __init__(self, width, height): | |
| self.width = width | |
| self.height = height | |
| self.walls = [] | |
| def in_bounds(self, id): | |
| (x, y) = id | |
| return 0 <= x < self.width and 0 <= y < self.height | |
| def passable(self, id): | |
| return id not in self.walls | |
| def neighbors(self, id): | |
| (x, y) = id | |
| results = [(x+1, y), (x, y-1), (x-1, y), (x, y+1)] | |
| if (x + y) % 2 == 0: results.reverse() # aesthetics | |
| results = filter(self.in_bounds, results) | |
| results = filter(self.passable, results) | |
| return results | |
| class GridWithWeights(SquareGrid): | |
| def __init__(self, width, height): | |
| super().__init__(width, height) | |
| self.weights = {} | |
| def cost(self, from_node, to_node): | |
| return self.weights.get(to_node, 1) | |
| diagram4 = GridWithWeights(10, 10) | |
| diagram4.walls = [(1, 7), (1, 8), (2, 7), (2, 8), (3, 7), (3, 8)] | |
| diagram4.weights = {loc: 5 for loc in [(3, 4), (3, 5), (4, 1), (4, 2), | |
| (4, 3), (4, 4), (4, 5), (4, 6), | |
| (4, 7), (4, 8), (5, 1), (5, 2), | |
| (5, 3), (5, 4), (5, 5), (5, 6), | |
| (5, 7), (5, 8), (6, 2), (6, 3), | |
| (6, 4), (6, 5), (6, 6), (6, 7), | |
| (7, 3), (7, 4), (7, 5)]} | |
| import heapq | |
| class PriorityQueue: | |
| def __init__(self): | |
| self.elements = [] | |
| def empty(self): | |
| return len(self.elements) == 0 | |
| def put(self, item, priority): | |
| heapq.heappush(self.elements, (priority, item)) | |
| def get(self): | |
| return heapq.heappop(self.elements)[1] | |
| def dijkstra_search(graph, start, goal): | |
| frontier = PriorityQueue() | |
| frontier.put(start, 0) | |
| came_from = {} | |
| cost_so_far = {} | |
| came_from[start] = None | |
| cost_so_far[start] = 0 | |
| while not frontier.empty(): | |
| current = frontier.get() | |
| if current == goal: | |
| break | |
| for next in graph.neighbors(current): | |
| new_cost = cost_so_far[current] + graph.cost(current, next) | |
| if next not in cost_so_far or new_cost < cost_so_far[next]: | |
| cost_so_far[next] = new_cost | |
| priority = new_cost | |
| frontier.put(next, priority) | |
| came_from[next] = current | |
| return came_from, cost_so_far | |
| # thanks to @m1sp <Jaiden Mispy> for this simpler version of | |
| # reconstruct_path that doesn't have duplicate entries | |
| def reconstruct_path(came_from, start, goal): | |
| current = goal | |
| path = [] | |
| while current != start: | |
| path.append(current) | |
| current = came_from[current] | |
| path.append(start) # optional | |
| path.reverse() # optional | |
| return path | |
| def heuristic(a, b): | |
| (x1, y1) = a | |
| (x2, y2) = b | |
| return abs(x1 - x2) + abs(y1 - y2) | |
| def a_star_search(graph, start, goal): | |
| frontier = PriorityQueue() | |
| frontier.put(start, 0) | |
| came_from = {} | |
| cost_so_far = {} | |
| came_from[start] = None | |
| cost_so_far[start] = 0 | |
| while not frontier.empty(): | |
| current = frontier.get() | |
| if current == goal: | |
| break | |
| for next in graph.neighbors(current): | |
| new_cost = cost_so_far[current] + graph.cost(current, next) | |
| if next not in cost_so_far or new_cost < cost_so_far[next]: | |
| cost_so_far[next] = new_cost | |
| priority = new_cost + heuristic(goal, next) | |
| frontier.put(next, priority) | |
| came_from[next] = current | |
| return came_from, cost_so_far |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python3 | |
| import time | |
| from flag_char import FlagChar | |
| width, height = 50, 50 | |
| mapp = [] | |
| flagstr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | |
| flagstr = flagstr[:42] | |
| player_pos = (0, 0) | |
| cnt = 0 | |
| updated_map = [] | |
| NOTHING = "0" | |
| PIT = "1" | |
| FLAG_CHAR = "2" | |
| def write_map(actual_map): | |
| mapp = [NOTHING]*(width*height+1) | |
| for y in range(50): | |
| for x in range(50): | |
| pos = (x,y) | |
| if pos in actual_map and actual_map[pos] == PIT: | |
| mapp[index(x, y)+1] = PIT | |
| else: | |
| mapp[index(x, y)+1] = NOTHING | |
| with open("map", "w+") as f: | |
| #f.write("0") | |
| for i in range(width * height): | |
| if i == 0: | |
| continue | |
| if (i % width - 1) == 0 and i > 1: | |
| f.write("\n") | |
| f.write(mapp[i]) | |
| f.write("0") | |
| def initialize_map(actual_map): | |
| global mapp, flag, flagstr, player_pos, cnt, updated_map | |
| flag = [] | |
| mapp = [NOTHING]*(width*height) | |
| for y in range(50): | |
| for x in range(50): | |
| pos = (x,y) | |
| if pos in actual_map and actual_map[pos] == PIT: | |
| mapp[index(x, y)] = PIT | |
| else: | |
| mapp[index(x, y)] = NOTHING | |
| #with open("flag.txt", "r") as f: | |
| tmp = flagstr#f.read().strip() | |
| for x, i in enumerate(tmp): | |
| flag.append(FlagChar(i, (width // 2) - (len(tmp) // 2) + x, height // 2, width, height)) | |
| print("FLAG LENGTH:") | |
| print(len(flag)) | |
| player_pos = (0, 0) | |
| cnt = 0 | |
| updated_map = mapp.copy() | |
| # build map with current flag positions | |
| for i in flag: | |
| updated_map[index(i.x, i.y)] = FLAG_CHAR | |
| flag = [] | |
| def index(x,y): | |
| return x + y * width | |
| def get_neighbor_values(m, x, y): | |
| """ | |
| return (west, north, east, south) | |
| """ | |
| w = map_pos(m, x - 1, y) | |
| n = map_pos(m, x, y - 1) | |
| e = map_pos(m, x + 1, y) | |
| s = map_pos(m, x, y + 1) | |
| return (w, n, e, s) | |
| def map_pos(m, x, y): | |
| if x < 0 or x > width - 1 or y < 0 or y > height - 1: | |
| return "wall" | |
| return m[index(x, y)] | |
| def flag_char_to_index(char): | |
| global flagstr | |
| return flagstr.index(char) | |
| def flag_char_for_pos(pos): | |
| global flag | |
| x, y = pos | |
| for i in flag: | |
| if i.x == x and i.y == y: | |
| return i.char | |
| return None | |
| def move_flag(): | |
| global flag, updated_map, player_pos | |
| px, py = player_pos | |
| updated_map[index(px, py)] = "3" | |
| for i in flag: | |
| neighbors = get_neighbor_values(updated_map, i.x, i.y) | |
| old_idx = index(i.x, i.y) | |
| i.move((neighbors[0] != NOTHING, | |
| neighbors[1] != NOTHING, | |
| neighbors[2] != NOTHING, | |
| neighbors[3] != NOTHING)) | |
| updated_map[old_idx] = NOTHING | |
| updated_map[index(i.x, i.y)] = FLAG_CHAR | |
| def check_catch(): | |
| global player_pos, flag | |
| for f in flag: | |
| caught = f.catch(player_pos[0], player_pos[1]) | |
| if caught: | |
| flag.remove(f) | |
| def tick_game(next_position): | |
| global updated_map, flag | |
| global cnt, player_pos | |
| slow = 2 | |
| player_pos = next_position | |
| check_catch() | |
| cnt += 1 | |
| if cnt % slow == 0: | |
| move_flag() | |
| updated_map = mapp.copy() | |
| # build map with current flag positions | |
| for i in flag: | |
| updated_map[index(i.x, i.y)] = FLAG_CHAR | |
| def game_loop(flag_idx): | |
| global updated_map | |
| cnt = 0 | |
| slow = 2 | |
| locations = {} | |
| while cnt < 40: | |
| updated_map = mapp.copy() | |
| # build map with current flag positions | |
| for i in flag: | |
| updated_map[index(i.x, i.y)] = FLAG_CHAR | |
| cnt += 1 | |
| if cnt % slow == 0: | |
| move_flag() | |
| f = flag[flag_idx] | |
| if (cnt > 10): | |
| locations[cnt // 2] = (f.x, f.y) | |
| return locations |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment