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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101:
| procedure TKZRL.LoesenClick(Sender: TObject); const Alfa='ABCDEFGHIJ';Leer=' '; var Nr,Anzahl,Tausch,K,L:Integer; Fertig,Fehler:Boolean; Index,I:Char; Zahl:String; begin K:=0; for Index:='A' to 'J' do begin Perm[Index]:=K;inc(K) end; for K:=1 to 9 do begin Zahl:=''; for L:=(K-1)*4+1 to 4*K do Zahl:=Zahl+char(ZiffernListe[L]+65); Zahlen[K]:=Zahl; end; ZahlenTest(Fehler,Nr); if not Fehler then begin MessageDlg('die '+IntToStr(Nr)+'-te Zahl enthält einen Fehler!',mtError,[mbOk],0); exit; end; Screen.Cursor:=crHourGlass; Anzahl:=1;Index:='J';Fertig:=False;LAnzeige.Clear; Rechnung(Fertig); while (Index>'A') and not Fertig do begin Tausch:=Perm['A']; for I:='B' to Index do Perm[Pred(I)]:=Perm[I]; Perm[Index]:=Tausch; if Tausch=pos(Index,Alfa)-1 then dec(Index) else begin Index:='J';inc(Anzahl);Rechnung(Fertig);end end; Screen.Cursor:=crDefault; LAnzeige.Items.Add(IntToStr(Anzahl)+' Permutationen wurden berechnet!'); LAnzeige.Items.Add(''); if not Fertig then LAnzeige.Items.Add('PC hat leider keine Lösung gefunden') else begin LAnzeige.Items.Add(Leer+'das Symbolrätsel'); LAnzeige.Items.Add(''); for K:=1 to 9 do for L:=1 to 4 do if Zahlen[K,L]='@' then Zahlen[K,L]:=' '; LoesungsAusgabe; LAnzeige.Items.Add(Leer+' die Lösung'); LAnzeige.Items.Add(''); for K:=1 to 9 do for L:=1 to 4 do if Zahlen[K,L]<>' ' then Zahlen[K,L]:=IntToStr(Perm[Zahlen[K,L]])[1]; LoesungsAusgabe; end end;
procedure TKZRL.Rechnung(var Fertig:Boolean); var MusterZahl:Array[1..9]of Integer; K:Integer; begin for K:=1 to 3 do MusterZahl[K]:=Wert(Zahlen[K]); Test(MusterZahl[1],MusterZahl[2],MusterZahl[3],OPZustand[1],Fertig); if not Fertig then exit; for K:=4 to 6 do MusterZahl[K]:=Wert(Zahlen[K]); Test(MusterZahl[4],MusterZahl[5],MusterZahl[6],OPZustand[5],Fertig); if not Fertig then exit; for K:=7 to 9 do MusterZahl[K]:=Wert(Zahlen[K]); Test(MusterZahl[7],MusterZahl[8],MusterZahl[9],OPZustand[6],Fertig); if not Fertig then exit; for K:=1 to 3 do begin Test(MusterZahl[K],MusterZahl[K+3],MusterZahl[K+6],OPZustand[K+1],Fertig); if not Fertig then exit; end; Fertig:=True; end;
function TKZRL.Wert(Zahl:String):Integer; var K,Faktor,Summe:Integer; begin Summe:=0;Faktor:=1; for K:=4 downto 1 do if Zahl[K]<>'@' then begin Summe:=Summe+Perm[Zahl[K]]*Faktor; Faktor:=10*Faktor; end; Wert:=Summe; end;
procedure TKZRL.Test(L,M,R,Rechenart:Integer;var Erfolg:Boolean); begin Erfolg:=False; case Rechenart of 1: if L+M=R then Erfolg:=True; 2: if M+R=L then Erfolg:=True; 3: if L*M=R then Erfolg:=True; 4: if M*R=L then Erfolg:=True; end end; |