50 lines
1.4 KiB
Tcl
50 lines
1.4 KiB
Tcl
proc nextterm n {
|
|
foreach c [split $n ""] {incr t($c)}
|
|
foreach c {9 8 7 6 5 4 3 2 1 0} {
|
|
if {[info exist t($c)]} {append r $t($c) $c}
|
|
}
|
|
return $r
|
|
}
|
|
# Local context of lambda term is just for speed
|
|
apply {limit {
|
|
# Build a digit cache; this adds quite a bit of speed
|
|
set done [lrepeat [set l2 [expr {$limit * 100}]] 0]
|
|
# Iterate over search space
|
|
set maxlen 0
|
|
set maxes {}
|
|
for {set i 0} {$i < $limit} {incr i} {
|
|
if {[lindex $done $i]} continue
|
|
# Compute the sequence length for this value (with help from cache)
|
|
set seq {}
|
|
for {set seed $i} {$seed ni $seq} {set seed [nextterm $seed]} {
|
|
if {$seed < $l2 && [lindex $done $seed]} {
|
|
set len [expr {[llength $seq] + [lindex $done $seed]}]
|
|
break
|
|
}
|
|
set len [llength [lappend seq $seed]]
|
|
}
|
|
# What are we going to do about it?
|
|
if {$len > $maxlen} {
|
|
set maxlen $len
|
|
set maxes [list $i]
|
|
} elseif {$len == $maxlen} {
|
|
lappend maxes $i
|
|
}
|
|
# Update the cache with what we have learned
|
|
foreach n $seq {
|
|
if {$n < $l2} {lset done $n $len}
|
|
incr len -1
|
|
}
|
|
}
|
|
# Output code
|
|
puts "max length: $maxlen"
|
|
foreach c $maxes {puts $c}
|
|
puts "Sample max-len sequence:"
|
|
set seq {}
|
|
# Rerun the sequence generator for printing; faster for large limits
|
|
for {set seed [lindex $c 0]} {$seed ni $seq} {set seed [nextterm $seed]} {
|
|
lappend seq $seed
|
|
puts "\t$seed"
|
|
}
|
|
}} 1000000
|