Compare commits

...

3 Commits

Author SHA1 Message Date
magical f638ffbff7 day 15 solution 2023-12-15 06:11:06 +00:00
magical 5ad3c05219 day 14 part 2 2023-12-14 09:46:06 +00:00
magical cf548cb740 day 14 part 1 2023-12-14 09:45:13 +00:00
6 changed files with 302 additions and 0 deletions

100
day14/input 100644
View File

@ -0,0 +1,100 @@
.O....O.OOO..O.#.#.###.#O....OO..OO.O...O...O###..#.#....#.#....##..O.O.O##.......O.#.O.......##O#O.
..#.#.#......O........O#OOOO#.O.#.#.#..O.#O...#..O...#..O.O#......#O...##O...O.#...O.O...##O.O.O...#
.......O.OO..O.##.#..O.#...O#.#.......O.O.##.......#.O..#.......O.....#...O...#.#OO......#....#.....
....#.....O#.O..O..#..#OO.#OO....#.......O..O.O...#.....#.O.....O..O.O....#..#O..O.#.O....O.......#O
.........O.O....O.#O..#..........#O#......###.#..OO...#.O#O.O.O#....##...O.O..#.O..OO.#.OO...O#.OOO.
.#O..#.O....#O...O#.........O#O..#O..#O.O.OO..O..#...#O...O..OOOO.....O..O.........O..#O##......O##.
..O#.O.....#.O..O.#.O......O#O.#..#.O.O..#..O.O#..O..#O.....##.#....#..OO.#.........OO....#...O....O
.O.O#..O.###....O#....O...#....O.O....O.O.O......O.O###OO.#.O...O..O..O.....O.#.O#..OO..O#.OO#OO.#OO
OO...#O#......#####OOO.O###...........O#....#.#.O.O.##...O#.O...........OO.#...#......O.O....#..O..#
.O..OO....#.#.##O.O#..OO....#...O..O...O.O###.##O.......#O.....##.O..O##.....O...OO.#....#.#.O.....#
OOO#O.....O.O....O.O#....O.OOO........#..#.O..#...O...OO#.O...OO#..O..O.#..##.......#......O....O.O.
......O..OOO..OOO..##OO...O...#.#.#..O..#..#OOO...O.O.O#......O#.....#..O#O...#.OO.....#.O.#.OOO..#.
O...........OOOO.OO#O....#........O...#.##......#.OO..O.OO.#.O.....OO#.#..#.OOO.#.#..#..O.....OO..#.
....O..O.O.#....OO.#.#O..#....#..O#..........O..O.O#......#....###.O.#..#.#......O......O....#.#O..O
....#O....#..OO..O#O.#.OO##O..O##..O..O.......##......OO..OOO#..O..OO....O.#..O##..#......#.O.....OO
.O.#.O..##O#...##....##.#.O..#O#O.......#...O..........O.O.......O.....O..#.....#....#.O.#.#...O...O
....###....#.....#O.#O###O#.O....#O#O.##.OO#.O#O..#..O..#..#.O##.............O....#O...#.....O...O##
.O...##....O..#..#..O#.......O....O...O.O..#O...#.......#.......O.O..O#.O##..O.O......#...#......O..
......O##..OOOO#.........O......O.#O.....#OO..#.O..OO......#.O...##.##...O#.........#.....#.........
.#.....OO....OO..O.#OO#..#.#.##.O....O..OO.O.........O..O.O....##...#.O#.O..#........O#.O##.#...#.OO
.O.#....O.O#......OO..#OOO.O........##.O.....#O......#.....OO..O#..O...O..O#O...........#.#O...#O...
....O#O...#...#..#.##O...OO.#.#.O..#....O....#.O....##.........O.O.#...#...#....O...#...##.#..#...O.
..#O##...O.OO.#.#....O...#...#....O...O....#.#.O.O.OO..O.OO.......#.O#....O##.O#.O..O##O........OO#.
.#...##.#.O...O..........O.O##..##.O###..##...O..#.O.....O##O...O.....O.......O..#..#.O#.#....#O#...
O..#O#.O......#..##.O...O.##O.#...O....O.O.#....O........OO..#.O...O....###.O.O#.#O...O.#O.....#.O..
#.O...O.O......O.O.O....O..#O...O..OO.OOO...#.O.OO....#......#.#.O.O#..O..O...#O#.......O.OO.##..O..
..OO..#O#.O#..##....#..OOO...#O..O.O.#.#.OOO#.#...#.OO#O......#.#..#......OO..O..#..#..##..O#....O#.
.OO#...O#O.#.#..O..#......O...O......O#.#.##O...#.#..#..#.###..O.###.#....O...O..#...#O......O....O.
O....#O..##...O...O..O#O#.....#O.....#..#.#....#...##..#.....#.#......###O....#OO#.##O..O.O....O....
....O.###.....O...O.O...O...O#OO..#.#.....O.OO.....#O...##O#OOO.#..O...OO#O.O....O....O..#..O....#..
...O..#O..O...O......##OO..O..O.....O....O..O##O.#OO..#O..O.#......#.O..#O.......O....O#...O.O.....O
...O#O..#..O.O......O.....#..................#O..##.#....O..O....O#...##.O...#.O.#........#O#..#..OO
O....O.#.......#O#....O...O.#O...OO.O..OOO..#...#.OOOO.O..#..#....O.........#.#..O..#..#.#.O..OO.O..
#O..O......O...O#......O#..#...O.#O.#.O...#.#.#.O....#O.#..O#...OO...#O#..O...#O.#.##O.O..O#O#.#O.O#
#.##...O..O.O...##...O..#OO...OO........O....OO..OO.......O##.OO..#..#............#.O.......#.O.OO#.
O#..#.OO..##....#O..OO..#...#..#..###.#O...O#..#.....O.O.#OO.........O..O...#....#.#O....#.O.....O..
..OO.O......O.OO.OO.....O..#OO...##.O.O.O.#.#O#..#...O...O...#...O...O...#.........#....#.#.O#......
O..#.....##O.#O....OOO.........O..#...#......##.#O.......O.OO....OO..OO..#.#...O#O..##........#O..O.
##.O...#..#.O##.O......O...#....#.O..#...OO....O.OOO...#O#.#OO....##.#O......##......O..OO.......#..
....O........#.O#...........O..#..#OO.OOO#.OO##...#.OO............##O...O.O.O#.....#..#.O.#.#.O...O.
O.#....O....#...O#O..#O.O..#..#O...#.O..O.O.....OO....OO##....O.O#.......#...O.....#OO.#....O.OOO...
O...#..#...#..OO...##.....#OO#O....#.#.OO.......O..O..O..#..#......O..OO...O.OO.O..OO#..###O#O.....#
........OO#.O..#.....###....O........O....O.O..O#.OOO....#OO##.O#OO.......#.O......O.O......O...O.O.
...#.#...#O..#...O.#.OO.O........O#....#O..O..O.O#.O...#..#.OO.OOOO.#...#...O...#O..#..OOO..O...O#.O
O.OO#O#.#.#O..O#OOO..O..#.##..#.##OO#.#..#O.O#O.O...OO...O..O.......O.......##........#.##.......#..
OO.O.##.#.#...#...OO##.....#.O...#....O#.#.O..O..#...#....#O...OO....#.O...##O....#O.O..O#O...OO#.#O
.#...#....#....O#.O..#...OO##...O.#.#......#.O###.O.#OO....#......OO.......O#..#O#.OO..O.O......#O#.
..O#..O..O....#.#..#OOO....##O..#...O...##..##..##.O.O#...O......#........OOOO..O#.....O.#.#O.....#.
.#..#.O.........#..........OO.#...#.#..O...##OOO.......O..O###..#...#.......#.OO#..O..#....#OO......
.O..#.##.O..#..O....#.O......O#.......#..O.OO..O...#....##..O.#O.#..#.##O#.O..OO#O.#..O...#.#.O.O#.O
##....OO..##.OO....OO#.O#.O.#..#...O..#.#.O...O.O......O#...#.##.O........OO.....#O...##.#..OO.....O
..#.OOO......O.....O.#..O..O##..O..#.#...OO..#..O....O..#.#O........#.#.O...#.O....#...O...O......O.
..O#..#.#.#.O...O#..O.O..O.O#O...O..O..#O...#..O.O....#....O#...#O..##.#O..O.##O.O.#..O.O.....OO...O
..#.....OO....O.O..#....OO..O...#.#..OO..#O..#...O..O..#.##.OO.O.O.O.O.....#..#...#O.##..O...O.#.#..
....O...O....OO.......O.O.....O....OO...###..O##.......#...#O.#.O....O..#.O...#.OO#..O#.#..#...##...
...#O....OOO.OO..#.#.O.O.O.#..O..O#...O.#O..........#..#OO...#.O..#O...OOO..#...#....#...O.OO#O....O
O...O....O.O...#...##O...O....OO#O.O##.##..O..#...OO.......#....OOO.O.#.#....O...OOOO.#.....#....#O.
.....OOO....O..O.#..O#O#......OO...........#......O.OO.OO.#..O..#.O#.OOOOO.O..##OO...O..#.O..O.O.O.O
#..#.O..OO....#.###O...O....#O#O#OO...O.O#.....OO.O..O.O......O.OOO#.........O.#..O..O.O.O#.O.O..OO.
#O.O..#....#O.#..O#OO....O........#.....O...##...OOOO.O............O.....OO.O....##O..##.#......O...
O#.#..#.O.....#O....#.#..O.O.......O..O...#OO....#...OO.#....O.O.O.....O...#O.#O.O.O#....O#.........
..O.O......O..#.O..O..O#OO........O..#.O.#.....O#O#O#.#O#..##O....OO.#..O.O#..OO.....OO.OO......##O#
.OOOO.##.#.#......O..O...O##O##.O.OOO#.O.O.OO....O.......O.#....O..##......#...O..#..##O#OO..##...O.
......#O.##....#...O.#.#.O##..O.#.......##.OO#O#.##..O.....#.#.#O.....#O.O#O......O....#.#....O#.OOO
..#......#..O#.......O#.#OOO...#...O#............O.O.#.#O..##...#O#O....#.....##O#.O.OO...O...O#.OO.
.#.O.#.#.OOO..#.#.O#...#..#...O...O...O#.OO...OO.O#..O.#...OO#.#..O....#.O#.O#..O#.##.O.O..O.O#.O.O.
O.O#.OO#O.OO#O.....O.O.O.O...#OO....#.#...O.O.OO.O#.#.O.OO..#.O.O...#.....#....OOO....#.O.O.OO#...O.
O#O......O......O..#......O.....#O#O..O......#...O....O#O##.....O#....#...#.#.....OO#.O.O.O#OO..#.#O
O#.....#.O#O.#.....O.OOOO........#.#O......OO.O.O.....O....#O.##.O.....OO....O#..O......O......#..OO
..#..#..OO..#.#...#O...###...O...#.#....O...O.#..O...O.O.#......#......#O.O...#OO.#O...#.O....O...O#
OOO.O.OO..#.O.#O.OO.........#..........#.O#......O..#O.#..#O......#..#.O#.......O..............O..O.
.OO.O.....OO...O.O..##....O.......OO..#O##..O..#.#.O#.#.O.....#..#.O.......O.##.O..#.OO.OO..........
.........##O.#.#......#...O...##OO.OO....OO...#.OOO#.....O..#...#O.O..##.O#.O...........O#.O#.#O.O..
..O#..#O#..........OO.O......#...O.....O.O#..O#.#..........OO...#.#...O##....OO.#O.....##O...O.#....
.###.O.#O.#....O.#.#O#..O..........O..#.##O.#...O.O#..#..#O.O.##...#O....O.#..O.O..#.O..#O#.#......O
OO.......#.O...##..#.#..#OO...O...............OO#.....#.O...#.........#..O...O....O.....##..O.......
.#..O..##.OO..O#...O.....OOO.#..O#.OO...##.O.OO.O...OO.O.O#O.....O#...........#..OOO.OO##.O#..#OO.O.
.O.....O..#...O..O......O.O...O.....O........O...#.#O...O#O.O...###.O..O.O...#O...O.O.OO.O.O...O#OO.
.............#...#O..O#O.O.O....O................#....O....#O.O..........OO#.##..#.O##.........#....
#O##O#OOO.#..O..O....O..O.##..OOO..O.O...............O..O.O#O.###......O...O......OOO.##.#...OO..O.#
O...OO#O.O#.OO..OO........#.O....O...#........O...#..O...##O...O#...........#.O.#...O#...O#..#OO..O.
.##O.#...O...O....#O#...#O.O#.O##...#....O#..#..#OO....#......#..O#..O.O..O...O..........O...#..O...
.....O...#...........O..O..##.....O.OO.....#O..OO..#..O.....#......O...##O##.#.#...O.OO.OO##.#.#..#.
#..O...#.##O#.#OO..##O....O...#.O.#O#..O...OO..O....O#O#.#....O...........O......##O.....#...#...##O
O..........OO..O.#..O.#...O.#.#.#......#.O..O#......O....O.O.O.O.##.O#..##....O#O#....O........#.O.O
OO...##.....O..O.#O...O..OO.#.O.O.#.O.........O...O.O.O.O.#.#O...O..#.O.....#....#..#...O#..#..O...#
O##...#OO#.##.OO.O..#..OO.......OO.OO#.OO..O.......O.......OOO.#...#O#O.#..O......O..O.....#...##.#.
#..O..#.OO.#.O.O.O.#.O##...#.O.O....###......O#OO.......OO..OO....#...O...#.........OO....O.......O.
...#.#.##.....#...........O.OO.....O.OO..O.O..#..#....#..#O..O#....O#OO##.#.....O.....#.......O#O.O.
.#..O.#...##...O.O.#...O.....#O.#O..#.OOO...........##.....#.#O#.##....OO#.O.....O.....OO.O.O.OO....
#O#..OO..O#..O..O...OO.OO.#.....OO.......#.....O.O.O#..OOO......O.#..#O...O..O..O.#....O.O..OO#OO#..
O.###O.O...O.....O..#.O..O...O..OO##.O..##..O..O...##O.#....#.O.O....O.O.........#OO#O....O.....O..O
........#.O...O...#.#.#OO.O.#.O.....O#...O....O..#....#..O..#..........OO..#.O....OO.O..O...OOO...O#
.#.#...........O.O.......#.#O..O....#O..O...O.O..O..#.#.....O.....O.#...OO.O....#O..O.O#.O.....#....
.O.#...##.#.OO..#O...#....#.#.......#...#O....#.....O...O#.#.OO.#.O#.....OO....#.OO..#..O.O.OO....O.
.OO#OO#.##.##OO..O.....O..O#OO.O.#....#....#.OO##..#..#.........#..............OO...O.....O.......#.
..O.....#..#.......O..#O...#...#.O.........###.#...O.O.#....O................O.#O#O#..O..#.#...#..#O
..#O...O.......OO#.#..#O.....OO.OO..O..##....#.O#...#.O..O.OO.....#..O...OO.O.O....#O..O.#..#......O
.O.......O.....O..O...#.....O..O##..#......O.#...O#O.#.O.O.O.OO.O.#......OO.OOO.O#.OOO#O...#..#.O...
...O.O#.OOO##.O#O...O##.O....O..O.##.#OO..O#.O.O...OOO#..O...##......#O........O..O.O....O........OO

