The Goal

Don't get destroyed by the troll.

  Rules

If you have stones, shoot 1 or more of them.
If you don't have stones, shoot 0 exactly.

  Rule Evolution

The following ideas are still in flux, waiting for some opinions. Please drop a word on the contribution's page or on the forum
  • Is it even worth publishing? can the problem be totally solved?
  • More maps? (a map is a {road length} × {initial stone count} pair) → Yes, there will be more maps.
  • Leagues
    1. single small map, cheating is tolerated, boss plays tit for tat (9/10) or cheats (1/10)
    2. rock troll and ice troll unlocked; multiple rounds; four maps available; no cheating; boss plays well but not perfect
    3. all races unlocked; map continuum, no boss but default AI doesn't lose.
    For the WIP phase of this draft, I'll likely merge the last two leagues into one because we need data on what makes the games interesting.
  • Fog of war? Cancelled. Not in this game.
  • Praise for my artistic skillz. There can never be enough of that.
  • Other remarks?
Victory Condition
Your opponent loses.
Defeat Condition
  • The troll reaches your castle.
  • When no player has stones left, the troll is closer to your castle.

  I/O Protocol

This place used to read: “Just read the sample code. You can figure this out.” Here are the formalities for that other part of the audience.

Map Input

This section's HTML gets messed up somewhere in the SDK pipeline. I reported it there; and there you'll be able to find a readable representation of this block. Sorry about the inconvenience…

Your first line of input contains five space-separated parameters: roadLength initialStones gameSeed gameSide reserved

roadLength
distance between both castles, between 6 and 14.
initialStones
number of stones a castle starts the day with, between 0 and 50.
gameSeed
the game's seed. The game AIs use it to provide you with reproducible matches even when they use stochastic algorithms, and you're encouraged to do the same! See examples section below for simple ways to achieve that.
gameSide
which side you're on, as -1 or 1. It's not supposed to make a difference to how you handle the rest of the game, but you can XOR it to your gameSeed to have a (reproducible) random that doesn't mecessarily draw when it plays against itself.
reserved
reserved for future use, ignore for now
Turn Input

At each turn, you are provided with the following three space-separated values: trollDistance stones opponentStones

trollDistance
distance between the troll and your castle
stones
number of stones you have left
opponentStones
number of stones your opponent has left
Turn Output

After having received your turn input, you are to output a single integer stones: the number of stones you wish to throw at the troll.

You may optionally provide a message you wish your castle to yell at the troll or at your opponent. Just append it to your output, being sure to separate it with at least one space.

Timing Considerations

You're currently allowed the default SDK timings. I think it's one second for the first turn and 50 ms then, but don't quote me on this.

  Proper RNG seeding examples

Language Family Sample
JVM long mySecretSalt = 0x4242424242424242L;
Random random = new Random(gameSeed ^ gameSide ^ mySecretSalt);
C, C++, Perl… srand(gameSeed ^ gameSide ^ 0xdeadb33f);
std::srand(gameSeed ^ gameSide ^ 12345);
srand( $gameSeed ^ $gameSide ^ 0xCAFE_BABE );
Other Unachievable until proven otherwise

  Expert rules

In the lower leagues, the following maps are currently available and randomly yet extremely fairly (you wouldn't believe the effort that went into this) chosen uniformly at random among the following:

Road length Stones
6 15
6 30
14 30
14 50

You can also override them via game settings roadLength and initialStones, so long as you remember you won't be choosing them for ranking play.

  Change Log

I'm not maintaining the full changelog here anymore as the game's source repository is now publicly available. I'll just make note of the single latest change, so you can know how far behind you were lagging. Patches welcome, BTW.

This draft's last change is: iddqd.

“Trolls simply detest the very sight of dwarves (uncooked).”
— J.R.R. Tolkien, The Hobbit

Based on an involuntary suggestion by Zaap38 on the #Fr channel. The original appears to be by Romain André-Lovichi .