Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions 2018/may/code/first_bot.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
while True:
board, square = [int(x) for x in input().split()]

count = int(input())

moves = []
for i in range(count):
board, square = [int(x) for x in input().split()]
moves.append((board, square))

move = moves[0]
print(move[0], move[1])
50 changes: 50 additions & 0 deletions 2018/may/code/heuristic-2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from collections import namedtuple

Move = namedtuple("Move", "board square")

DIAGONALS = ((0, 4, 8), (2, 4, 6))
COLUMNS = ((0, 3, 6), (1, 4, 7), (2, 5, 8))
ROWS = ((0, 1, 2), (3, 4, 5), (6, 7, 8))
LINES = ROWS + COLUMNS + DIAGONALS

CORNERS = {0, 2, 6, 8}
CENTRE = 4


def read_move():
return Move(*map(int, input().split()))


def write_move(move):
print(move.board, move.square)


def evaluate(move):
current = boards[move.board].copy()
current[move.square] = 1

if any(sum(current[x] for x in line) == 3 for line in LINES):
return 10
if move.square in CORNERS:
return 2
if move.square == CENTRE:
return 1
return 0


boards = tuple([0 for i in range(9)] for i in range(9))

while True:
# place opponents move
enemy_move = read_move()
if enemy_move.board >= 0:
boards[enemy_move.board][enemy_move.square] = -1

count = int(input())
moves = [read_move() for i in range(count)]

move = max(moves, key=evaluate)
write_move(move)

# place my move
boards[move.board][move.square] = 1
63 changes: 63 additions & 0 deletions 2018/may/code/heuristic-3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
from copy import deepcopy
from collections import namedtuple

Move = namedtuple("Move", "board square")
State = namedtuple("State", "meta boards")

DIAGONALS = ((0, 4, 8), (2, 4, 6))
COLUMNS = ((0, 3, 6), (1, 4, 7), (2, 5, 8))
ROWS = ((0, 1, 2), (3, 4, 5), (6, 7, 8))
LINES = ROWS + COLUMNS + DIAGONALS


def read_move():
return Move(*map(int, input().split()))


def write_move(move):
print(move.board, move.square)


def has_line(board, player=1):
return any(sum(board[x] for x in line) == player * 3 for line in LINES)


def update(state, move, player):
current = state.boards[move.board]
current[move.square] = player

if has_line(current, player):
state.meta[move.board] = player

return current


def evaluate(move):
new_state = deepcopy(state)
new_board = update(new_state, move, 1)

if has_line(new_state.meta):
return 100
if has_line(new_board):
return 10
return 0


meta = [0 for i in range(9)]
boards = tuple([0 for i in range(9)] for i in range(9))
state = State(meta, boards)

while True:
# place opponents move
enemy_move = read_move()
if enemy_move.board >= 0:
update(state, enemy_move, -1)

count = int(input())
moves = [read_move() for i in range(count)]

move = max(moves, key=evaluate)
write_move(move)

# place my move
update(state, move, 1)
83 changes: 83 additions & 0 deletions 2018/may/code/heuristic-4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
from copy import deepcopy
from collections import namedtuple

Move = namedtuple("Move", "board square")
State = namedtuple("State", "meta boards")

DIAGONALS = ((0, 4, 8), (2, 4, 6))
COLUMNS = ((0, 3, 6), (1, 4, 7), (2, 5, 8))
ROWS = ((0, 1, 2), (3, 4, 5), (6, 7, 8))
LINES = ROWS + COLUMNS + DIAGONALS


def read_move():
return Move(*map(int, input().split()))


def write_move(move):
print(move.board, move.square)


def has_line(board, player=1):
return any(sum(board[x] for x in line) == player * 3 for line in LINES)


def under_threat(board):
return any(sum(board[x] for x in line) == -2 for line in LINES)


def update(state, move, player=1):
current = state.boards[move.board]
current[move.square] = player

if has_line(current, player):
state.meta[move.board] = player

return current


def evaluate(move):
new_state = deepcopy(state)
new_board = update(new_state, move)
next_board = new_state.boards[move.square]

if has_line(new_state.meta):
return 100

new_state.meta[move.square] = -1
if has_line(new_state.meta, -1) and under_threat(next_board):
return -100

if has_line(new_board):
return 10

# TODO: what if the next board is out of play (full or has a line)?
# need to check all other boards for threats

if under_threat(next_board):
return -10

# TODO: should we give extra points to moves that put the current
# board under our threat?

return 0


meta = [0 for i in range(9)]
board = tuple([0 for i in range(9)] for i in range(9))
state = State(meta, board)

while True:
# place opponents move
enemy_move = read_move()
if enemy_move.board >= 0:
update(state, enemy_move, -1)

count = int(input())
moves = [read_move() for i in range(count)]

move = max(moves, key=evaluate)
write_move(move)

# place my move
update(state, move)
32 changes: 32 additions & 0 deletions 2018/may/code/heuristic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from collections import namedtuple

Move = namedtuple("Move", "board square")

CORNERS = {0, 2, 6, 8}
CENTRE = 4


def read_move():
return Move(*map(int, input().split()))


def write_move(move):
print(move.board, move.square)


def evaluate(move):
if move.square in CORNERS:
return 2
if move.square == CENTRE:
return 1
return 0


while True:
enemy_move = read_move()

count = int(input())
moves = [read_move() for i in range(count)]

move = max(moves, key=evaluate)
write_move(move)
Loading