Autor |
Beitrag |
DaiweL
      
Beiträge: 27
|
Verfasst: Di 23.01.07 14:02
Hallo,
Also ich will ein Programm entwickeln welches ermöglicht einen 4-Stelligen Code zu Knacken, bzw. die Möglichkeiten anzeigt welche Kombinationen noch klappen könnten.
Die 4 Code Stellen sind numerisch also von 0..9
Bei einem Tipp bei einem anderen Programm gibt es 3 Zahlen aus:
zB. : 2-1-1
1. 2 Zahlen die an richtiger Stelle stehen.
2. 1 Zahl die richtig sind jedoch an falscher Stelle stehen.
3. 1 Zahl die falsch sind.
Mein Problem ist nun einen Ansatz zu finden um einen geeigneten algorithmus zu entwerfen
|
|
Logikmensch
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: Di 23.01.07 14:21
Wenn ich Dich richtig verstehe, meinst Du mit "anderem Programm" das Programm, in das der Code eingegeben werden muss. Das liefert dann als Ergebnis, wie viele Stellen richtig sind, in der Form wie Du es angibst?
Willst Du jetzt ein Programm schreiben, dass den Code erzeugt oder ein Programm, welches die von Dir angegebenen Ergebnisse ausgibt, also z.B. 2-1-1. Erinnert mich irgendwie an MasterMind.
Wenn es um das Letztere geht:
Ich würde den gesuchten Zahlencode als 4-stelligen String aufbauen und mit POS-Funktion und einer Schleife, die alle 4 Stellen durchtestet, drei Zähler erhöhen, z.B:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var suchcode,eingabe:string[4];
suchcode:='6733'; eingabe:='7623'; fullcorrect:=0; wrongposition:=0; wrong:=0; for stelle:=1 to 4 do if suchcode[stelle]=eingabe[stelle] then inc(fullcorrect) else if pos(eingabe[stelle],suchcode)>0 then inc(wrongposition) else inc(wrong); |
So ähnlich würde ich es machen. Habe es nicht überprüft. Wichtig ist, dass nach Ablaufen der Schleife die Endergebnisse in den Zählern stehen. Vielleicht hilft Dir das weiter.
_________________ Es gibt keine Probleme - nur Lösungen!
|
|
DaiweL 
      
Beiträge: 27
|
Verfasst: Di 23.01.07 14:29
Also ich möchte ein Programm entwickeln welches es ermöglicht mittels eingabe von Tips, und der Antwort von dem anderen Programm es ermöglicht alle noch möglichen Kombinationen des Codes anzeigt.
habe ein bsp. Programm angehängt wie es ausehen sollte
Einloggen, um Attachments anzusehen!
|
|
DaiweL 
      
Beiträge: 27
|
Verfasst: Di 23.01.07 14:42
Bsp:
Angenommen er zu eratene Code währe: 1234
die Tips:
5624 1-2-2
3712 0-3-1
5123 0-3-1
1328 1-3-1
Wie kann man nun aus diesen Tips die noch verbleibenden Möglichkeiten errechnen?
|
|
chrisw
      
Beiträge: 439
Erhaltene Danke: 3
W2K
D7
|
Verfasst: Di 23.01.07 15:22
Ich könnte mir so etwas vorstellen !
(Wobei in Edit2 die zu ratende Zahl steht und in Edit1 der Tip eingegeben wird)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| var i,j : Integer; RichtigeZahlen : Integer; RichtigeZahlanFalscherStelle : Integer; FalscheZahlen : Integer; ZahlFalsch : Boolean; begin RichtigeZahlen := 0; RichtigeZahlanfalscherStelle := 0; FalscheZahlen := 0; for i := 1 to 4 do begin ZahlFalsch := True; if StrToInt(Edit1.Text[i]) = StrToInt(Edit2.Text[i]) then begin inc(RichtigeZahlen); ZahlFalsch := False; end; for j := 1 to 4 do if StrToInt(Edit1.Text[i]) = StrToInt(Edit2.Text[j]) then begin inc(RichtigeZahlAnfalscherStelle); ZahlFalsch := False; end; if ZahlFalsch then inc(FalscheZahlen); end; Showmessage(IntToStr(RichtigeZahlen) + '-' + IntToStr(RichtigeZahlAnfalscherStelle) + '-' + IntToStr(FalscheZahlen)); end; |
Dies ist die ausführliche Version, lässt sich sicherlich leicht optimieren !
_________________ Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
|
|
DaiweL 
      
