Autor Beitrag
DaiweL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 27



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var  
  suchcode,eingabe:string[4];

suchcode:='6733'//gesuchter Code
eingabe:='7623';  //der Code, der überprüft werden soll
fullcorrect:=0;   //Zählt die ganz richtigen Ziffern
wrongposition:=0//Zählt Ziffern, die vorhanden aber an falscher Stelle
wrong:=0;         //Zählt ganz faslche Ziffern
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 27



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 27



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: 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)


ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 27



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 98

XP
Delphi 3,6,7,2005 PE
BeitragVerfasst: Di 23.01.07 16:39 
mach ne Liste und lösch die, die du schon hattest...
Miri
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 27



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 657


Delphi 3 Prof., Delphi 2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 98

XP
Delphi 3,6,7,2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.