=<  |=  feed/(list move)                                ::  1
    =|  game/game                                       ::  2
    |-  ^-  (list fact)                                 ::  3
    ?~  feed  ~                                         ::  4
    =^    this/(unit fact)                              ::  5
        game                                            ::  6
      (~(do go game) i.feed)                            ::  7
    =/  rest/(list fact)  $(feed t.feed)                ::  8
    ?~(this rest [u.this rest])                         ::  9
::                                                      ::  10
=>  |%                                                  ::  11
    ++  side  @                                         ::  12
    ++  spot  {x/@ y/@}                                 ::  13
    ++  fact  $%  {$tie $~}                             ::  14
                  {$win p/cord}                         ::  15
              ==                                        ::  16
    ++  move  $%  {$x p/spot}                           ::  17
                  {$o p/spot}                           ::  18
                  {$z $~}                               ::  19
              ==                                        ::  20
    ++  game  $:  w/?                                   ::  21
                  a/side                                ::  22
                  z/side                                ::  23
              ==                                        ::  24
    --                                                  ::  25
|%                                                      ::  26
++  bo                                                  ::  27
  |_  half/side                                         ::  28
  ++  bit  |=(a/@ =(1 (cut 0 [a 1] half)))              ::  29
  ++  off  |=(a/spot (add x.a (mul 3 y.a)))             ::  30
  ++  get  |=(a/spot (bit (off a)))                     ::  31
  ++  set  |=(a/spot (con half (bex (off a))))          ::  32
  ++  win  %+  lien                                     ::  33
             (rip 4 0wl04h0.4A0Aw.4A00s.0e070)          ::  34
           |=(a/@ =(a (dis a half)))                    ::  35
  --                                                    ::  36
++  go                                                  ::  37
  |_  game/game                                         ::  38
  ++  do                                                ::  39
    |=  act/move                                        ::  40
    ^-  {(unit fact) ^game}                             ::  41
    ?-  act                                             ::  42
      {$x *}  ?>(w.game ~(mo on p.act))                 ::  43
      {$o *}  ?<(w.game ~(mo on p.act))                 ::  44
      {$z *}  [~ nu]                                    ::  45
    ==                                                  ::  46
  ::                                                    ::  47
  ++  nu  ^+(game [& 0 0])                              ::  48
  ++  on                                                ::  49
    |_  here/spot                                       ::  50
    ++  is  ?|  (~(get bo a.game) here)                 ::  51
                (~(get bo z.game) here)                 ::  52
            ==                                          ::  53
    ++  mo  ^-  {(unit fact) ^game}                     ::  54
            ?<  is                                      ::  55
            =/  next/side  (~(set bo a.game) here)      ::  56
            ?:  ~(win bo next)                          ::  57
               [[~ %win ?:(w.game %x %o)] nu]           ::  58
            [~ game(w !w.game, a z.game, z next)]       ::  59
    --                                                  ::  60
  --                                                    ::  62
--                                                      ::  63