Beiträge: 27
|
Verfasst: Di 23.01.07 15:49
Ich glaube du hast was missverstanden. Mein Ziel ist nicht den TipCode(zB. 1-2-2) zu erstellen, sondern eine Liste der noch möglichen Codes. Eigentlich muss man nur ein Weg finden mittels der TipCodes Zahlen auschliessen zu können(0000..9999).
|
|
DnC
      
Beiträge: 98
XP
Delphi 3,6,7,2005 PE
|
Verfasst: Di 23.01.07 16:39
mach ne Liste und lösch die, die du schon hattest...
|
|
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Di 23.01.07 16:49
mal ne verständnisfrage: geht dein programm die codes durch oder lässt du den benutzer codes eingeben?
im ersten fall wäre es wohl möglich, da dein programm mit sicherheit mit irgendeiner logik an die ganze sache herangeht.
das kann man von dem benutzer aber nicht unbedingt sagen. woher willst du also wissen, wie viel schwachsinn der liebe nutzer noch vorhat, einzugeben?!
_________________ Anonymes Eckenkind
|
|
DaiweL 
      
Beiträge: 27
|
Verfasst: Di 23.01.07 16:54
Also in meinem Programm kann der Nutzer Tips eingeben, also Codes mit der Antwort eines Zweit Programms(wieviele Zahlen richtig usw.). Dann aus den Tips und Antworten möchte ich den Code eingrenzen.
dh. zB. der Code wäre 1234
Tips:
5123 031
5624 112
aus diesen zwei Tips kann man rausfinden dass an der ersten Stelle die 5 sicher nicht enthalten ist, und an der 3ten Stelle die 2 auch sicher nicht vorhanden ist.
So kann ich dann die liste von 0000..9999 eingrenzen
|
|
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Di 23.01.07 17:00
Dann mach es auf DnCs Art.
Mach eine Liste mit allen möglichen Kombinationen und wenn du rausgefunden hast, dass die 5 nicht an erster Stelle sein kann, löschst du schon mal alle Kombinationen, die eine 5 vorne haben, raus...
_________________ Anonymes Eckenkind
|
|
DnC
      
Beiträge: 98
XP
Delphi 3,6,7,2005 PE
|
Verfasst: Di 23.01.07 17:03
so rein aus Interesse, weil ich mal ein Spiel kannte, bei dem man sowas in der Art mit farbigen Stiften gespielt hat... wofür stehen die 3 Zahlen?
Btw. Warum willst du die Zahlen ausschließen? Der User soll doch die Zahl (Bsp. 1234) erraten und nicht dein Programm, oder?
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Do 25.01.07 08:58
Du musst doch nur alle 4-Stelligen Kombinationen gegen die bisherigen Eingaben prüfen. Bei Übereinstimmung des Codes ist die Kombination noch ein Kandidat, wenn nicht, fliegt er raus.
Am Anfang enthält das Array (eine Stringlist) alle Kombinationen. Nach jedem Durchgang (User rät, Programm zeigt den Code an) schmeisst Du die Kandidaten raus, die beim Vergleich mit der Benutzereingabe einen anderen Code ergeben.
Übrigens, das Spiel kam als Mastermind raus und ist -glaube ich- von Martin Gardner, einem Kolumnisten des 'Scientific American', einer sehr populären US-Wissenschaftszeitschrift. Ich kenne das Spiel seit fast 35 Jahren.
_________________ Na denn, dann. Bis dann, denn.
|
|