#!/usr/bin/tclsh #tcl program set numero [lindex $argv 0] set premierNombreDisponible 0 set nombreChiffres 1 set termeCourant "1" proc suite {numero} { if {$numero==1} { return [list 1 0] ;#1 est le terme de la suite et #0 le prochain nombre disponible } set resultatPrecedent [suite [expr $numero -1]] set termePrecedent [lindex $resultatPrecedent 0] set premierNombreDisponible [lindex $resultatPrecedent 1] set terme "$termePrecedent$premierNombreDisponible" set termeSplite [split $terme {}] set tailleTerme [llength $termeSplite] set premierNombreDisponibleSplite [split $premierNombreDisponible {}] set nombreChiffres [llength $premierNombreDisponibleSplite] while (1) { #on cherche le prochain nombre disponible set dernierDeLaSerie "VRAI" for {set i [expr $nombreChiffres-1]} {$i>=0} {incr i -1} { if {[lindex $premierNombreDisponibleSplite $i]==0} { set dernierDeLaSerie "FAUX" break } } if {$dernierDeLaSerie=="FAUX"} { set premierNombreDisponibleSplite \ [lreplace $premierNombreDisponibleSplite $i $i 1] for {set j [expr $i+1]} {$j<$nombreChiffres} {incr j} { set premierNombreDisponibleSplite \ [lreplace $premierNombreDisponibleSplite $j $j 0] } set premierNombreDisponible [join $premierNombreDisponibleSplite {}] } else { set premierNombreDisponible "1" set zero "0" for {set i 0} {$i<$nombreChiffres} {incr i} { set premierNombreDisponible "$premierNombreDisponible$zero" } incr nombreChiffres } set premierNombreDisponibleSplite [split $premierNombreDisponible {}] #et on verifie qu'on peut le placer set limite [expr $tailleTerme-$nombreChiffres] set onPeutPlacer "VRAI" for {set i 0} {$i<=$limite} {incr i} { set egalite "VRAI" for {set j 0} {$j<$nombreChiffres} {incr j} { if {[lindex $premierNombreDisponibleSplite $j]!= \ [lindex $termeSplite [expr $i+$j]]} { set egalite "FAUX" break } } if {$egalite=="VRAI"} { set onPeutPlacer "FAUX" break } } if {$onPeutPlacer=="VRAI"} { break } } return [list $terme $premierNombreDisponible] } puts [lindex [suite $numero] 0]