Skip to content

Instantly share code, notes, and snippets.

@jimon
Created September 15, 2017 20:34
Show Gist options
  • Select an option

  • Save jimon/25c00db87e692480dbed63704fa99e5c to your computer and use it in GitHub Desktop.

Select an option

Save jimon/25c00db87e692480dbed63704fa99e5c to your computer and use it in GitHub Desktop.
# 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