CONSTANT: angle-+ H{ { 0 { { 0 -1 } { 1 0 } } } { 1 { { 1 0 } { 0 1 } } } { 2 { { 0 1 } { -1 0 } } } } CONSTANT: angle-\ H{ { { 0 -1 } { -1 0 } } { { 1 0 } { 0 1 } } { { 0 1 } { 1 0 } } { { -1 0 } { 0 -1 } } } CONSTANT: angle-/ H{ { { 0 -1 } { 1 0 } } { { 1 0 } { 0 -1 } } { { 0 1 } { -1 0 } } { { -1 0 } { 0 1 } } } : move ( map wagon -- wagon' ) dup pos>> rot at { { CHAR: + [ dup cnt>> angle-+ at [ v.m ] curry change-dir [ 1 + 3 mod ] change-cnt ] } { CHAR: / [ [ angle-/ at ] change-dir ] } { CHAR: \ [ [ angle-\ at ] change-dir ] } [ drop ] } case dup dir>> [ v+ ] curry change-pos ; TUPLE: wagon pos dir cnt ; C: wagon CONSTANT: wagons H{ { CHAR: < { -1 0 } } { CHAR: > { 1 0 } } { CHAR: ^ { 0 -1 } } { CHAR: v { 0 1 } } } "/tmp/input" ascii file-lines [ [ 2array swap 2array ] curry map-index ] map-index concat [ [ wagons at nip ] assoc-filter [ first2 wagons at 0 ] map ] [ [ { { [ dup { CHAR: > CHAR: < } member? ] [ drop CHAR: - ] } { [ dup { CHAR: ^ CHAR: v } member? ] [ drop CHAR: | ] } [ ] } cond ] assoc-map >hashtable ] bi swap f [ over [ pos>> ] map duplicates empty? ] [ [ dup [ pos>> ] sort-with ] when-empty pick swap unclip-slice swapd move drop ] while drop nip [ pos>> ] map duplicates .