day 7 part 2
parent
d4485070f4
commit
a0d4b47e16
|
@ -72,4 +72,3 @@ print(solve(part2(sample)))
|
||||||
print(fancy_solve(part2(sample)))
|
print(fancy_solve(part2(sample)))
|
||||||
print(fancy_solve(part2(input)))
|
print(fancy_solve(part2(input)))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue