Ein Ansatz in Bascom mit 4 Ziffern aus "0" -"9" ergeben 5040 Kombinationen:
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
[Edit]
Weil ich ja schon fast am Ziel war habe ich mein Programm auf 10 Ziffern aufgebohrt:
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
Zum Debuggen lasse ich die Schleifenwerte der ersten drei Stellen ausgeben, hier der Start:
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
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:
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