Created
May 16, 2016 03:31
-
-
Save phred/4c14ce792c3712a43070540d6e2b1b25 to your computer and use it in GitHub Desktop.
Some assorted Advent of Code (http://adventofcode.com/) solutions written in Factor because YOLO π
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
: sides ( [] -- sides ) { | |
[ [ first ] [ second ] bi 2array ] | |
[ [ second ] [ third ] bi 2array ] | |
[ [ first ] [ third ] bi 2array ] | |
} cleave 3array ; | |
: area ( side -- area ) first2 * 2 * ; | |
: extra ( sides -- extra ) first first2 * ; | |
: side-area ( side -- area ) first2 * 2 * ; | |
: total-paper ( dims -- area ) sides [ area ] [ extra ] bi + ; | |
[ dims total-paper ] map sum | |
: volume ( dims -- vol ) [ * ] 1 reduce ; | |
: smallest-perimeter ( dims -- smallest ) first2 2dup + + + ; | |
[ dims [ volume ] [ smallest-perimeter ] bi + ] map | |
CONSTANT: input3 ">^^v^<>v<<<v<v^>>v^^^<v<>^^><^<<^vv>>>^<<^>><vv<<v^<^^><>>><>v<><>^^<^^^<><>>vv>vv>v<<^>v<>^>v<v^<>v>><>^v<<<<v^vv^><v>v^>>>vv>v^^^<^^<>>v<^^v<>^<vv^^<^><<>^>><^<>>><><vv><>v<<<><><>v><<>^^^^v>>^>^<v<<vv^^<v<^<^>^^v^^^^^v<><^v><<><^v^>v<<>^<>^^v^<>v<v^>v>^^<vv^v><^<>^v<><^><v^><><><<<<>^vv^>^vvvvv><><^<vv^v^v>v<<^<^^v^<>^<vv><v<v^v<<v<<^^>>^^^v^>v<><^vv<<^<>v<v><><v^^><v<>^^>^^>v^>^<<<<v><v<<>v><^v>^>><v^^<^>v<vvvv<>>>>>^v^^>v<v<^<vv>^>^vv^>vv^^v<<^<^^<>v>vv^v>><>>>v^>^>^^v<>^<v<<>^vv>v^<<v>v<<><v>^vvv<v<vvv^v<vv<v^^^>v><<^<>><v^^>^v^>>^v<^<><v<>>v^<>>v<>>v^^^><^>>vvvv>^v<^><<>>^<>^>vv><v<<>>^^>v^^^><^<<^^v>v<^<<>v>^^vvv^v^>v^<>^^<>v^v>v>v<v^>vv>^^v<>v>>^<>><>v>v^<<vvvv<vvv><v^<^>^v<>>^><v>><>^<v>v<v>vv^>>vvv<>v>v<v^>>^>>v<<>^<>^<>>>^v<<<^<^v>vv^>><<><v^>^v^^^v<>^^vv><>><>>^>v^<v<>v<>>^<<^v>^^^<>^v^><>v<<v>vv^>vv<<>>><<^v^<>v<vv>>>^^<>^><<^>vv>>^<<v^^vv<>>><v>v><^<v<<>>>^^<>>^<^v><>vv^^^v>vvv>^><<>^^>^<<v^<v<^v<<>vvv<^<<>^>^v<vv<^>vvv>v>vv^<v^><>>^vv<^^^vv><^vv<v^<><v^vvv><<^>^^><v<<vv^>v<vv<v>^<>^v<<>v<v^v^>^>^>v<<^vvv<<<v>^^>^<<<<>vv>>^<>^>>>v<v>^^<v^<v<>>>vv>^^v<<>>>^^v><<<v<v<^v<>^^><v<^v<<v^><><^<><v<^^v>>><v^^v<<v^><^<><<v^>><^<>v>v^<><^<v>^v^>^>^vv^>^^<<vv^>vv<^vvv<>>^^<^>v^>^>^<v^><v<v>>>v<<<><^v<<><^<vv^v^^^>v<^^<v^vvv<v<><v<vv<^vv<>vv<v^<>>vvvvv<<>^v^v>vv>>>vvv^^<^<^<><>v<v>><^v><^<<<>><<<v>^>v<>^>^v>>^<>v^<^>><<>^<v>^>^^^>^^<v>>>><>^v^v><<<<vv^<vv<>vv>v<>v^<v^>v><>>>v^<><^vvv>vv^<^<<^<^^v>^>>>v<^<^v^^<^<^>>><v>vv>^<<><>^>>v>^<<>><^<>v<>vv^^>^>vvv^v<<^<^^<vv<>^vvv<^^v^vv^>>v<^>^^<v^<>v<^<^vv>v<<vv>vv>^>vvv>>>^^>v<>^v>v^<^>>v>^^v>>>>v^<v>v<^>v<v<<>>^v<^^<v><^<>>^<<vv^>>v<<v>^v<>><^>vv<v<^>>^^<vvvvvvvvv>>>v<v<>v^<>>^vv<v^^v<<^vvv^<<^><>vv<><<>>v>vv^><>>^^v^>>v^v^><<<>>^^<^v<<^<>>>>^<^>v^><<^>v<^v<^>>^^<<<<><^<^v^v<>>^v<^<<vv^<><^^vv><v^v^v>^>>^>^vv^>^v<v^v<<vvv^><>>^v^^><>v>vv><^>>vv<vvv<<<<^<>vvv^v<v>^<v<^>^<^<v<><>v^^^^<<vv<^^vv<v>><<v^><>>><v^>^v><^>^><vv^<><^<v>><<^vv<>>v^<<v<>v><v<><><vv>^>>v^<^<v>^><>>><^><v^v<>>>^^<^>v<v>vvv<>^<<><v^^>^>>v<^v>^>v>>>vv>v>>v^^^<^<vvv^<>^>^<v^<v^v>v>^>vv>vvv<>v<^>v>^^>>^<vv^^v>v^^^^^v^vv><^<><>^>vv<^>>^vvvv^^^>^<vv>^v<<^><^^>^<>^^>^<<v<^>>>^><<^^>v^v>>^>vvvv>^^v><v>>vv><<<vv<^>v>^^^<v>v^vvv<^><<^>^<>^><<<<<v^<<vv^v>^<>v<v>^>^>><>v^v<^vv^^>vv<<v^v>vv^vvv<<<<>^v<v^^v^v>v<<v>^^<>^vv^^>^>^v^vv^>>v^vv^^<vv><<v^v^^v><vv<^vvv<vv^^<<v>v^v^^^^v<^<^>v>^>v>^vv^v^^<v<^vvvv<<<>^<^^^<^^<>^<><vv<^^<<^>>><v^vvvv>^<>>^^>v^^v^<<v^^^<<<><^<v^v^^v<v^<>v><<v<>^v>v<^><^>vv^^<vvv<^v>>v>^<><v^><^^^<v^>>vv<<<<<^<>^v^v>^vv^<>v>v<^>vv<<^vv>vv<v<><>>v>><v<^<^^>><<v^v<<^><v<^<vv<v<<vv^>^<<><^^>^<^>>^<vv>><v<<vvv<^^v^>^^<^v>^v<v<>v><v^v^<<^<><<v<<^v>v<<>>^>v>>v>>v<^<<^<^>>>v>^^^v><^>^^>>v<<>^v><v>vvv^vv<<<>vvv<<>^>>>v<v<v^<^<^>^<^>v^^v<^^<v<>v<>>^^>^v^>v<<<<^<>v^><<<v>>>><<v^<^vv>v>><>>^<<<^<^^>v<>>v<>vv<<^<<><<^>v^^^vv^>vvvv>>v>v^><<v<>vv^<<><<vvv>^>>>^<<<^<^<<v>^>v<>>v>>vv^^><<<<^^^v>><<^><v><v^^><v<<v^^v^^v>>v<><><<>^><v><^<vv>><^v<>v<vvv<>^>><v>>v<^><<v>^<>^v><^><^^<v>^><^^v^<<><>>^>v^<^v^vv<><^>vv^>v^vvv^<>>^><^<^<>^<<v^v<^v><>^v<v>>^>>^v^vv>><vv><v^^<<^v^<>^v<<>^><^>><v>>v<<<v^^vv<>^^v>>><><><<v^<<<v^<^^><v^>v^^vv<v^<>>vv^<^v<>^v>>v^v>v<^^vv><>^v<<>v^<>v^>>v>vvv<^><><^^>^vv^>>v^>^<^^<><>><<>^^^><^v^v><<<><<^v^vv>v>><^>>><v^>v<v><><v^v<>v^^>>v<<>v>v<v<v<^^<><>v^^<>>v<^v<v>v<><v<v>^<<>v>vv^^<>>^^^<>^^>^v>v>>>^v^v><v^^<><v>^^v^v<^<^^><<v<^<^<>^<>><<>^>>^>^^><v><>v<><>><<<>>>>vv>>>^>>^v<^>v^^^v<<vv>><<<^<<<>>>>>^>vv<^v^<>^<v^>^v><v>vvv<>>>^v^^^v<<<<>>^^<vv<^<^^>^<>v<^<<<>><>>v<^<>^<vvv<^<>><><<v>^^^>^^<<v<v^>^^v^>><<^vv><v>^v>>^<v>v>^^>^v>^vvv<>v^v^^<><vv>vv^>>><>v<^><v<v^<><<<>^v>^v<<<^>^>^>v^v<<><vvv<<v^^<><v>^>>><vv>><v>>v^<vv>>vv<<^v^v<<><^v<vv>>>vv<>>>>^vv>v^<>vv>v^v<v^><v<^^^^^>vv<><<vvv^<v><^<vv><^^^vv^<>^^^^<^><^<>v^<v^v<<^v<<^^<>>^<v^^>>>vv<vvv<>v<<>><^vvv^<<^^<<>>>^<>>>v^^><>><<>><v^v>>>>>><>>><v^<<vvv^>v<>>v^<>vv<><^^^^v^<<^<v^vv><<^^>v<^vvv^v>>v>^>>v>^^><<v^<>v<>vv<^v^vv><v><<vv^v>>v^>>v<^^^>^><<v<>^><>v>>>vvv<v<vv<^>>^v<v>^<^^^^^v><>v><>v^v^v<v^vv^v>vvvv<>vv<<<vv<v<<>^<^>^^v^<<>^<v><^><v<v<><<>v^<<^<><vv>v<<^v>>^v<><v>^>>^^><>v^<^<vvv^>^>^<<<<>vv>^v^v<^^^<vv>><>^^<<v<^<^^>>>v^v<<^^^<v<v<^<>^v<v><v^vv^^v^^v^^<vv<>^<><vv^<^v^<<^><<vvv>^^<^^^<^v>^>^vv><<<^v<v>vv>v<>v^v<v^>v^>>>v^v<>^v<<>^vv>v>v>v^<^>v^^<^>^^^^vv>^^><^>vv^>>^^v>><<<<^><>v<>^<v<vv^>^^><<^><v>v^>^^<^>>><>><v^v<v^<v<vv^v^<<^<vvv>>><vv<^^>>^>^><<v^<>>v>v^v^^><<>vv^v>v^<v><^<>^^<^>v>^<><<<v>^<^<^>^>^>^^v^<<^^v^^<^<>><^>v>>^^<>^^^<<<<v^>^v<^vv>^<<<v<><<v<>vv>>>v><>>><>>v<<<vv><>^v>v<^>><^><><v<>^v^>^v>^v<<><<^<>>v>^><>^>><>><^<v^><v^^<><v><^^>^v^^<>v^<v^<^v<v^^^^^v^<<^>^^^<^v><>^^<<<><<<<<^^>v^vvvv>v<>>vv<^>^v^>v<^vv^v<<><<v>v^v>^^><><^<v^>v><vv><>>><<>^vv<>v>>v<^v>>>v<v>v>v>^vv<<>^^vv<v<^v^<v<v>vv<>^<^<vv<v^<^v^^><<>^>><^v>vv^^v<<^^><<>v^^<><><v^^<v^v>^>^>^>v<^<v>^v^^>v<>vvv<^v<v^v><<v^><<^^><^<<v^v^>v<>^>v><><v>^<v<v>^<^^^>^v<<><<><>vv>v^<>v^><v^v<v><><<v>v<vv><<v>>v>^<<<>vv>>vvv>^^vv^v^^<^^<>v^^<>v>>^^>^>^>v>><^>><>>^<<>><^>v<<<<<<<^v^v<v^<v^^>^<><<v<^>v^>v^vv<<^^vv^>>>>^<>v<^v<>v<vv<^>>v^vv>vv><vv<<^>v>><vv>>>vv^<<<<vv^>v<<<<^^>^^v^><<^<v^>v^>^^<v<>vvv^>^<>vvv<v<^^>v^<<v>><>v<v<>^^<vvv>^>vv><><<<^^vv<v^<v<>v<>><<v><^vv^>^<^>^^^<<<v>vv^<^<<>^>^<vv>v><v<<^><^>^^<vv^v^^>>>>vv^><^^vv><>^<v^v>v<vv>v><<<v>v<v>^><v^^><v>v<^v^>>^^<v^>^^>vv>>vv^><^vv^vv<<^>vv>^v<v><vv><v<vvvvv>^^v^v><v>>>^vv<>v>^^^^<^>><>^v^^^>v<^^<<^^v<vv<>vvv<^>><><^>>^><^<>v<v<<><<v><v^v<>><^>v><<v^<v>v<^<vv^v^v^>vvv^^>v>^<vv^>v^v^<>v>^>>vv>><^^<v<<>^vv<><><<^v<v>v<<vv><>><^v<v>>v^>vvv^v^<<^><v<>^vv^>v^<v<^>>v<v><v><v>>^<<<v^<><<>v>^>^^<v<>>^<>^>^><<<^<<^<<^>^v>>><vvv>><<<<v>>>>>>>^<^v<^>v<>vv<><>v>>^>>^>vv^^><<^<v<v>>^^<<^>v<^>>vv>^<>v><^>v<vv>>>>>>^v<^<<<v^><vv<<>>vv<<><v<><<<v<^<v<>>v<^^^^v^^<^^^<^<vv><<^>><>v<<>v<v<>>>><>v^vv>^>^>>vv^v<v<<><^v>vv^><v<<>v^v<^>vv<<^^v><^>>^^vv<^<>>v^^>><v>^v>>>^>>v>v<>v<^vv><>^<<^>vv>>><><>v^><>v^>v>v><^v<><v<v>^v<<^vv^><^^>><^^^<<<^>v>^v>>><^>><^>>>^^^<^>vv<><<<v^>^<^^>>^^^v^v^v>v<v>>>><^>>>v>^vv<<^^^<^^vv>v<<><v<<^^>v>><<v^^><^>^<^>^v^>v><^<^vv>v>><>^<<vv<<v>v<vv<v>^>^>><^^<v>^v^v<><<>vvv<^<v>^><>^>vvv>>>^><<>><v^^<^<<^v>>^v<v<vv>vv^v^>v<<vvv<^^v^v>^<^>>^>v<^>^v<<><<<^>^<^^^>vv<^^^^vv<v<^^v<<<<v<^v^<><v<<^><<>vv>>><^<^<>>>^>^>>^<<<<<^^v>^>^<>vvv^^<^><^>^^v>^vv^><v^<^<<v^<vvv<<^v<><^><^>>>v>^v>^>^v<vv^v>><v><^><v^^>v^>^<><<><>v<v^>vvv^>^>>v<>^><^>^><vvv>^^v^v>v<>^v^><^>>v>v^><<<^>>^<>^<>>v><>>v^>^>^^<>>v^>^<vvvv<^vvvv^>>vv^<v^v>^vv<>v<>^<v<v>v>^^><^>vv^<^v^<<^<^<><vv<^v<^v><>>>^v^<<^><^>vv<v>v<^>vv^>v<<<>^<><v<^^^>v><^^<>^<^<v^vv^<<^>><<v^v<^vvv<<<>>vvvv^v^^^>v<>>><<>vvv<<^^^>v>v>>v<<v<v^v^>^^v>^><^<><<v^<v<v^^^><>v^^^<v>vv<>^>^^vv>^<<^v<^v><v>>>^>>><^<<>^v>>^>vv<<<v<>^<v><v^<^<>v>v^^v^>><<^v<<<<>v>v>v^^<^><>^^<<<v>vv<>>>^>>v<><v^>^<><vv>v>v^v<v^<^>>^>><<^^<^^v<vv<>><<<v<^<<^^^>vvv^<vvv<^>vv><>><<<^<v^v^^<<^vvv^^<^<><<>^<^<>>vvv<>^<>v^v<><>>v^v><<>>>vvv>v<>^>>^><^>vv<<>>v<<^><>v>>^^<v>^>^<<>><^<<vv<^<vv^vv><>>>><^<v>^>vv<v><>^<>vvvvv^vv<<v<>>>^<<><>^^vvv>>>vv<<^^><^v^^v<>^^>^><^>v^^^^v<^<<vv<vv<>vv^^>v^vv>v><>>vv>^<^<v^v^>>v^v^^v>^>vv^>v<vvvv<^v<^v>^v>^^v<<^>^^<<>^><^v>>>vv^>^^>vvvv>>v<^<v>^>>>v^<><^<^^<v>vv^^><v>v^<>^^^>>><^^v>v>^<<>^<v^>vvv^>^^^><v<^>>v<v>>^v><<><<>v<^<<>^><>^>vv>^<v>^^v<<^v^vvv^^>^vv^<^>^>^^v>v^>^<<><<^>v>>vv^vv><v>>^<<^<v^^<^<v^^vv^><^^<^^><v^^>v^^^<^<>^<>>^v<^vvv^^v^<><^>>>>>v><><<<>vv<^v>><<>vvv<><<vv<<<^>v^^>>^>^v>><><^^v<>><>>v^>^<vv><<<>><><<v>^^<>>v<><^<vv>vv<^v>^<<<<v<^<<^^>>^<><^>><<>^>v>^^^v>>^<^^v><v^v>^><<><>>^>>^<<v<>^v<>^>^<v>>vv>^vvv<<v<<^>^>^<<^^<>^^^^vvv<>^vv<vvvvv^^>^^<^>>><>v^<><^<<^>v^^v<>>^vv<>v^^<>>v^vvvvv<<v^<v^^>>><vvvvv>><^>vv>v^v^<v<^>^^><^>^^^^v<><^v<<>v^>v>>vv<<>^<v^^>vvv>^^<v^<>vv^><>><v^^v<>^>>^>v><>>^^v>^>^>>>^>v<^v>v>^<^^^^^>>v<v<>>v<<^>^<v<<>^^>><<^><>v<>^^^vv<>^^>><<^^>v>vv>vv>v^>^v>v^^<>>><<v><v<<>>v><>vvv^^v>^^>^vvvv^>^<>^vvvv><v><v<>>><>^<^vv<>^v<^v<>^vvv<<>><vvv^>>^><<vv^<v^>^<v<<^^>^^<^^v^>v<>v^v><>><v^^>>^vvv><^vv>v^<^<^v>>v^^>^vvv^<v^^v^^>v<^<>>^<>>>^^<><^^vv<>^vv^<>>>>^^<<^^<>vv^^><>^^<v<<v>^<v^^>^v<><><>vvv>^v^>>vv<<^v<<>><v>^><^>>>^<^<^^>vv^<<^<>>^^><><<v>^^<v>>v<<vvvv>^v^vv>><^^<<^>>v>v<^^^<^><^^vv>^vv<^<vv<>v><^<><v><^^^>>^<><^<v>>>>v^<v>>>>>v<><^^>v<^<^>><v<>^>vv>^^v^v^<<v<><<<^v^><<^<><<<<v<^>><<<>v>>vv><vv<><<^<^<><vv>^^^^<>v<<<<v>vv<>vv^^^>><>vv^><>>^vv<<><^^vv<>v^>>^<<>^<v^<^>v<" | |
: >step ( step -- [] ) { | |
{ CHAR: > { 1 0 } } | |
{ CHAR: < { -1 0 } } | |
{ CHAR: ^ { 0 1 } } | |
{ CHAR: v { 0 -1 } } | |
} at ; | |
input3 HS{ { 0 0 } } count-houses | |
:: count-houses ( input visited -- visited' ) | |
input { 0 0 } [ >step vs+ visited [ adjoin ] 2keep drop ] reduce drop visited ; | |
:: count-houses2 ( input visited -- visited' ) | |
input | |
{ { 0 0 } { 0 0 } } | |
[| acc elt ndx | | |
elt >step ndx 2 mod acc nth vs+ | |
ndx 2 mod acc set-nth acc | |
first visited adjoin acc second visited adjoin acc ] reduce-index drop visited ; | |
: good-coin? ( str -- ? ) "00000" drop-prefix nip length 0 = ; | |
: concat-guess ( n secret -- string ) swap number>string append ; | |
: hash-coin ( str -- str ) md5 checksum-bytes hex-string ; | |
:: mine-coin ( secret -- mined ) | |
most-positive-fixnum iota [ secret concat-guess hash-coin good-coin? ] find | |
nip secret concat-guess ; | |
: enough-vowels? ( str -- ? ) | |
histogram | |
{ [ CHAR: a swap at 0 or ] | |
[ CHAR: e swap at 0 or ] | |
[ CHAR: i swap at 0 or ] | |
[ CHAR: o swap at 0 or ] | |
[ CHAR: u swap at 0 or ] } | |
cleave + + + + 3 >= ; | |
: naughty-digraphs? ( str -- ? ) R/ .*(ab|cd|pq|xy).*/ matches? ; | |
: double-letters? ( str -- ? ) | |
dup length 0 = [ drop f ] [ | |
dup | |
[ first ] | |
[ rest ?first ] bi | |
= | |
[ rest double-letters? ] unless | |
] if ; recursive | |
: nice? ( word -- ? ) { | |
[ enough-vowels? ] | |
[ naughty-digraphs? not ] | |
[ double-letters? ] | |
} cleave and and >boolean ; | |
: sandwich? ( str -- ? ) | |
dup length 2 < [ drop f ] [ | |
dup | |
[ first ] | |
[ rest rest ?first ] bi | |
= | |
[ rest sandwich? ] unless | |
] if ; recursive | |
: repeated-digraph? ( str -- ? ) | |
dup length 2 < [ drop f ] [ | |
dup dup | |
[ first ] | |
[ rest ?first ] bi | |
2array >string | |
swap rest rest subseq? | |
[ rest repeated-digraph? ] unless | |
] if ; recursive | |
: nice2? ( str -- ? ) [ sandwich? ] [ repeated-digraph? ] bi and ; | |
TUPLE: step op from to ; | |
: >op ( str -- quot ) { | |
{ "toggle" [ t xor ] } | |
{ "turn on" [ t or ] } | |
{ "turn off" [ f and ] } | |
} at ; | |
: (split-op-rest) ( str -- op rest ) | |
" " split dup first2 | |
{ | |
{ [ dup "on" = ] [ 2drop rest rest "turn on" swap ] } | |
{ [ dup "off" = ] [ 2drop rest rest "turn off" swap ] } | |
[ 2drop rest "toggle" swap ] | |
} cond | |
; | |
: str>pair ( str -- pair ) "," split [ first string>number ] [ second string>number ] bi 2array ; | |
: >step ( str -- obj ) | |
(split-op-rest) | |
[ >op ] dip | |
[ first str>pair ] | |
[ last str>pair ] bi \ step boa ; | |
: <grid2> ( -- grid ) | |
V{ } clone 1000 [ 1000 <bit-array> ?V{ } clone-like over push ] times ; | |
:: rect ( grid step from to -- grid' ) | |
from first to first [a,b] [| m | | |
from second to second [a,b] | |
[ | |
m grid nth [ step perform-step ] change-nth | |
] each | |
] each grid ; | |
: perform-step ( elt step -- elt' ) | |
op>> call( a -- b ) ; | |
: interp ( grid step -- grid' ) | |
[ ] [ from>> ] [ to>> ] tri rect | |
; | |
: interp-all ( seq -- grid ) | |
<grid> [ >step interp ] reduce ; | |
: >op2 ( str -- quot ) { | |
{ "toggle" [ 2 + ] } | |
{ "turn on" [ 1 + ] } | |
{ "turn off" [ 1 - 0 max ] } | |
} at ; | |
: >step2 ( str -- obj ) | |
(split-op-rest) | |
[ >op2 ] dip | |
[ first str>pair ] | |
[ last str>pair ] bi \ step boa ; | |
: <grid2> ( -- grid ) | |
V{ } clone 1000 [ [ 0 ] 1000 <repeats> V{ } clone-like over push ] times ; | |
: interp2-all ( seq -- grid ) | |
<grid2> [ >step2 interp ] reduce ; | |
#! 123 -> x | |
#! 456 -> y | |
#! x AND y -> d | |
#! x OR y -> e | |
#! x LSHIFT 2 -> f | |
#! y RSHIFT 2 -> g | |
#! NOT x -> h | |
#! NOT y -> i | |
GENERIC: value> ( obj -- value ) | |
: (make-value) ( str-var-or-fixnum -- val ) | |
{ | |
{ [ dup string>number ] [ string>number ] } | |
[ get ] | |
} cond ; | |
M: fixnum value> ; | |
M: string value> (make-value) value> ; | |
TUPLE: wire left quot right value ; | |
: right-value ( wire -- value ) | |
right>> value> ; | |
: left-value ( wire -- value ) | |
left>> value> ; | |
MEMO: (eval-wire) ( wire -- value ) | |
[ left-value ] [ right-value ] [ quot>> ] tri 2curry | |
call( -- c ) 16 bits ; | |
#! \ (eval-wire) watch | |
M: wire value> (eval-wire) ; | |
: <wire> ( left quot right -- wire ) | |
f \ wire boa ; | |
#! recursive solver: resolve wire | |
#! if wire can't be resolved, shift to the end of the queue | |
#! M: numeric-wire resolve ( obj -- value-or-f ) value>> ; | |
#! M: func-wire resolve ( obj -- value-or-f ) apply-op ; | |
#! 1 input or 2 inputs | |
: >wire-op ( str -- op ) | |
{ | |
{ "AND" [ bitand ] } | |
{ "OR" [ bitor ] } | |
{ "LSHIFT" [ shift ] } | |
{ "RSHIFT" [ -1 * shift ] } | |
{ "NOT" [ nip bitnot ] } | |
} at | |
; | |
: (str>wire) ( str -- wire ) | |
" " split { | |
{ [ dup length 1 = ] [ first ] } #! single number or wire | |
{ [ dup length 2 = ] [ first2 [ >wire-op 0 swap ] dip <wire> ] } #! NOT var | |
{ [ dup length 3 = ] [ first3 [ >wire-op ] dip <wire> ] } #! x OP y | |
[ "foo" throw ] | |
} cond ; | |
: >wire ( str -- obj wire-name ) | |
" -> " split1 | |
[ (str>wire) ] dip ; | |
: input7 ( -- vec ) "af AND ah -> ai | |
NOT lk -> ll | |
hz RSHIFT 1 -> is | |
NOT go -> gp | |
du OR dt -> dv | |
x RSHIFT 5 -> aa | |
at OR az -> ba | |
eo LSHIFT 15 -> es | |
ci OR ct -> cu | |
b RSHIFT 5 -> f | |
fm OR fn -> fo | |
NOT ag -> ah | |
v OR w -> x | |
g AND i -> j | |
an LSHIFT 15 -> ar | |
1 AND cx -> cy | |
jq AND jw -> jy | |
iu RSHIFT 5 -> ix | |
gl AND gm -> go | |
NOT bw -> bx | |
jp RSHIFT 3 -> jr | |
hg AND hh -> hj | |
bv AND bx -> by | |
er OR es -> et | |
kl OR kr -> ks | |
et RSHIFT 1 -> fm | |
e AND f -> h | |
u LSHIFT 1 -> ao | |
he RSHIFT 1 -> hx | |
eg AND ei -> ej | |
bo AND bu -> bw | |
dz OR ef -> eg | |
dy RSHIFT 3 -> ea | |
gl OR gm -> gn | |
da LSHIFT 1 -> du | |
au OR av -> aw | |
gj OR gu -> gv | |
eu OR fa -> fb | |
lg OR lm -> ln | |
e OR f -> g | |
NOT dm -> dn | |
NOT l -> m | |
aq OR ar -> as | |
gj RSHIFT 5 -> gm | |
hm AND ho -> hp | |
ge LSHIFT 15 -> gi | |
jp RSHIFT 1 -> ki | |
hg OR hh -> hi | |
lc LSHIFT 1 -> lw | |
km OR kn -> ko | |
eq LSHIFT 1 -> fk | |
1 AND am -> an | |
gj RSHIFT 1 -> hc | |
aj AND al -> am | |
gj AND gu -> gw | |
ko AND kq -> kr | |
ha OR gz -> hb | |
bn OR by -> bz | |
iv OR jb -> jc | |
NOT ac -> ad | |
bo OR bu -> bv | |
d AND j -> l | |
bk LSHIFT 1 -> ce | |
de OR dk -> dl | |
dd RSHIFT 1 -> dw | |
hz AND ik -> im | |
NOT jd -> je | |
fo RSHIFT 2 -> fp | |
hb LSHIFT 1 -> hv | |
lf RSHIFT 2 -> lg | |
gj RSHIFT 3 -> gl | |
ki OR kj -> kk | |
NOT ak -> al | |
ld OR le -> lf | |
ci RSHIFT 3 -> ck | |
1 AND cc -> cd | |
NOT kx -> ky | |
fp OR fv -> fw | |
ev AND ew -> ey | |
dt LSHIFT 15 -> dx | |
NOT ax -> ay | |
bp AND bq -> bs | |
NOT ii -> ij | |
ci AND ct -> cv | |
iq OR ip -> ir | |
x RSHIFT 2 -> y | |
fq OR fr -> fs | |
bn RSHIFT 5 -> bq | |
0 -> c | |
14146 -> b | |
d OR j -> k | |
z OR aa -> ab | |
gf OR ge -> gg | |
df OR dg -> dh | |
NOT hj -> hk | |
NOT di -> dj | |
fj LSHIFT 15 -> fn | |
lf RSHIFT 1 -> ly | |
b AND n -> p | |
jq OR jw -> jx | |
gn AND gp -> gq | |
x RSHIFT 1 -> aq | |
ex AND ez -> fa | |
NOT fc -> fd | |
bj OR bi -> bk | |
as RSHIFT 5 -> av | |
hu LSHIFT 15 -> hy | |
NOT gs -> gt | |
fs AND fu -> fv | |
dh AND dj -> dk | |
bz AND cb -> cc | |
dy RSHIFT 1 -> er | |
hc OR hd -> he | |
fo OR fz -> ga | |
t OR s -> u | |
b RSHIFT 2 -> d | |
NOT jy -> jz | |
hz RSHIFT 2 -> ia | |
kk AND kv -> kx | |
ga AND gc -> gd | |
fl LSHIFT 1 -> gf | |
bn AND by -> ca | |
NOT hr -> hs | |
NOT bs -> bt | |
lf RSHIFT 3 -> lh | |
au AND av -> ax | |
1 AND gd -> ge | |
jr OR js -> jt | |
fw AND fy -> fz | |
NOT iz -> ja | |
c LSHIFT 1 -> t | |
dy RSHIFT 5 -> eb | |
bp OR bq -> br | |
NOT h -> i | |
1 AND ds -> dt | |
ab AND ad -> ae | |
ap LSHIFT 1 -> bj | |
br AND bt -> bu | |
NOT ca -> cb | |
NOT el -> em | |
s LSHIFT 15 -> w | |
gk OR gq -> gr | |
ff AND fh -> fi | |
kf LSHIFT 15 -> kj | |
fp AND fv -> fx | |
lh OR li -> lj | |
bn RSHIFT 3 -> bp | |
jp OR ka -> kb | |
lw OR lv -> lx | |
iy AND ja -> jb | |
dy OR ej -> ek | |
1 AND bh -> bi | |
NOT kt -> ku | |
ao OR an -> ap | |
ia AND ig -> ii | |
NOT ey -> ez | |
bn RSHIFT 1 -> cg | |
fk OR fj -> fl | |
ce OR cd -> cf | |
eu AND fa -> fc | |
kg OR kf -> kh | |
jr AND js -> ju | |
iu RSHIFT 3 -> iw | |
df AND dg -> di | |
dl AND dn -> do | |
la LSHIFT 15 -> le | |
fo RSHIFT 1 -> gh | |
NOT gw -> gx | |
NOT gb -> gc | |
ir LSHIFT 1 -> jl | |
x AND ai -> ak | |
he RSHIFT 5 -> hh | |
1 AND lu -> lv | |
NOT ft -> fu | |
gh OR gi -> gj | |
lf RSHIFT 5 -> li | |
x RSHIFT 3 -> z | |
b RSHIFT 3 -> e | |
he RSHIFT 2 -> hf | |
NOT fx -> fy | |
jt AND jv -> jw | |
hx OR hy -> hz | |
jp AND ka -> kc | |
fb AND fd -> fe | |
hz OR ik -> il | |
ci RSHIFT 1 -> db | |
fo AND fz -> gb | |
fq AND fr -> ft | |
gj RSHIFT 2 -> gk | |
cg OR ch -> ci | |
cd LSHIFT 15 -> ch | |
jm LSHIFT 1 -> kg | |
ih AND ij -> ik | |
fo RSHIFT 3 -> fq | |
fo RSHIFT 5 -> fr | |
1 AND fi -> fj | |
1 AND kz -> la | |
iu AND jf -> jh | |
cq AND cs -> ct | |
dv LSHIFT 1 -> ep | |
hf OR hl -> hm | |
km AND kn -> kp | |
de AND dk -> dm | |
dd RSHIFT 5 -> dg | |
NOT lo -> lp | |
NOT ju -> jv | |
NOT fg -> fh | |
cm AND co -> cp | |
ea AND eb -> ed | |
dd RSHIFT 3 -> df | |
gr AND gt -> gu | |
ep OR eo -> eq | |
cj AND cp -> cr | |
lf OR lq -> lr | |
gg LSHIFT 1 -> ha | |
et RSHIFT 2 -> eu | |
NOT jh -> ji | |
ek AND em -> en | |
jk LSHIFT 15 -> jo | |
ia OR ig -> ih | |
gv AND gx -> gy | |
et AND fe -> fg | |
lh AND li -> lk | |
1 AND io -> ip | |
kb AND kd -> ke | |
kk RSHIFT 5 -> kn | |
id AND if -> ig | |
NOT ls -> lt | |
dw OR dx -> dy | |
dd AND do -> dq | |
lf AND lq -> ls | |
NOT kc -> kd | |
dy AND ej -> el | |
1 AND ke -> kf | |
et OR fe -> ff | |
hz RSHIFT 5 -> ic | |
dd OR do -> dp | |
cj OR cp -> cq | |
NOT dq -> dr | |
kk RSHIFT 1 -> ld | |
jg AND ji -> jj | |
he OR hp -> hq | |
hi AND hk -> hl | |
dp AND dr -> ds | |
dz AND ef -> eh | |
hz RSHIFT 3 -> ib | |
db OR dc -> dd | |
hw LSHIFT 1 -> iq | |
he AND hp -> hr | |
NOT cr -> cs | |
lg AND lm -> lo | |
hv OR hu -> hw | |
il AND in -> io | |
NOT eh -> ei | |
gz LSHIFT 15 -> hd | |
gk AND gq -> gs | |
1 AND en -> eo | |
NOT kp -> kq | |
et RSHIFT 5 -> ew | |
lj AND ll -> lm | |
he RSHIFT 3 -> hg | |
et RSHIFT 3 -> ev | |
as AND bd -> bf | |
cu AND cw -> cx | |
jx AND jz -> ka | |
b OR n -> o | |
be AND bg -> bh | |
1 AND ht -> hu | |
1 AND gy -> gz | |
NOT hn -> ho | |
ck OR cl -> cm | |
ec AND ee -> ef | |
lv LSHIFT 15 -> lz | |
ks AND ku -> kv | |
NOT ie -> if | |
hf AND hl -> hn | |
1 AND r -> s | |
ib AND ic -> ie | |
hq AND hs -> ht | |
y AND ae -> ag | |
NOT ed -> ee | |
bi LSHIFT 15 -> bm | |
dy RSHIFT 2 -> dz | |
ci RSHIFT 2 -> cj | |
NOT bf -> bg | |
NOT im -> in | |
ev OR ew -> ex | |
ib OR ic -> id | |
bn RSHIFT 2 -> bo | |
dd RSHIFT 2 -> de | |
bl OR bm -> bn | |
as RSHIFT 1 -> bl | |
ea OR eb -> ec | |
ln AND lp -> lq | |
kk RSHIFT 3 -> km | |
is OR it -> iu | |
iu RSHIFT 2 -> iv | |
as OR bd -> be | |
ip LSHIFT 15 -> it | |
iw OR ix -> iy | |
kk RSHIFT 2 -> kl | |
NOT bb -> bc | |
ci RSHIFT 5 -> cl | |
ly OR lz -> ma | |
z AND aa -> ac | |
iu RSHIFT 1 -> jn | |
cy LSHIFT 15 -> dc | |
cf LSHIFT 1 -> cz | |
as RSHIFT 3 -> au | |
cz OR cy -> da | |
kw AND ky -> kz | |
lx -> a | |
iw AND ix -> iz | |
lr AND lt -> lu | |
jp RSHIFT 5 -> js | |
aw AND ay -> az | |
jc AND je -> jf | |
lb OR la -> lc | |
NOT cn -> co | |
kh LSHIFT 1 -> lb | |
1 AND jj -> jk | |
y OR ae -> af | |
ck AND cl -> cn | |
kk OR kv -> kw | |
NOT cv -> cw | |
kl AND kr -> kt | |
iu OR jf -> jg | |
at AND az -> bb | |
jp RSHIFT 2 -> jq | |
iv AND jb -> jd | |
jn OR jo -> jp | |
x OR ai -> aj | |
ba AND bc -> bd | |
jl OR jk -> jm | |
b RSHIFT 1 -> v | |
o AND q -> r | |
NOT p -> q | |
k AND m -> n | |
as RSHIFT 2 -> at" "\n" split ; | |
: instructions>wires ( vec -- wires ) | |
[ [ >wire set ] each ] curry [ V{ } clone dup ] dip with-variables | |
; | |
: delta ( str -- len decoded-len ) | |
[ length ] [ 1array <lexer> [ parse-string drop parse-string length ] with-lexer ] bi ; | |
: long-delta ( str -- len double-enc-len ) | |
[ length ] keep "\"" "\"" unparse-string length ; | |
#! day 9: some kind of traveling salesman thing | |
#! day 10: see/say sequences | |
: (should-split) ( current prev -- ? ) | |
= not ; | |
:: (split-group) ( input -- head tail-or-f ) | |
input first :> prev | |
input dup | |
[ prev (should-split) ] find drop | |
dup [ cut-slice ] [ drop "" ] if ; | |
: (see-say-group) ( input -- str ) | |
histogram >alist first first2 [ 1string ] dip number>string swap 2array concat ; | |
: (see-say) ( input -- output ) | |
dup length 0 = [ ] [ | |
(split-group) [ (see-say-group) write ] dip | |
(see-say) | |
] if | |
; recursive | |
: see-say ( input -- output ) | |
[ (see-say) write ] curry with-string-writer ; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment