Paste: aoc21
Author: | jon |
Mode: | factor |
Date: | Tue, 1 Jan 2019 18:24:34 |
Plain Text |
: 2ary-op-r -- outputs )
[ clone ] 2dip [ '[ [ second swap nth ] [ third swap nth ] 2bi @ ]
[ fourth swap set-nth ] 2bi ] 2curry keep ; inline
: 2ary-op-i -- outputs )
[ clone ] 2dip [ '[ [ second swap nth ] [ third ] bi @ ]
[ fourth swap set-nth ] 2bi ] 2curry keep ; inline
: 2ary-op-ir -- outputs )
[ clone ] 2dip [ '[ [ second swap ] [ third swap nth ] bi @ ]
[ fourth swap set-nth ] 2bi ] 2curry keep ; inline
: addr [ + ] 2ary-op-r ;
: addi [ + ] 2ary-op-i ;
: mulr [ * ] 2ary-op-r ;
: muli [ * ] 2ary-op-i ;
: divr [ /i ] 2ary-op-r ;
: divi [ /i ] 2ary-op-i ;
: banr [ bitand ] 2ary-op-r ;
: bani [ bitand ] 2ary-op-i ;
: borr [ bitor ] 2ary-op-r ;
: bori [ bitor ] 2ary-op-i ;
: setr
[ clone ] dip [ [ second swap nth ] [ fourth swap set-nth ] 2bi ] curry keep ;
: seti
[ clone ] dip [ [ nip second ] [ fourth swap set-nth ] 2bi ] curry keep ;
: gtrr [ > 1 0 ? ] 2ary-op-r ;
: gtri [ > 1 0 ? ] 2ary-op-i ;
: gtir [ > 1 0 ? ] 2ary-op-ir ;
: eqrr [ = 1 0 ? ] 2ary-op-r ;
: eqri [ = 1 0 ? ] 2ary-op-i ;
: eqir [ = 1 0 ? ] 2ary-op-ir ;
: (execute-insn)
{
{ "addr" [ addr ] }
{ "addi" [ addi ] }
{ "mulr" [ mulr ] }
{ "muli" [ muli ] }
{ "divr" [ divr ] }
{ "divi" [ divi ] }
{ "banr" [ banr ] }
{ "bani" [ bani ] }
{ "borr" [ borr ] }
{ "bori" [ bori ] }
{ "setr" [ setr ] }
{ "seti" [ seti ] }
{ "gtrr" [ gtrr ] }
{ "gtri" [ gtri ] }
{ "gtir" [ gtir ] }
{ "eqrr" [ eqrr ] }
{ "eqri" [ eqri ] }
{ "eqir" [ eqir ] }
} case ;
: execute-insn
" " split unclip [ [ string>number ] map f prefix ] dip (execute-insn) ;
:: aoc21p1
<linked-hash> :> seen
0 :> count!
"/tmp/input" ascii file-lines unclip " " split second string>number :>
6 0 <array> :> regs!
n regs set-first
0 :> pc! [
[
pc ip regs set-nth
pc program nth :> insn
pc 28 = [
3 regs nth dup seen at
[ drop seen >alist last first . "done" throw ]
[ t swap seen set-at ] if
] when
regs insn execute-insn regs!
ip regs nth 1 + pc! t
count 1 + count!
] loop
] [ . regs . ] recover count . ;
New Annotation