Artifact 1b458d7cd25e92dc9c3c0885da832e38a4cef7cf:
0000: 69 6d 70 6f 72 74 20 75 74 69 6c 3b 0a 69 6d 70 import util;.imp
0010: 6f 72 74 20 67 61 6d 65 3b 0a 69 6d 70 6f 72 74 ort game;.import
0020: 20 63 6f 72 65 2e 73 74 64 63 2e 73 69 67 6e 61 core.stdc.signa
0030: 6c 3b 0a 69 6d 70 6f 72 74 20 73 74 64 2e 63 2e l;.import std.c.
0040: 73 74 64 6c 69 62 3b 0a 0a 61 62 73 74 72 61 63 stdlib;..abstrac
0050: 74 20 63 6c 61 73 73 20 4f 75 74 70 75 74 0a 7b t class Output.{
0060: 0a 09 76 6f 69 64 20 63 6f 6d 6d 61 6e 64 28 63 ..void command(c
0070: 68 61 72 20 63 29 3b 0a 09 76 6f 69 64 20 66 6c har c);..void fl
0080: 75 73 68 28 29 3b 0a 7d 0a 0a 63 6c 61 73 73 20 ush();.}..class
0090: 4e 69 6c 4f 75 74 70 75 74 20 3a 20 4f 75 74 70 NilOutput : Outp
00a0: 75 74 0a 7b 0a 09 6f 76 65 72 72 69 64 65 20 76 ut.{..override v
00b0: 6f 69 64 20 63 6f 6d 6d 61 6e 64 28 63 68 61 72 oid command(char
00c0: 20 63 29 20 7b 7d 0a 09 6f 76 65 72 72 69 64 65 c) {}..override
00d0: 20 76 6f 69 64 20 66 6c 75 73 68 28 29 20 7b 7d void flush() {}
00e0: 0a 7d 0a 0a 63 6c 61 73 73 20 53 74 64 4f 75 74 .}..class StdOut
00f0: 70 75 74 20 3a 20 4f 75 74 70 75 74 0a 7b 0a 09 put : Output.{..
0100: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 63 6f override void co
0110: 6d 6d 61 6e 64 28 63 68 61 72 20 63 29 0a 09 7b mmand(char c)..{
0120: 0a 09 09 77 72 69 74 65 28 63 29 3b 0a 09 09 73 ...write(c);...s
0130: 74 64 6f 75 74 2e 66 6c 75 73 68 28 29 3b 0a 09 tdout.flush();..
0140: 7d 0a 09 6f 76 65 72 72 69 64 65 20 76 6f 69 64 }..override void
0150: 20 66 6c 75 73 68 28 29 20 7b 7d 0a 7d 0a 0a 2f flush() {}.}../
0160: 2f 20 54 4f 44 4f 3a 20 63 6c 65 61 6e 20 69 74 / TODO: clean it
0170: 20 75 70 2e 0a 5f 5f 67 73 68 61 72 65 64 20 4f up..__gshared O
0180: 75 74 70 75 74 20 67 5f 6f 75 74 70 75 74 3b 0a utput g_output;.
0190: 0a 63 6c 61 73 73 20 47 75 61 72 64 65 64 4f 75 .class GuardedOu
01a0: 74 70 75 74 20 3a 20 53 74 64 4f 75 74 70 75 74 tput : StdOutput
01b0: 0a 7b 0a 09 2f 2f 20 48 61 6e 64 6c 65 20 53 49 .{..// Handle SI
01c0: 47 49 4e 54 3a 20 66 6f 72 63 65 20 61 62 6f 72 GINT: force abor
01d0: 74 20 61 6e 64 20 65 78 69 74 2e 0a 09 73 74 61 t and exit...sta
01e0: 74 69 63 20 74 68 69 73 28 29 0a 09 7b 0a 09 09 tic this()..{...
01f0: 73 69 67 6e 61 6c 28 53 49 47 49 4e 54 2c 20 26 signal(SIGINT, &
0200: 73 69 67 69 6e 74 29 3b 0a 09 7d 0a 0a 09 65 78 sigint);..}...ex
0210: 74 65 72 6e 28 43 29 20 73 74 61 74 69 63 20 76 tern(C) static v
0220: 6f 69 64 20 73 69 67 69 6e 74 28 69 6e 74 29 0a oid sigint(int).
0230: 09 7b 0a 09 09 69 66 28 67 5f 6f 75 74 70 75 74 .{...if(g_output
0240: 20 21 69 73 20 6e 75 6c 6c 29 0a 09 09 09 67 5f !is null)....g_
0250: 6f 75 74 70 75 74 2e 66 6c 75 73 68 28 29 3b 0a output.flush();.
0260: 09 09 65 6c 73 65 20 7b 0a 09 09 09 77 72 69 74 ..else {....writ
0270: 65 28 22 41 22 29 3b 0a 09 09 09 73 74 64 6f 75 e("A");....stdou
0280: 74 2e 66 6c 75 73 68 28 29 3b 0a 09 09 7d 0a 09 t.flush();...}..
0290: 09 65 78 69 74 28 30 29 3b 0a 09 7d 0a 0a 09 47 .exit(0);..}...G
02a0: 61 6d 65 20 67 3b 0a 09 74 68 69 73 28 47 61 6d ame g;..this(Gam
02b0: 65 20 69 6e 69 29 20 7b 20 74 68 69 73 2e 67 20 e ini) { this.g
02c0: 3d 20 69 6e 69 2e 63 6c 6f 6e 65 28 29 3b 20 69 = ini.clone(); i
02d0: 64 65 61 6c 5f 6c 6f 67 20 7e 3d 20 67 2e 73 63 deal_log ~= g.sc
02e0: 6f 72 65 5f 69 66 5f 61 62 6f 72 74 5f 6e 6f 77 ore_if_abort_now
02f0: 3b 20 67 5f 6f 75 74 70 75 74 20 3d 20 74 68 69 ; g_output = thi
0300: 73 3b 20 7d 0a 0a 09 73 74 72 69 6e 67 20 6c 6f s; }...string lo
0310: 67 3b 0a 09 6c 6f 6e 67 5b 5d 20 73 63 6f 72 65 g;..long[] score
0320: 5f 6c 6f 67 3b 0a 09 6c 6f 6e 67 5b 5d 20 69 64 _log;..long[] id
0330: 65 61 6c 5f 6c 6f 67 3b 0a 0a 09 6f 76 65 72 72 eal_log;...overr
0340: 69 64 65 20 76 6f 69 64 20 63 6f 6d 6d 61 6e 64 ide void command
0350: 28 63 68 61 72 20 63 29 0a 09 7b 0a 09 09 67 2e (char c)..{...g.
0360: 63 6f 6d 6d 61 6e 64 28 63 29 3b 0a 09 09 6c 6f command(c);...lo
0370: 67 20 7e 3d 20 63 3b 0a 09 09 73 63 6f 72 65 5f g ~= c;...score_
0380: 6c 6f 67 20 7e 3d 20 67 2e 73 63 6f 72 65 3b 0a log ~= g.score;.
0390: 09 09 69 64 65 61 6c 5f 6c 6f 67 20 7e 3d 20 67 ..ideal_log ~= g
03a0: 2e 73 63 6f 72 65 5f 69 66 5f 61 62 6f 72 74 5f .score_if_abort_
03b0: 6e 6f 77 3b 0a 09 7d 0a 09 6f 76 65 72 72 69 64 now;..}..overrid
03c0: 65 20 76 6f 69 64 20 66 6c 75 73 68 28 29 0a 09 e void flush()..
03d0: 7b 0a 09 09 54 75 70 6c 65 21 28 6c 6f 6e 67 2c {...Tuple!(long,
03e0: 20 69 6e 74 2c 20 69 6e 74 29 20 63 61 6e 64 3b int, int) cand;
03f0: 0a 09 09 63 61 6e 64 5b 30 5d 20 3d 20 6c 6f 6e ...cand[0] = lon
0400: 67 2e 6d 69 6e 3b 0a 09 09 66 6f 72 65 61 63 68 g.min;...foreach
0410: 28 69 6e 74 20 69 2c 20 6c 6f 6e 67 20 73 3b 20 (int i, long s;
0420: 73 63 6f 72 65 5f 6c 6f 67 29 0a 09 09 09 69 66 score_log)....if
0430: 28 63 61 6e 64 5b 30 5d 20 3c 20 73 29 09 0a 09 (cand[0] < s)...
0440: 09 09 09 63 61 6e 64 20 3d 20 74 75 70 6c 65 28 ...cand = tuple(
0450: 73 2c 69 2c 30 29 3b 0a 09 09 66 6f 72 65 61 63 s,i,0);...foreac
0460: 68 28 69 6e 74 20 69 2c 20 6c 6f 6e 67 20 73 3b h(int i, long s;
0470: 20 69 64 65 61 6c 5f 6c 6f 67 29 0a 09 09 09 69 ideal_log)....i
0480: 66 28 63 61 6e 64 5b 30 5d 20 3c 20 73 29 09 0a f(cand[0] < s)..
0490: 09 09 09 09 63 61 6e 64 20 3d 20 74 75 70 6c 65 ....cand = tuple
04a0: 28 73 2c 69 2c 31 29 3b 0a 09 09 69 66 28 63 61 (s,i,1);...if(ca
04b0: 6e 64 5b 32 5d 3d 3d 30 29 0a 09 09 09 77 72 69 nd[2]==0)....wri
04c0: 74 65 6c 6e 28 6c 6f 67 5b 30 2e 2e 63 61 6e 64 teln(log[0..cand
04d0: 5b 31 5d 2b 31 5d 29 3b 0a 09 09 65 6c 73 65 0a [1]+1]);...else.
04e0: 09 09 09 77 72 69 74 65 6c 6e 28 6c 6f 67 5b 30 ...writeln(log[0
04f0: 2e 2e 63 61 6e 64 5b 31 5d 5d 7e 22 41 22 29 3b ..cand[1]]~"A");
0500: 0a 09 09 73 74 64 6f 75 74 2e 66 6c 75 73 68 28 ...stdout.flush(
0510: 29 3b 0a 09 7d 0a 7d 0a );..}.}.