Ein Ansatz in Bascom mit 4 Ziffern aus "0" -"9" ergeben 5040 Kombinationen:
[Edit]Code:' Zahlenproblem 29.7.2011 mic ' https://www.roboternetz.de/community/showthread.php?54210-Ein-Zahlenproblem $regfile = "m8def.dat" ' asuro mit Mega8 $crystal = 8000000 ' taktet mit 8MHz $baud = 2400 ' IR-Baudrate Dim Muster(10) As Byte Dim N(10) As Byte , M As Byte Dim Gefunden As Byte, Dim Nr As Long Print "{027}[1;1H"; ' Home Print "{027}[2J"; ' clear terminal screen Print "{027}[1m"; ' bold on Print "Zahlenproblem 29.7.2011 mic" Print "{027}[0m"; ' Attribute off Print Nr = 1 For N(1) = 0 To 9 ' erste Ziffer festlegen Muster(1) = N(1) 'If N(1) = 1 Then N(1) = 8 ' Abkürzung! For N(2) = 0 To 9 If Muster(1) <> N(2) Then ' wenn zweite Ziffer ungleich Muster(2) = N(2) ' zweite Ziffer festlegen For N(3) = 0 To 9 ' dritte Ziffer mit den anderen Ziffern vergleichen Gefunden = 0 ' ab hier könnte man das auch rekrusiv lösen For M = 1 To 2 ' aber so scheint es mir übersichtlicher If Muster(m) = N(3) Then Gefunden = 1 Next M If Gefunden = 0 Then Muster(3) = N(3) For N(4) = 0 To 9 ' n. Ziffer Gefunden = 0 For M = 1 To 3 ' Stellen 1 bis n-1 überprüfen If Muster(m) = N(4) Then Gefunden = 1 Next M If Gefunden = 0 Then ' wenn schon vorhanden, Ziffer überspringen Muster(4) = N(4) ' letzte Ziffer komplett Print Nr ; " - " ; Muster(1) ; Muster(2) ; Muster(3) ; Muster(4) Incr Nr End If Next N(4) End If Next N(3) End If Next N(2) Next N(1) Decr Nr Print Print "Erzeugte Kombinationen: " ; Print Nr Do Loop End 'end program
Weil ich ja schon fast am Ziel war habe ich mein Programm auf 10 Ziffern aufgebohrt:
Zum Debuggen lasse ich die Schleifenwerte der ersten drei Stellen ausgeben, hier der Start:Code:' Zahlenproblem 29.7.2011 mic ' https://www.roboternetz.de/community/showthread.php?54210-Ein-Zahlenproblem $regfile = "m8def.dat" ' asuro mit Mega8 $crystal = 8000000 ' taktet mit 8MHz $baud = 2400 ' IR-Baudrate Config Pind.5 = Output 'speaker Dim Muster(10) As Byte Dim N(10) As Byte , M As Byte Dim Gefunden As Byte, Dim Nr As Long Print "{027}[1;1H"; ' Home Print "{027}[2J"; ' clear terminal screen Print "{027}[1m"; ' bold on Print "Zahlenproblem 29.7.2011 mic" Print "{027}[0m"; ' Attribute off Print For Nr = 0 To 4000 Toggle Portd.5 Waitus 250 Next Nr Nr = 1 For N(1) = 0 To 9 ' erste Ziffer festlegen Print "1: " ; N(1) Muster(1) = N(1) 'If N(1) = 1 Then N(1) = 8 ' Abkürzung! For N(2) = 0 To 9 Print "2: " ; N(2) If Muster(1) <> N(2) Then ' wenn zweite Ziffer ungleich Muster(2) = N(2) ' zweite Ziffer festlegen For N(3) = 0 To 9 ' dritte Ziffer mit den anderen Ziffern vergleichen Print "3: " ; N(3) Gefunden = 0 ' ab hier könnte man das auch rekrusiv lösen For M = 1 To 2 ' aber so scheint es mir übersichtlicher If Muster(m) = N(3) Then Gefunden = 1 Next M If Gefunden = 0 Then Muster(3) = N(3) For N(4) = 0 To 9 ' n. Ziffer Gefunden = 0 For M = 1 To 3 ' Stellen 1 bis n-1 überprüfen If Muster(m) = N(4) Then Gefunden = 1 Next M If Gefunden = 0 Then ' wenn schon vorhanden, Ziffer überspringen Muster(4) = N(4) ' letzte Ziffer komplett For N(5) = 0 To 9 Gefunden = 0 For M = 1 To 4 If Muster(m) = N(5) Then Gefunden = 1 Next M If Gefunden = 0 Then Muster(5) = N(5) For N(6) = 0 To 9 Gefunden = 0 For M = 1 To 5 If Muster(m) = N(6) Then Gefunden = 1 Next M If Gefunden = 0 Then Muster(6) = N(6) For N(7) = 0 To 9 Gefunden = 0 For M = 1 To 6 If Muster(m) = N(7) Then Gefunden = 1 Next M If Gefunden = 0 Then Muster(7) = N(7) For N(8) = 0 To 9 Gefunden = 0 For M = 1 To 7 If Muster(m) = N(8) Then Gefunden = 1 Next M If Gefunden = 0 Then Muster(8) = N(8) For N(9) = 0 To 9 Gefunden = 0 For M = 1 To 8 If Muster(m) = N(9) Then Gefunden = 1 Next M If Gefunden = 0 Then Muster(9) = N(9) For N(10) = 0 To 9 Gefunden = 0 For M = 1 To 9 If Muster(m) = N(10) Then Gefunden = 1 Next M If Gefunden = 0 Then Muster(10) = N(10) 'Print Nr ; " - " ; Muster(1) ; Muster(2) ; Muster(3) ; Muster(4) ; Muster(5) ; 'Print Muster(6) ; Muster(7) ; Muster(8) ; Muster(9) ; Muster(10) Incr Nr End If Next N(10) End If Next N(9) End If Next N(8) End If Next N(7) End If Next N(6) End If Next N(5) End If Next N(4) End If Next N(3) End If Next N(2) Print "Zwischenstand: " ; Nr ; " Kombinationen erzeugt" Next N(1) Decr Nr Do Print Print "Erzeugte Kombinationen: " ; Print Nr Toggle Portd.5 Loop End 'end program
Da der Zähler voreilt sind es in Wirklichkeit "nur" 362880 Kombinationen die mit "0" beginnen. Erfreulicherweise stimmt hier die Theorie mit der Praxis überein:Code:1: 0 ' erste Ziffer ist "0" 2: 0 ' zweite Ziffer, "0" ist belegt, 2: 1 ' deshalb zweite Ziffer ist "1" 3: 0 ' dritte Ziffer, "0" ist belegt, 3: 1 ' "1" ebenfalls, 3: 2 ' also ist "2" die dritte Ziffer 2: 3 ' ab hier wirds dann unübersichtlich, 3: 4 ' weil die inneren Schleifen keine Ausgabe 3: 5 ' machen und man deshalb die Sprünge 3: 6 ' nicht nachvollziehen kann 2: 7 ... (4 Minuten später!)... 2: 9 ' zweite Stelle bei "9" 3: 0 3: 1 3: 2 3: 3 3: 4 3: 5 3: 6 3: 7 3: 8 3: 9 ' dritte Stelle bei "9" Zwischenstand: 362881 Kombinationen erzeugt 1: 1 ' Übertrag zur ersten Stelle! Erste Ziffer ist jetzt "1" 2: 0 3: 0 3: 1 3: 2 3: 3
9*8*7*6*5*4*3*2=362880 :)
Wenn man die Zeit für die Ausgabe vernachlässigt ist mein 8MHz nach etwas mehr als 40 Minuten fertig mit allen Kombinationen...









Lesezeichen