10
day14/sample1.in 100644
View File

@ -0,0 +1,10 @@
O....#....
O.OO#....#
.....##...
OO.#O....O
.O.....O#.
O.#..O.#.#
..O..#O..O
.......O..
#....###..
#OO..#....

82
day14/sol.tcl 100755
View File

@ -0,0 +1,82 @@
#!/usr/bin/env tclsh
source ../prelude.tcl
set input stdin
proc roll-left lane {
set prev {}
while {$prev ne $lane} {
set prev $lane
regsub -all {(\.+)(O+)} $lane {\2\1} lane
}
return $lane
}
proc roll-right lane {
set prev {}
while {$prev ne $lane} {
set prev $lane
regsub -all {(O+)(\.+)} $lane {\2\1} lane
}
return $lane
}
proc cycle map {
set map [lmap l [transpose $map] {roll-left $l}] ;# North
set map [lmap l [transpose $map] {roll-left $l}] ;# West
set map [lmap l [transpose $map] {roll-right $l}] ;# South
set map [lmap l [transpose $map] {roll-right $l}] ;# East
return $map
}
proc calc-load lane {
set N [slen $lane]
set load 0
for {set i 0} {$i < $N} {incr i} {
if {[string index $lane $i] eq "O"} {
incr load [expr {$N - $i}]
}
}
return $load
}
set map {}
while {[gets $input line] >= 0} {
lappend map $line
}
set part1 0
foreach l [transpose $map] {
set r [roll-left $l]
set n [calc-load $r]
puts "$l => $r | $n"
incr part1 $n
}
puts $part1
puts [cycle $map]
puts [cycle [cycle $map]]
puts [cycle [cycle [cycle $map]]]
set start $map
set x 1
set warp 0
set goal 1000000000
for {set i 1} {$i <= $goal} {incr i} {
set map [cycle $map]
set ld [ladd [lmap l [transpose $map] {calc-load $l}]]
puts "$i ($ld) | $map"
#if {$i >= $x} {
#set x [expr {$x*10}]
#}
if {!$warp} {
if {[info exists seen($map)]} {
puts "$i == $seen($map)"
set warp [expr {$i - $seen($map)}]
incr i [expr {int(($goal - $i)/$warp)*$warp}]
puts "warping to $i"
}
set seen($map) $i
}
}
#puts "$goal\t| $map"
#puts [ladd [lmap l [transpose $map] {calc-load $l}]]

