Zahlenrätsel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jans1612
User
Beiträge: 5
Registriert: Dienstag 15. November 2016, 16:07

Die Aufgabe die ich bekommen habe ist ein Zahlenräsel indem man 6 Gleichungen hat und 10 unbekannte Ziffern.
Ich möchte ein Programm schreiben was mir dafür die 6 Gleichungen mit Lösung ausgibt.
Das Problem ist, dass das Programm startet aber kein Ergebniss ausgibt.

Code: Alles auswählen

from random import randint

#Random Zahlen werden generiert und Variablen werden festgeleget

a = randint(0, 9)
b = randint(0, 9)
c = randint(0, 9)
d = randint(0, 9)
e = randint(0, 9)
f = randint(0, 9)
g = randint(0, 9)
h = randint(0, 9)
i = randint(0, 9)
j = randint(0, 9)

#While Schleife mit den 6 Gleichungen  die gelöst werden sollen

while((a*1000+b*100+c*10+d)/(g*10+i)         !=(g*100+h*10+d)       and
(f*1000+e*100+j*10+g)-(f*1000+e*100+b*10+h)  !=(i*10+g)             and
(j*1000+e*100+d*10+b)-(f*1000+e*100+d*10+i)  !=(e*1000+h*100+h*10+c)and
(a*1000+b*100+c*10+d)-(f*1000+e*100+j*10+g)  !=(j*1000+e*100+d*10+g)and
(g*10+i)+(f*1000+e*100+b*10+h)               !=(f*1000+e*100+d*10+i)and
(g*100+h*10+d)*(i*100+g*10)                  !=(c*1000+h*100+h*10+c)):
    
#while schleife in der Gleiche Zahlen ausgeschlossen werden, sodass jede variable nur eine Zahl erhält
#solange dies nicht wahr ist werden weiterhin Zahlen generiert
    
    while(a == b or a == c or a == d or a == e or a == f or a == g or a == h or a == i or a == j or
    b == a or b == c or b == d or b == e or b == f or b == g or b == h or b == i or b == j or
    c == b or c == a or c == d or c == e or c == f or c == g or c == h or c == i or c == j or
    d == b or d == c or d == a or d == e or d == f or d == g or d == h or d == i or d == j or
    e == b or e == c or e == d or e == a or e == f or e == g or e == h or e == i or e == j or
    f == b or f == c or f == d or f == e or f == a or f == g or f == h or f == i or f == j or
    g == b or g == c or g == d or g == e or g == f or g == a or g == h or g == i or g == j or
    h == b or h == c or h == d or h == e or h == f or h == g or h == a or h == i or h == j or
    i == b or i == c or i == d or i == e or i == f or i == g or i == h or i == a or i == j or
    j == b or j == c or j == d or j == e or j == f or j == g or j == h or j == i or j == a):
        
        a = randint(0, 9)
        b = randint(0, 9)
        c = randint(0, 9)
        d = randint(0, 9)
        e = randint(0, 9)
        f = randint(0, 9)
        g = randint(0, 9)
        h = randint(0, 9)
        i = randint(0, 9)
        j = randint(0, 9)


    

print("a= ",a)
print("b= ",b)
print("c= ",c)
print("d= ",d)
print("e= ",e)
print("f= ",f)
print("g= ",g)
print("h= ",h)
print("i= ",i)
print("j= ",j)
Zuletzt geändert von Anonymous am Donnerstag 24. November 2016, 14:56, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Jans1612: Vielleicht brauchst Du einfach nur mehr Geduld. ;-) Mal angenommen es gibt nur eine richtige Lösung, dann steht die Chance 1 zu 10.000.000.000 das die bei einem (äusseren) Schleifendurchlauf zufällig ausgewürfelt wurde.

Solche Aufgaben mit einem Suchraum von 10 Milliarden Möglichkeiten geht man eher systematisch durch und versucht nicht zufällig die Lösung zu erraten. Da gibt es auch Bibliotheken die einem einiges abnehmen. Stichwort ist „constraint solving“.
thorius
User
Beiträge: 7
Registriert: Mittwoch 4. März 2015, 08:04

Hallo Jans,

dein Code will erstmal eine mögliche Kombination für die Variablen a-j auswürfeln bei der jede Zahl nur einmal vorkommen kann. Dein Ansatz ist etwas unglücklich gewählt. Du weißt ja schon, das du 10 Variablen hast, in denen sich 10 unterschiedliche Werte gemerkt werden sollen.

Du könntest also eine Liste mit den 10 unterschiedlichen Werten erstellen und diese dann auf die Variablen verteilen. Stichwort random.sample

--
Thomas
BlackJack

