#!/usr/bin/env tclsh8.6 set row 0 while {[gets stdin line] >= 0} { if {$line eq ""} continue set col 0 foreach h [split $line {}] { set grid($row,$col) $h incr col } incr row } # Fence. for {set r -1} {$r <= $row} {incr r} { set grid($r,-1) 9 set grid($r,$col) 9 } for {set c -1} {$c <= $col} {incr c} { set grid(-1,$c) 9 set grid($row,$c) 9 } proc fill {b r c} { global grid basins if {[info exists basins($r,$c)]} return set basins($r,$c) $b set up [expr {$r-1}] if {$grid($up,$c) != 9} {fill $b $up $c} set down [expr {$r+1}] if {$grid($down,$c) != 9} {fill $b $down $c} set left [expr {$c-1}] if {$grid($r,$left) != 9} {fill $b $r $left} set right [expr {$c+1}] if {$grid($r,$right) != 9} {fill $b $r $right} } set basin 0 for {set r 0} {$r < $row} {incr r} { for {set c 0} {$c < $col} {incr c} { set up [expr {$r-1}] set down [expr {$r+1}] set left [expr {$c-1}] set right [expr {$c+1}] set islow 1 if { ([info exists grid($up,$c)] && $grid($up,$c) <= $grid($r,$c)) || ([info exists grid($down,$c)] && $grid($down,$c) <= $grid($r,$c)) || ([info exists grid($r,$left)] && $grid($r,$left) <= $grid($r,$c)) || ([info exists grid($r,$right)] && $grid($r,$right) <= $grid($r,$c)) } { set islow 0 } if {$islow} { fill $basin $r $c incr basin } } } foreach {key val} [array get basins] { incr size($val) } foreach {key val} [array get size] { lappend sizes $val } puts [lsort -integer $sizes]