Created
September 15, 2017 20:34
-
-
Save jimon/25c00db87e692480dbed63704fa99e5c 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
| # into the dim mobile game, lock puzzle fuzzer | |
| # was too lazy to figure out some lock puzzles - here a bruteforce solution | |
| class Pos: | |
| def __init__(self, x, y): | |
| self.x = x | |
| self.y = y | |
| class Map: | |
| def __init__(self, w, h): | |
| self.w = w | |
| self.h = h | |
| self.map = [0] * self.w * self.h | |
| def at(self, pos): | |
| return self.map[self.w * pos.y + pos.x] | |
| def wall(self, pos): | |
| self.map[self.w * pos.y + pos.x] = 1 | |
| def snake_body(self, pos): | |
| self.map[self.w * pos.y + pos.x] = 2 | |
| def snake_head(self, pos): | |
| self.map[self.w * pos.y + pos.x] = 3 | |
| def full(self): | |
| return all([x > 0 for x in self.map]) | |
| def debug(self): | |
| for y in range(0, self.h): | |
| print(''.join([str(self.at(Pos(x, y))) for x in range(0, self.w)])) | |
| class Snake: | |
| def __init__(self, m, pos): | |
| self.map = m | |
| self.pos = pos | |
| assert(self.map.at(self.pos) == 0) | |
| self.map.snake_head(self.pos) | |
| def step(self, pos, d): | |
| if d == 'l': | |
| return Pos(max(0, pos.x - 1), pos.y) | |
| elif d == 'r': | |
| return Pos(min(self.map.w - 1, pos.x + 1), pos.y) | |
| elif d == 't': | |
| return Pos(pos.x, max(0, pos.y - 1)) | |
| elif d == 'b': | |
| return Pos(pos.x, min(self.map.h - 1, pos.y + 1)) | |
| def move(self, d): | |
| np = self.step(self.pos, d) | |
| if self.map.at(np) > 0: | |
| return False | |
| self.map.snake_body(self.pos) | |
| while self.map.at(np) == 0: | |
| self.map.snake_body(np) | |
| op = np | |
| np = self.step(np, d) | |
| self.map.snake_head(op) | |
| self.pos = op | |
| def stuck(self): | |
| return all([self.map.at(self.step(self.pos, d)) > 0 for d in ['l', 't', 'r', 'b']]) | |
| def moves(self): | |
| return [d for d in ['l', 't', 'r', 'b'] if self.map.at(self.step(self.pos, d)) == 0] | |
| class Snakes: | |
| def __init__(self, snakes): | |
| self.snakes = snakes | |
| def move(self, d): | |
| for s in self.snakes: | |
| s.move(d) | |
| def stuck(self): | |
| return all([s.stuck() for s in self.snakes]) | |
| def moves(self): | |
| return list(set().union(*[s.moves() for s in self.snakes])) | |
| import random | |
| a = 0 | |
| while True: | |
| a = a + 1 | |
| m = Map(5, 5) # lock map size is different | |
| m.wall(Pos(3, 1)) | |
| m.wall(Pos(2, 3)) | |
| m.wall(Pos(4, 4)) | |
| s = Snakes([Snake(m, Pos(2, 2)), Snake(m, Pos(3, 2))]) | |
| seq = '' | |
| while not s.stuck(): | |
| move = random.choice(s.moves()) | |
| seq += move | |
| s.move(move) | |
| if m.full(): | |
| print("found at %i try" % a) | |
| print(seq) | |
| m.debug() | |
| break |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment