summaryrefslogtreecommitdiff
path: root/bots
diff options
context:
space:
mode:
Diffstat (limited to 'bots')
-rwxr-xr-xbots/peter.py83
-rwxr-xr-xbots/peter_smart.py131
-rwxr-xr-xbots/peter_smart2.py135
3 files changed, 349 insertions, 0 deletions
diff --git a/bots/peter.py b/bots/peter.py
new file mode 100755
index 0000000..72bbc95
--- /dev/null
+++ b/bots/peter.py
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+"""New and improved bot, OPTIMISED!!"""
+
+import random
+import sys
+
+EMPTY_TILE = '.'
+APPLE_TILE = '*'
+
+WIDTH, HEIGHT, SNAKE_BODY = raw_input().split()
+WIDTH = int(HEIGHT)
+HEIGHT = int(HEIGHT)
+
+SNAKE_BODY = SNAKE_BODY.lower()
+SNAKE_HEAD = SNAKE_BODY.upper()
+
+HEADX = None
+HEADY = None
+
+def get_cell(board, x, y):
+ if x < 0 or x >= WIDTH or y < 0 or y >= HEIGHT:
+ raise KeyError, 'out of range.'
+ return board[y][x]
+
+BOARD = []
+for y in xrange(HEIGHT):
+ row = raw_input()
+ for x, char in enumerate(row):
+ if char == SNAKE_HEAD:
+ HEADX = x
+ HEADY = y
+ BOARD.append(row)
+
+md_two = {
+ (-1, 0, 'l'): ((-2, 0), (-1, 1), (-1, -1)),
+ (0, -1, 'u'): ((-1, -1), (1, -1), (0, -2)),
+ (1, 0, 'r'): ((2, 0), (1, 1), (1, -1)),
+ (0, 1, 'd'): (((0, 2), (-1, 1), (1, 1))),
+}
+
+max_score = 0
+max_moves = []
+
+for (dx, dy, move), adj in md_two.items():
+ score = 0
+
+ try:
+ square = get_cell(BOARD, HEADX + dx, HEADY + dy)
+ except KeyError:
+ continue
+
+ if square == APPLE_TILE:
+ score += 2
+ elif square != EMPTY_TILE:
+ continue # Definitely cannot move here.
+
+ for ddx, ddy in adj:
+ try:
+ square = get_cell(BOARD, HEADX + ddx, HEADY + ddy)
+ except KeyError:
+ score -= 1
+ continue
+
+ if square == APPLE_TILE:
+ score += 2
+ elif square == EMPTY_TILE:
+ score += 1
+ elif square == SNAKE_BODY:
+ score -= 1
+ elif square.isupper():
+ score += 3
+
+ if score == max_score:
+ max_moves.append(move)
+ elif score > max_score:
+ max_score = score
+ max_moves = [move]
+
+if max_moves:
+ print random.choice(max_moves)
+else:
+ print 'U' # Suicide!
+
diff --git a/bots/peter_smart.py b/bots/peter_smart.py
new file mode 100755
index 0000000..b099cdd
--- /dev/null
+++ b/bots/peter_smart.py
@@ -0,0 +1,131 @@
+#!/usr/bin/env python
+"""New and improved bot, OPTIMISED!!"""
+
+import random
+import sys
+
+DEBUG = False
+
+# Show tracebacks, then pause for debugging.
+if DEBUG:
+ sys_excepthook = sys.excepthook
+ def excepthook(*args, **kwargs):
+ sys_excepthook(*args, **kwargs)
+ import time
+ time.sleep(10)
+ sys.excepthook = excepthook
+
+EMPTY_TILE = '.'
+APPLE_TILE = '*'
+
+WIDTH, HEIGHT, SNAKE_BODY = raw_input().split()
+WIDTH = int(WIDTH)
+HEIGHT = int(HEIGHT)
+
+SNAKE_BODY = SNAKE_BODY.lower()
+SNAKE_HEAD = SNAKE_BODY.upper()
+
+HEADX = None
+HEADY = None
+
+SNAKE_LENGTH = 0
+
+def get_cell(board, x, y):
+ if x < 0 or x >= WIDTH or y < 0 or y >= HEIGHT:
+ raise KeyError, 'out of range.'
+ return board[y][x]
+
+BOARD = []
+for y in xrange(HEIGHT):
+ row = raw_input()
+ for x, char in enumerate(row):
+ if char == SNAKE_HEAD:
+ HEADX = x
+ HEADY = y
+ elif char == SNAKE_BODY:
+ SNAKE_LENGTH += 1
+ BOARD.append(row)
+
+MOVES = (
+ (-1, 0, 'l'),
+ (1, 0, 'r'),
+ (0, -1, 'u'),
+ (0, 1, 'd')
+)
+
+def get_score(x, y, n, done=None):
+ if done is None:
+ done = set()
+
+ done.add((x, y))
+
+ score = 0
+ explore = False
+
+ # See if the cell exists.
+ try:
+ square = get_cell(BOARD, x, y)
+ except KeyError:
+ return 0
+
+ # Give some extra points for getting an apple.
+ if square == APPLE_TILE:
+ explore = True
+ score += 50
+
+ # Yay - it's empty!
+ elif square == EMPTY_TILE:
+ explore = True
+ score += 10
+
+ elif square.islower():
+ score -= 1
+
+ if explore and n > 0:
+ # Explore n-1 cells further.
+ for dx, dy, move in MOVES:
+ nx = x + dx
+ ny = y + dy
+
+ if (nx, ny) in done:
+ continue
+
+ subscore = get_score(nx, ny, n - 1, done)
+ score += subscore / 10
+
+ return score * n
+
+max_score = None
+max_moves = []
+
+for dx, dy, move in MOVES:
+ score = 0
+
+ x = HEADX + dx
+ y = HEADY + dy
+
+ n = (SNAKE_LENGTH + 4) / 2
+ score = get_score(x, y, n)
+
+# print 'Score for', move, '=', score
+
+ # Suicide protection squad!
+ try:
+ square = get_cell(BOARD, x, y)
+ except KeyError:
+ continue
+ else:
+ if square not in (APPLE_TILE, EMPTY_TILE):
+ continue
+
+ if score == max_score:
+ max_moves.append(move)
+ elif max_score is None or score > max_score:
+ max_score = score
+ max_moves = [move]
+
+if max_moves:
+ print random.choice(max_moves)
+else:
+ raise Exception, "No suitable moves found!"
+
diff --git a/bots/peter_smart2.py b/bots/peter_smart2.py
new file mode 100755
index 0000000..8f431ca
--- /dev/null
+++ b/bots/peter_smart2.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+"""New and improved bot, OPTIMISED!!"""
+
+import random
+import sys
+
+DEBUG = False
+
+# Show tracebacks, then pause for debugging.
+if DEBUG:
+ sys_excepthook = sys.excepthook
+ def excepthook(*args, **kwargs):
+ sys_excepthook(*args, **kwargs)
+ import time
+ time.sleep(10)
+ sys.excepthook = excepthook
+
+EMPTY_TILE = '.'
+APPLE_TILE = '*'
+
+WIDTH, HEIGHT, SNAKE_BODY = raw_input().split()
+WIDTH = int(WIDTH)
+HEIGHT = int(HEIGHT)
+
+SNAKE_BODY = SNAKE_BODY.lower()
+SNAKE_HEAD = SNAKE_BODY.upper()
+
+HEADX = None
+HEADY = None
+
+SNAKE_LENGTH = 0
+
+def get_cell(board, x, y):
+ if x < 0 or x >= WIDTH or y < 0 or y >= HEIGHT:
+ raise KeyError, 'out of range.'
+ return board[y][x]
+
+BOARD = []
+for y in xrange(HEIGHT):
+ row = raw_input()
+ for x, char in enumerate(row):
+ if char == SNAKE_HEAD:
+ HEADX = x
+ HEADY = y
+ elif char == SNAKE_BODY:
+ SNAKE_LENGTH += 1
+ BOARD.append(row)
+
+MOVES = (
+ (-1, 0, 'l'),
+ (1, 0, 'r'),
+ (0, -1, 'u'),
+ (0, 1, 'd')
+)
+
+def get_score(x, y, n, done=None):
+ if done is None:
+ done = set()
+
+ done.add((x, y))
+
+ score = 0
+ explore = False
+
+ # See if the cell exists.
+ try:
+ square = get_cell(BOARD, x, y)
+ except KeyError:
+ return 0
+
+ # Give some extra points for getting an apple.
+ if square == APPLE_TILE:
+ explore = True
+ score += 100
+
+ # Yay - it's empty!
+ elif square == EMPTY_TILE:
+ explore = True
+ score += 50
+
+ elif square.islower():
+ score += 2
+
+ elif square.isupper():
+ score += 1
+
+ if explore and n > 0:
+ # Explore n-1 cells further.
+ for dx, dy, move in MOVES:
+ nx = x + dx
+ ny = y + dy
+
+ if (nx, ny) in done:
+ continue
+
+ subscore = get_score(nx, ny, n - 1, done)
+ score += subscore / 10
+
+ return score * n
+
+max_score = None
+max_moves = []
+
+for dx, dy, move in MOVES:
+ score = 0
+
+ x = HEADX + dx
+ y = HEADY + dy
+
+ n = (SNAKE_LENGTH + 4) / 2
+ n = min([n, 10])
+ score = get_score(x, y, n)
+
+# print 'Score for', move, '=', score
+
+ # Suicide protection squad!
+ try:
+ square = get_cell(BOARD, x, y)
+ except KeyError:
+ continue
+ else:
+ if square not in (APPLE_TILE, EMPTY_TILE):
+ continue
+
+ if score == max_score:
+ max_moves.append(move)
+ elif max_score is None or score > max_score:
+ max_score = score
+ max_moves = [move]
+
+if max_moves:
+ print random.choice(max_moves)
+else:
+ raise Exception, "No suitable moves found!"
+