#!/usr/bin/env tclsh9.0 proc input {} { global towels patterns fail gets stdin line set towels [split [string map {{ } {}} $line] ,] set patterns [list] while {[gets stdin line] >= 0} { if {$line eq ""} continue lappend patterns $line } set fail [dict create] } proc show {} { global towels patterns puts "Towels: [join $towels { }]" puts "" puts [join $patterns \n] } proc find {pattern start} { global towels global fail # puts " start $start" if {$start eq $pattern} {return 1} set need [string range $pattern [string length $start] end] # puts " need $need" if {[dict exists $fail $need]} { # puts " remembered failure $need" return 0 } foreach t $towels { if {[string match $t* $need]} { # puts " recurse with $t" if {[find $pattern $start$t]} {return 1} } } # puts " remembering failure $need" dict set fail $need 1 return 0 } proc count {} { global patterns set total 0 foreach p $patterns { # puts -nonewline .; flush stdout # puts "seeking $p" if {[find $p ""]} {incr total} } # puts "" puts $total } input # show count