Puzzle #67

Aufgabe:

Unter einem  Kryptogramm verstehen wir ein mathematisches Rätsel. Es ist eine mathematische Gleichung oder ein Gleichungssystem unbekannter Zahlen, deren Ziffern durch Buchstaben ersetzt wurden. Solche Kryptogramme können mehrere Lösungen haben. Um alle zu finden ist wohl ein Computereinsatz notwendig.

Code:

zahl1:[l,i,a,r]$
zahl2:[l,y,r,e]$
zahl3:[l,i,e,r]$
zahl4:[p,a,n,t,s]$
f4:[10^3,10^2,10^1,10^0]$
f5:[10^4,10^3,10^2,10^1,10^0]$
buchstaben:setify(flatten([zahl1,zahl2,zahl3,zahl4]));
gleichung:zahl1.f4+zahl2.f4+zahl3.f4=zahl4.f5;
ziffern:{0,1,2,3,4,5,6,7,8,9}$
gleichung:100*y+12*r+3000*l+200*i+11*e+10*a=10*t+s+10000*p+100*n+1000*a$
zaehler:0;
print(" # [a,e,i,l,n,p,r,s,t,y]")$
for a in ziffern do
for e in setdifference(ziffern,{a}) do
for i in setdifference(ziffern,{a,e}) do
for l in setdifference(ziffern,{0,a,e,i}) do
for n in setdifference(ziffern,{a,e,i,l}) do
for p in setdifference(ziffern,{0,a,e,i,l,n}) do
for r in setdifference(ziffern,{a,e,i,l,n,p}) do
for s in setdifference(ziffern,{a,e,i,l,n,p,r}) do
for t in setdifference(ziffern,{a,e,i,l,n,p,r,s}) do
for y in setdifference(ziffern,{a,e,i,l,n,p,r,s,t}) do
if ev(gleichung) then block(
ev(zaehler:zaehler+1),
print(zaehler,[a,e,i,l,n,p,r,s,t,y]));

Verschachtelte Schleifen können hohe Rechenzeiten verurachen. Man muss schon bei der Programmerstellung an die Optimierung der Rechenzeit denken. Das passiert hier mit der Verwendung von Differenzmengen.

 

Verschiedene Ausführungen:

wxMaxima:

Einfach den Code mit COPY&PASTE übernehmen und dann ausführen.
Anmerkung: In Windows dauert es länger als in Ubuntu oder Knoppix..

Vroomlab:

Man muss die Zeilenumbrüche mit „\“ markieren und „print“ durch „disp“ ersetzen. Dann läuft es sehr schnell.

p67-vroom

Python:

p77_1_2p77_2_2