#!/usr/bin/env tclsh9.0 proc issorted {line} { global rules set printed [list] foreach curr $line { foreach prev $printed { set key "$curr|$prev" if {[dict exists $rules $key]} {return 0} } lappend printed $curr } return 1 } # Custom sorting function. proc pageorder {x y} { global rules if {$x eq $y} {return 0} set key "$x|$y" if {[dict exists $rules $key]} {return -1} return 1 } proc sort_and_score {line} { global rules set line [lsort -command pageorder $line] set n [llength $line] return [lindex $line [expr {($n - 1) / 2}]] } # No point splitting these rules. Just store them as read. set rules [dict create] while {[gets stdin line] >= 0} { if {$line eq ""} break dict set rules $line 1 } set total 0 while {[gets stdin line] >= 0} { if {$line eq ""} continue set pages [split $line ,] if {! [issorted $pages]} { incr total [sort_and_score $pages] } } puts $total