#!/usr/bin/env tclsh source ../prelude.tcl package require struct::set set input stdin set part1 0 while {[gets $input line] >= 0} { regexp {^Card +(\d+): ([\d ]*) \| ([\d ]*)$} $line _ card winners numbers set matches [struct::set intersect $winners $numbers] set score [expr {1 << [llength $matches] >> 1}] incr part1 $score incr copies($card) for {set i 0} {$i < [llength $matches]} {incr i} { incr copies([expr {$card+$i+1}]) $copies($card) } } puts "-" puts $part1 foreach {c n} [array get copies] { if {$c > $card} { error "should not have any copies of card $c > $card" } } set part2 [ladd [lmap {card n} [array get copies] {list $n}]] puts $part2