Hex Artifact Content
Not logged in

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                          );..}.}.