day 7 part 2

main
magical 2023-12-07 07:01:53 +00:00
parent d4485070f4
commit a0d4b47e16
2 changed files with 61 additions and 22 deletions

View File

@ -71,5 +71,4 @@ def part2(data):
print(solve(part2(sample))) print(solve(part2(sample)))
print(fancy_solve(part2(sample))) print(fancy_solve(part2(sample)))
print(fancy_solve(part2(input))) print(fancy_solve(part2(input)))

View File

@ -1,5 +1,6 @@
#!/usr/bin/env tclsh #!/usr/bin/env tclsh
#source ../prelude.tcl #source ../prelude.tcl
proc {#} args {}
proc parse input { proc parse input {
return [join [split [read $input] "\n"]] return [join [split [read $input] "\n"]]
@ -7,21 +8,26 @@ proc parse input {
proc solve hands { proc solve hands {
foreach {hand bid} $hands { foreach {hand bid} $hands {
puts $hand\ [type $hand] puts "$hand: [type $hand] [typeJ $hand]"
} }
set sorted [lsort -index 0 -stride 2 -decreasing -command beats $hands] set result {}
#puts $sorted foreach cmp {beats beatsJ} {
set i 0 set sorted [lsort -index 0 -stride 2 -decreasing -command $cmp $hands]
set t 0 #puts $sorted
foreach {hand bid} $sorted { set i 0
incr i set t 0
incr t [expr {$i*$bid}] foreach {hand bid} $sorted {
incr i
incr t [expr {$i*$bid}]
}
#puts [lmap {a b} $sorted {list $b}]
lappend result $t
} }
#puts [lmap {a b} $sorted {list $b}] return $result
return $t
} }
proc index {c} { return [lsearch {A K Q J T 9 8 7 6 5 4 3 2} $c] } proc index {c} { return [lsearch {A K Q J T 9 8 7 6 5 4 3 2} $c] }
proc indexJ {c} { return [lsearch {A K Q T 9 8 7 6 5 4 3 2 J} $c] }
proc type hand { proc type hand {
@ -32,12 +38,43 @@ proc type hand {
set groups [lsort -decreasing -stride 2 -index 1 -integer [array get n]] set groups [lsort -decreasing -stride 2 -index 1 -integer [array get n]]
#puts $groups #puts $groups
return [switch -glob $groups { return [switch -glob $groups {
{? 5} {list 1} {? 5} {{#} Five of a kind; list 1}
{? 4 *} {list 2} {? 4 *} {{#} Four of a kind; list 2}
{? 3 ? 2} {list 3} {? 3 ? 2} {{#} Full house; list 3}
{? 3 *} {list 4} {? 3 *} {{#} Three of a kind; list 4}
{? 2 ? 2 *} {list 5} {? 2 ? 2 *} {{#} Two pair; list 5}
{? 2 *} {list 6} {? 2 *} {{#} One pair; list 6}
default {list 7}
}]
}
proc typeJ hand {
# type of hand, but with jokers replaced by the best card
if {$hand eq "JJJJJ"} {
# all jokers!
return 1
}
array set n {}
set j 0
foreach c [split $hand ""] {
if {$c ne "J"} {
incr n($c)
} else {
incr j
}
}
set groups [lsort -decreasing -stride 2 -index 1 -integer [array get n]]
# more of the same card is always better,
# so add the jokers to the most frequent card
lset groups 1 [expr {$j + [lindex $groups 1]}]
#puts $groups
return [switch -glob $groups {
{? 5} {{#} Five of a kind; list 1}
{? 4 *} {{#} Four of a kind; list 2}
{? 3 ? 2} {{#} Full house; list 3}
{? 3 *} {{#} Three of a kind; list 4}
{? 2 ? 2 *} {{#} Two pair; list 5}
{? 2 *} {{#} One pair; list 6}
default {list 7} default {list 7}
}] }]
} }
@ -52,10 +89,13 @@ proc xbeats {hand1 hand2} {
return $x return $x
} }
proc beats {hand1 hand2} { proc beats {hand1 hand2} { return [generic_beats type index $hand1 $hand2]}
proc beatsJ {hand1 hand2} { return [generic_beats typeJ indexJ $hand1 $hand2]}
proc generic_beats {typef indexf hand1 hand2} {
#puts "cmp $hand1 $hand2" #puts "cmp $hand1 $hand2"
set r1 [type $hand1] set r1 [$typef $hand1]
set r2 [type $hand2] set r2 [$typef $hand2]
if {$r1 != $r2} { if {$r1 != $r2} {
return [cmp $r1 $r2] return [cmp $r1 $r2]
} }
@ -63,8 +103,8 @@ proc beats {hand1 hand2} {
foreach c1 [split $hand1 ""] c2 [split $hand2 ""] { foreach c1 [split $hand1 ""] c2 [split $hand2 ""] {
#puts "c=$c1 $c2" #puts "c=$c1 $c2"
if {$c1 ne $c2} { if {$c1 ne $c2} {
set i1 [index $c1] set i1 [$indexf $c1]
set i2 [index $c2] set i2 [$indexf $c2]
#puts "i=$i1 $i2" #puts "i=$i1 $i2"
return [cmp $i1 $i2] return [cmp $i1 $i2]
} }