@thorius: Bei 10 Werten aus 10 möglichen Werten ist eher `random.shuffle()` als `sample()` passend.

@Jans1612: Bist Du sicher, dass die Gleichungen stimmen? Ich finde da nämlich keine Lösung. Nicht einmal wenn ich ”alle Verschieden” weg lasse! Und wenn ich zusätzlich noch die mit der Division weg lasse (weil das die einzige ist, die ich leicht erweitert habe, um die Bedingung das (g*10)+i nicht 0 sein darf, damit kein `ZeroDivisionError` auftreten kann), dann erhalte ich auch nur *eine* Lösung, nämlich die wo *alle* Variablen auf *Null* gesetzt sind.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

thorius hat geschrieben:Du könntest also eine Liste mit den 10 unterschiedlichen Werten erstellen und diese dann auf die Variablen verteilen. Stichwort random.sample
Auweia. Warum denn zufallsbasiert? Ich würde ja mit itertools.permutations arbeiten.

Code: Alles auswählen

import itertools

possible_numbers = list(range(10))
for current_numbers in itertools.permutations(possible_numbers):
    a, b, c, d, e, f, g, h, i, j = current_numbers
       
    # hier jetzt Bedingungen abfragen
Ich bekomme übrigens kein passendes Ergebnis heraus. Nach der ersten Bedingung bleiben schon nur noch 18 Ergebnisse übrig und die nächste passt dann mit diesen gefundenen Kombinationen schon nicht mehr.
Jans1612
User
Beiträge: 5
Registriert: Dienstag 15. November 2016, 16:07

Erstmal Danke für die Ganzen Antworten

@BlackJack die Lösung wär a = 9, b =5, c = 4, d = 8, e = 7, f = 2, g = 3, h = 0, i = 1, j = 6
Mit ein wenig Gehirnschmalz kommt man auf das Ergebnis.
BlackJack

@Jans1612: Ziemlich sicher nicht. Denn wenn weder /me noch ich mit Programmen auf die Lösung kommen die *alle Möglichkeiten durchprobieren* dann gibt es entweder keine Lösung oder Deine Gleichungen stimmen nicht.

Edit: Die Gleichungen von Dir, nur != durch == ersetzt, ansonsten kopiert:

Code: Alles auswählen

In [21]: a = 9; b =5; c = 4; d = 8; e = 7; f = 2; g = 3; h = 0; i = 1; j = 6

In [22]: (a*1000+b*100+c*10+d)/(g*10+i)==(g*100+h*10+d)
Out[22]: True

In [23]: (f*1000+e*100+j*10+g)-(f*1000+e*100+b*10+h)==(i*10+g)
Out[23]: True

In [24]: (j*1000+e*100+d*10+b)-(f*1000+e*100+d*10+i)==(e*1000+h*100+h*10+c)
Out[24]: False

In [25]: (a*1000+b*100+c*10+d)-(f*1000+e*100+j*10+g)==(j*1000+e*100+d*10+g)
Out[25]: False

In [26]: (g*10+i)+(f*1000+e*100+b*10+h)==(f*1000+e*100+d*10+i)
Out[26]: True

In [27]: (g*100+h*10+d)*(i*100+g*10)==(c*1000+h*100+h*10+c)
Out[27]: False
thorius
User
Beiträge: 7
Registriert: Mittwoch 4. März 2015, 08:04

/me hat geschrieben:
thorius hat geschrieben:Du könntest also eine Liste mit den 10 unterschiedlichen Werten erstellen und diese dann auf die Variablen verteilen. Stichwort random.sample
Auweia. Warum denn zufallsbasiert? Ich würde ja mit itertools.permutations arbeiten.
Das kommt davon, wenn man nur "hopp hopp" darüber nachdenkt. Sry.
Jans1612
User
Beiträge: 5
Registriert: Dienstag 15. November 2016, 16:07

Ich sitze hier jetzt schon mehrere stunden dran kann vielleicht jemand einen Denkanstoß liefern der simpel für Anfänger gestaltet ist? :K :roll: :?:
BlackJack

@Jans1612: Es gab doch schon zwei Vorschläge: Externe Bibliothek für „constraint solver“ suchen oder mit `itertools.permutations()` gezielt alle Permutationen aufzählen und dann mit den *richtigen* Formeln testen. Die in Deinem Code weiter oben sind wie gesagt unlösbar. Das Deine angegebene Lösung nicht funktioniert, habe ich ja an Deinen Tests gezeigt, also zu diesen Tests ist es ganz normal wenn Du dafür keine Lösung findest, weil die Lösung dafür heisst: es gibt keine. :-)
Antworten