#!/usr/bin/env tclsh set state 0 while {[gets stdin line] >= 0} { switch -- $state { 0 { if {$line eq ""} {set state 1; continue} if {[scan $line {%[^:]: %d-%d or %d-%d} field min1 max1 min2 max2] != 5} { continue } set rule($field) [list $min1 $max1 $min2 $max2] lappend rules $rule($field) } 1 { if {$line eq ""} {set state 2; continue} if {$line eq "your ticket:"} continue set your [split $line ,] } 2 { if {$line eq ""} break if {$line eq "nearby tickets:"} continue lappend nearby [split $line ,] } } } set errors 0 foreach tkt $nearby { foreach i $tkt { set ok 0 foreach r $rules { lassign $r min1 max1 min2 max2 if {($i >= $min1 && $i <= $max1) || ($i >= $min2 && $i <= $max2)} { set ok 1 break } } if {! $ok} { # puts "invalid: $i" incr errors $i } } } puts $errors