Nur so als Hinweis:
http://de.wikipedia.org/wiki/Prolog_...n_R.C3.A4tsels
Nur so als Hinweis:
http://de.wikipedia.org/wiki/Prolog_...n_R.C3.A4tsels
Hallo,
da ich durch C nicht durchblicke, hier noch ein Versuch durch Tauschen der Stellen in der Richtung wie Manf vorgeschlagen hat ?
Algorithmus ist mit Turbo Pascal ausprobiert, Bascom Prg aber nur bis 4 Stellen im Simulator getestet.Code:$regfile = "attiny45.dat" $framesize = 32 $swstack = 32 $hwstack = 36 $crystal = 8000000 Const Max_positionen = 4 'Anzahl Stellen Const Max_pos_decr = Max_positionen - 1 'Hilfskonstante Dim Zahl(max_positionen) As Byte 'enthält jeweilige Kombination Dim Roll_pos(max_positionen) As Byte 'Hilfsvariable für Rollpositionen Dim Zahl_str As String * Max_positionen 'variable für Ausgabe der Kombination Dim Ab_stelle As Byte 'Übergabevariable in Sub "rollen" Dim I As Byte , Zw1 As Byte , Zw2 As Byte Dim Moeglichkeit_nr As Long 'zählt gefundene Möglichkeiten durch Defbyte S 'Noch nicht decl. Variablen beg. mit S as byte Declare Sub Rollen(ab_stelle As Byte) Declare Sub Ausgabe '#################### 'Beginn Hauptprogramm Moeglichkeit_nr = 0 For I = 1 To Max_positionen Zahl(i) = I - 1 Roll_pos(i) = Max_positionen - I Next I 'Zahlarray mit maximal 10 Stellen mit Ziffern 0..9 'links ist Stelle 10 - ST10 , rechts ist Stelle 1 - ST1 'läuft mit 4 Stellen 'zum Erweitern Kommentare entfernen UND Konstante Max_positionen anpassen 'For St10 = 1 To 10 ' For St9 = 1 To 9 ' For St8 = 1 To 8 ' For St7 = 1 To 7 ' For St6 = 1 To 6 ' For St5 = 1 To 5 For St4 = 1 To 4 For St3 = 1 To 3 For St2 = 1 To 2 For St1 = 1 To 1 Ausgabe Next St1 Rollen Roll_pos(1) Next St2 Rollen Roll_pos(2) Next St3 Rollen Roll_pos(3) Next St4 ' Rollen Roll_pos(4) ' Next St5 ' Rollen Roll_pos(5) ' Next St6 ' Rollen Roll_pos(6) ' Next St7 ' Rollen Roll_pos(7) ' Next St8 ' Rollen Roll_pos(8) ' Next St9 ' Rollen Roll_pos(9) 'Next St10 End 'end program '########## 'Beginn Unterprogrammdefinitionen Sub Rollen(ab_stelle As Byte) 'links rollen um 1 der rechten Stellen in "Zahl" ab "ab_stelle" Zw1 = Zahl(ab_stelle) For I = Ab_stelle To Max_pos_decr Zw2 = I + 1 Zahl(i) = Zahl(zw2) Next Zahl(max_positionen) = Zw1 End Sub Sub Ausgabe Incr Moeglichkeit_nr 'Wieder eine Möglichkeit mehr zur Ausgabe 'Hier eigene Ausgabeanweisungen rein 'zb Print Zahl_str = "" For I = 1 To Max_positionen Zahl_str = Zahl_str + Str(zahl(i)) 'Kombination im Zahl array in String geben Next I End Sub
EDIT: Etwas spät, aber ich möchte die Arbeitsweise vom Programm noch etwas erklären:
Das Array "Zahl" enthält soviele Elemente, wie verschiedene Elemente vorhanden sind, von denen Permutationen gebildet werden sollen. In diesem Fall 10 für die Zahlen 0 bis 9.
Das Array wird dann mit den Zahlen 0..9 gefüllt. Möglich sind auch Buchstaben oder sonstwas, wenn es dem Arraytyp entspricht bzw der Arraytyp angepaßt wird.
Danach läuft das Programm in die For-To Schleifen und landet bei "Ausgabe" -> es wird die Initialisierung von "Zahl" als erste Möglichkeit ausgegeben.
Nach der Ausgabe wird der Inhalt nur der beiden letzten Arrayelemente nach links gerollt (was für die beiden ein Austausch bedeutet.)
Das wird dann als nächste Möglichkeit wieder zur Ausgabe gebracht und die letzten beiden Arrayelementinhalte wieder getauscht, was zum Initialisierungszustand zurückführt.
Nun ist ST2 aber erfüllt und ein Rollen von 3 Elementen ab dem drittletzten Element findet statt und danach ausgegeben.
Die letzten beiden Elemente werden wieder gerollt und ausgegeben, weiter wie oben.
Das findet für ST3 drei Mal statt - Initialisierungszustand wieder erreicht, der nicht ausgegeben wird - ab viertletztem Element gerollt - Ausgabe
...und so weiter.
Gruß
Searcher
Geändert von Searcher (01.08.2011 um 09:05 Uhr)
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
@Searcher:
Wenn ich mich nicht irre macht doch das Programm von radbruch das Selbe oder?
Ich glaube das Rätsel wurde (in mehreren Sprachen gleich) gelüftet und der Thread kann geschlossen werden.
Danke für eure Beteiligung.
Hi,
ich kann radbruchs C Programme nicht verstehen. Seine Bascom Programme, wenn ich das richtig verstehe, nehmen Ziffern und vergleichen, ob diese schon in der Kombination vorhanden sind.???
Mein Programm verzichtet darauf und tauscht stur die Stellen durch.
Bitte um Berichtigung, wenn ich da was falsch interpretiert habe.
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Hallo Searcher
Deine Lösung funktioniert leider auch nicht richtig, weil sie nicht alle Ziffern von '0' bis 9' berücksichtigt. Ausgabe deiner Variante:
Kombinationen und Anzahl der Kombinationen. Richtig wäre 10*9*8*7=5040 Kombinationen. Hier die Kombinationen mit drei Stellen:Code:0123 0132 0231 0213 0312 0321 1230 1203 1302 1320 1023 1032 2301 2310 2013 2031 2130 2103 3012 3021 3120 3102 3201 3210 24
https://www.roboternetz.de/community...2&d=1312105805
Gruß
mic
[Edit]
Das C-programm macht genau desselbe wie die Bascom-Variante. Es wird ein Array mit der Anzahl der gewünschten Stellen erzeugt und jede Stelle nacheinander mit allen Werten ausprobiert. Wenn der Wert für die aktuelle Stelle schon im Array vorhanden ist, wird dieser Wert übersprungen. Wenn man mit dem Wert für die erste Stelle startet, kann man alle weiteren Stellen mit dem selben Algorithmus errechnen:
Code:void suchen(uint8_t z) // z ist der Index im Array, es wird also die z-Stelle erzeugt { for(x[z]=0; x[z]<10; x[z]++) // Werte von 0 bis 9 erzeugen { gefunden=0; // flag wird gestezt, wenn Wert schon im Array erhalten ist for(y=0; y<z; y++) if(x[y]==x[z]) gefunden=1; // Alle Elemente im Array vor aktuellem Index prüfen if(!gefunden) // Wenn der Wert erstmalig im Array auftritt wird er im Array unter dem aktuellen Index espeichert { if(z < (ziffern-1)) suchen(z+1); // Rekursion! // Wenn noch nicht alle Stellen berechnet sind wird die nächste Stelle berechnet else { ausgabe(); // Ausgabe der Ziffernkombinationen in x[0] bis x[ziffern-1] nr++; } } } }
Geändert von radbruch (31.07.2011 um 14:49 Uhr)
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo radbruch,
das war ja schnell getestet! Die Ausgabe ist Absicht.
Wenn die Anzahl der Stellen auf 4 begrenzt ist, werden alle Permutationen der Ziffern 0, 1, 2, 3 ausgegeben. Zu Testzwecken durch die REMs auf 4 begrenzt.
Wenn die Anzahl der Stellen auf 10 ist, werden alle Permutationen der Ziffern 0, 1, 2, 3 ... 9 ausgegeben.
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Achso, das habe ich natürlich nicht versucht. Sorry. Dann bin ich mit meiner Lösung eigentlich übers Ziel hinausgeschossen.Wenn die Anzahl der Stellen auf 10 ist, werden alle Permutationen der Ziffern 0, 1, 2, 3 ... 9 ausgegeben.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Lesezeichen