Graph punting competition.

Contest site: https://icfpcontest2017.github.io/

Team results

The team: me only

Lightning

Eliminated in round I (38/52)

Full

Unfortunately submission had a bug introduced in last hour of coding, and was crashing for orgs.

[20:45] <@dhil> Segmentation fault
[21:32] <paiv> dhil: found my bug. That code can play only with options enabled.
Rush hour mess, blame me

Task

The task was kind of a multi-player board game with partially hidden state. On your turn, you claim edges of a graph, trying to make longer roads from a few specific nodes, and preventing opponents from doing so.

Sample map:

Additional rules make it more fun:

  • you have a limited number of tokens to share an already claimed edge
  • you can pass and then use passed turns to make several claims in single turn
  • you can promise to make a path to a node before game starts, and gain points when you fulfill your promise

Links:

Lightning 24 hours submission

Lightning submission was a random trails player with a preference to grab rivers attached to mines. Spent considerate time on unbuffered I/O, interprocess streams and changes to offline protocol.

Final submission

Lightning was fully in Python, but then I decided to compensate my poor algorithmic skills with C/C++ performance. So there goes another day rewriting random player in C/C++, where I spent considerate time parsing JSON.

Day three started with adopting splurges extension. Then I had score tracked throughout the game, so could choose from best moves.

After a sleep brake (timezones), added support for options extension. Then a rush final stretch for monte-carlo-esque player, with final half-hour bug chase. (Have used 15 minutes into added time, thank you orgs).

Post-event

Visualizer

After competition was over, I finally had time for visualizer.

imbotnot> I have trod the misty trails of graphviz and imagemagick, and now I'm back, a wise man
imbotnot> Though my time is nigh, and my sanity has gone
imbotnot> I can do magic

Server

…and then I decided to build a server too.

Server runs on Node.js:

usage: puntd.js [-h] [-b HOST] [-p PORT] [-m MAP] [-n PLAYERS] [-f] [-o] [-s]
                [-th HANDSHAKE] [-ts SETUP] [-tm MOVE]

I strived to make it full-featured, close to spec:

  • futures
  • splurges
  • options
  • timeouts
  • zombies

It still lacks testing though.

Server Docker

A ready to run server is now stored on Docker Hub. You can easily run it locally with

docker run --rm -P paiv/puntd

See README for detailed parameters.

Notes to self

  • visualizer better be early
  • prototyping is good, but there is no time to switch languages
  • stat competition, choose best ai, local server would have helped
  • take a step back and think strategies

Competition

I made a list of teams I can find on the internets here:

Codes