1
day15/input 100644

File diff suppressed because one or more lines are too long

95
day15/sol.tcl 100755
View File

@ -0,0 +1,95 @@
#!/usr/bin/env tclsh
source ../prelude.tcl
proc slurp filename {
set fd [open $filename]
set data [read $fd]
close $fd
return $data
}
set sample "rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7"
set input [trim [slurp ./input]]
proc ord c {
return [scan $c "%c"]
}
proc hash s {
set h 0
foreach c [split $s ""] {
set h [expr {(($h + [ord $c]) * 17) % 256}]
}
return $h
}
proc sum s {
set t 0
foreach part [split $s ","] {
incr t [hash $part]
}
return $t
}
puts [hash HASH]
puts [sum $sample]
puts [sum $input]
proc place {boxp lens} {
upvar $boxp box
set i [string first "=" $lens]
if {$i >= 0} {
set label [string range $lens 0 $i-1]
set num [string range $lens $i+1 end]
set h [hash $label]
set i 0
set found 0
if {![info exists box($h)]} { set box($h) {} }
foreach {l n} $box($h) {
if {$l eq $label} {
lset box($h) $i+1 $num
set found 1
break
}
incr i 2
}
if {!$found} {
lappend box($h) $label $num
}
} else {
set label [trim $lens "-"]
set h [hash $label]
#puts "$lens $label $h"
if {[info exists box($h)]} {
set i 0
foreach {l n} $box($h) {
if {$l eq $label} {
#puts "removing $i from $h"
set box($h) [lreplace $box($h) $i $i+1]
break
}
incr i 2
}
}
}
}
proc solve input {
set parts [split $input ","]
foreach part $parts {
place box $part
#puts [array get box]
}
set t 0
foreach {h elems} [array get box] {
set slot 0
foreach {l n} $elems {
incr slot
incr t [expr {($h+1) * $slot * $n}]
}
}
puts $t
}
solve $sample
solve $input

View File

@ -32,3 +32,17 @@ proc must_regexp args {
error "regexp failed"
}
}
# transpose an array of strings
proc transpose strings {
set out {}
set C [slen [lindex $strings 0]]
for {set i 0} {$i < $C} {incr i} {
set column {}
foreach row $strings {
lappend column [string index $row $i]
}
lappend out [join $column ""]
}
return $out
}