# hackyou 2k14: PPC - Play with me (200 points)

```# `cat game.py`
#!/usr/bin/python

from sys import argv, exit
from re import sub
from netlib import sc

def nextpos(r, c):
if c < C - 1:
c += 1
elif r < R - 1:
r += 1
c = 0
else:
r += 1
return r, c

def strike(board, row, column, solution, figures):
b = board
s = solution
f = figures
strike = False

i = column
left = [0, 0, 0]
while left[2] == 0 and 0 < i <= column:
i -= 1
left[0] = row
left[1] = i
left[2] = b[row][i]

i = column
right = [0, 0, 0]
while right[2] == 0 and column <= i < C - 1:
i += 1
right[0] = row
right[1] = i
right[2] = b[row][i]

i = row
up = [0, 0, 0]
while up[2] == 0 and 0 < i <= row:
i -= 1
up[0] = i
up[1] = column
up[2] = b[i][column]

i = row
down = [0, 0, 0]
while down[2] == 0 and row <= i < R - 1:
i += 1
down[0] = i
down[1] = column
down[2] = b[i][column]

if left[2] != 0 and (left[2] == up[2] or left[2] == right[2] or left[2] == down[2]):
b[left[0]][left[1]] = 0
f -= 1
strike = True

if up[2] != 0 and (up[2] == right[2] or up[2] == down[2] or up[2] == left[2]):
b[up[0]][up[1]] = 0
f -= 1
strike = True

if right[2] != 0 and (right[2] == down[2] or right[2] == left[2] or right[2] == up[2]):
b[right[0]][right[1]] = 0
f -= 1
strike = True

if down[2] != 0 and (down[2] == left[2] or down[2] == up[2] or down[2] == right[2]):
b[down[0]][down[1]] = 0
f -= 1
strike = True

if strike:
s.append((row, column))
game(b, 0, 0, s, f)

def send(solution, board):
global sc
s = ''
for coordinate in solution:
s += '(' + str(coordinate[0]) + ',' + str(coordinate[1]) + ');'
print s
if sc.send(s + '\n') == False:
exit()
data = sc.recv(buffsize, timeout)
print data
exit()

def game(board, row, column, solution, figures):
while row < R:
#is solution
if figures == 0:
send(solution, board);
#is not a solution
elif board[row][column] == 0:
strike(board, row, column, solution, figures)
row, column  = nextpos(row, column)

def count(board):
f = 0
for r in board:
for c in r:
if c != 0:
f += 1
return f

buffsize = 4096
max_retries = 2
pause = 0.5
timeout = 2

ip = argv[1]
port = argv[2]

C = 10
R = 20
solution = []

sc = sc(ip, port, 'tcp')
if sc.connect(max_retries, pause):
sc.recv(buffsize, timeout)
data = sc.recv(buffsize, timeout)
print data
data = data[28:-15].split('\n')
board = []
for line in data:
line = line[3:]
line = sub(r"1b5b306d|1b5b|6d30", "", line.encode('hex'))
line = sub(r"20", "0,", line)
line = sub(r"3331", "1,", line)
line = sub(r"3332", "2,", line)
line = sub(r"3333", "3,", line)
line = sub(r"3334", "4,", line)
line = sub(r"3336", "6,", line)
line = sub(r"3337", "7,", line)
line = [ int(char) for char in line[:-1].split(',')]
board.append(line)
game(board, 0, 0, solution, count(board))
# `./game.py hackyou2014tasks.ctf.su 9876`
0123456789
-----------
0|   00 00
1|  0 000
2|0   0 0 0
3|   00 00 0
4|000   000
5|     00000
6| 0    000
7|0 000   0
8|0 00 0 00
9|0 0  0 0 0
10|00 0 0 0
11|00000   0
12|0  0 0 0
13| 0  0000
14| 0 00 0  0
15| 0 00000
16|  0 0 0 0
17| 00 0 00 0
18|0 0    000
19|000  00  0
#############

(2,2);(2,3);(2,0);(2,2);(0,8);(3,3);(3,2);(3,3);(4,3);(1,3);(1,0);(1,0);(3,1);(0,9);(4,4);(4,5);(6,5);(6,1);(6,2);(7,2);(7,6);(6,8);(8,6);(9,1);(9,1);(5,0);(9,5);(9,0);(11,2);(11,2);(10,2);(11,4);(12,1);(12,6);(13,1);(13,4);(13,0);(14,0);(13,3);(14,8);(15,1);(16,2);(14,4);(17,5);(17,6);(17,1);(15,9);(15,7);(15,8);(16,9);
You win!
CTF{0a10f3f9e37d18c39e017ec8bbd5d2ea}```