summaryrefslogblamecommitdiffstats
path: root/2024/tcl/05.tcl
blob: 1ea1e4d22e04b85729ba9b52eacdb9c3b7916561 (plain) (tree)



































































                                                                                              
#!/bin/env tclsh

source lib.tcl
setup 5

puts {Part 1: Total of middle numbers of update sets matching rules}

set rules {}
set updates {}
set dorules 1
foreach line $input {
  if {$line == {}} {set dorules 0; continue}
  if $dorules {
    lassign [split $line |] X Y
    dict lappend rules $X $Y
  } else {
    lappend updates [split $line ,]
  }
}

proc rulesorter {a b} {
  global rules
  if {[dict exists $rules $a] && [lsearch -exact [dict get $rules $a] $b] != -1} { return 1 }
  if {[dict exists $rules $b] && [lsearch -exact [dict get $rules $b] $a] != -1} { return -1 }
  return 0
}

#puts $rules
#puts $updates

set middle_total 0
set bad_updates {}
foreach update $updates {
  set update1 [lassign $update seen]
  set updateok 1
  foreach page $update1 {
    lappend seen $page
    if ![dict exists $rules $page] continue
#    puts "[list $update]: $page, [dict get $rules $page], $seen"
    foreach rule [dict get $rules $page] {
      if {[lsearch -exact $seen $rule] != -1} {
#        puts $update\n$page\n$seen\n$rule
        set updateok 0
        break
      }
    }
    if !$updateok break
  }
  if $updateok {
#    puts "adding [lindex $update [expr {[llength $update] / 2}]] [list $update]"
    incr middle_total [lindex $update [expr {[llength $update] / 2}]]
  } else {
    lappend bad_updates $update
  }
}

puts "Total of middle numbers: $middle_total"

puts ""
puts {Part 2: Total of middle numbers of sorted unordered sets}

set bad_middle_total 0
foreach update $bad_updates {
  set update [lsort -command rulesorter $update]
  incr bad_middle_total [lindex $update [expr {[llength $update] / 2}]]
}

puts "Total of middle numbers: $bad_middle_total"