Pi-Puzzle-Challenge

Am 30. Sep­tem­ber fiel mir das Pi-Puzzle von get­Di­gi­tal beim Umräu­men wie­der in die Hän­de. Das schenk­ten mir mei­ne Freun­de zum 40. Geburts­tag. Es kann auch spä­ter gewe­sen sein. Jeden­falls war es nicht das ers­te Mal, dass ich es in der Hand hielt, um es dann doch nach ein­ge­hen­der Betrach­tung ehr­furchts­voll wie­der zurück ins Regal zu legen. Immer­hin sind es 1008 Tei­le, jedes davon ist mit etwa 70 Zif­fern der Zahl Pi bedruckt. Die Far­ben sind fast ein­heit­lich, homo­gen. Die Zif­fern von Pi bil­den dar­auf einen hell­grü­nen, eben­falls rela­tiv mono­to­nen Tep­pich. Damals dach­te ich im ers­ten Moment, sie mögen mich nicht mehr. Doch sie glaub­ten natür­lich an mich, dass ich dem gewach­sen bin, als ich es noch nicht glaub­te. Dies­mal leg­te ich es nicht zurück ins Regal, son­dern auf mei­nen Bas­tel­tisch. Dort wird bekann­lich gebas­telt, was auf den Tisch kommt.

Hier noch­mal: Dan­ke für das tol­le Geschenk!

Ich star­te­te mit der Chall­enge ganz klas­sisch. Die Kis­te und die Tüte mit den Tei­len öff­nen und die Tei­le vor­sich­tig in der Kis­te ver­ein­zeln. Ein paar Tei­le hin­gen wohl noch seit der Stan­zung zusam­men und bil­de­ten grö­ße­re Ver­bän­de (Clus­ter). Das ist schon­mal ein guter Anfang und leg­te die sepa­rat. Dann — wie bei jedem ande­ren Puz­zle auch — such­te ich alle Kan­ten­tei­le her­aus, denn der Rand ist Stüt­ze und Ori­en­tie­rung für den Rest. Doch anders als bei Bil­der­puz­zles sehen hier die Kan­ten­tei­le auch alle mehr oder weni­ger gleich aus — sie unter­schei­den sich nur durch die auf­ge­druck­ten Ziffern. 

Bis ich den Schlüs­sel des Gan­zen in der Hand hielt:

Die­ses Puz­zle­teil ent­hält zwei wich­ti­ge Infor­ma­tio­nen: Die letz­ten Zif­fern des Pi-Puzzles und eine Mög­lich­keit, die Zei­len­län­ge zu ermitteln.

Für ein ver­gan­ge­nes Pro­jekt hat­te ich von pi-zahl.de die ers­te Mil­li­on Stel­len von Pi her­un­ter­ge­la­den und alle Zei­len­um­brü­che ent­fernt, weil ich das so brauch­te. Das ist also mei­ne Daten­ba­sis: pi_oneline.txt

Die kopier­te ich in eine neue Datei und such­te eben­falls im Text­edi­tor nach den letz­ten Zif­fern »8689294«. Die Zif­fern danach lösch­te ich raus. Der Cur­sor stand an Posi­ti­on 74.901, somit sind genau 74.900 Zif­fern auf dem Puz­zle: Eine 3, ein Kom­ma und 74898 Nachkommastellen.

Auf die glei­che Wei­se fand ich das Ende der vor­letz­ten Zei­le »3044446« vor der Posi­ti­on 74551 und das der vor­letz­te Zei­le »25589708« vor der Posi­ti­on 74201.

Die letz­te Zei­le ist also 74901 — 74551 = 350 Zif­fern lang. Die vor­letz­te Zei­le ist mit 74551 — 74201 auch 350 Zif­fern lang! Gilt das viel­leicht für alle ande­ren Zei­len auch? Ich for­ma­tier­te alle Zei­len auf 350 Zei­chen Län­ge und erhielt ein per­fek­tes Recht­eck (74900 : 350 ist genau 216). 

In die­sem Ziffern-Rechteck such­te ich nach den Zei­len­an­fän­gen und ‑enden, die auf den lin­ken und rech­ten Kan­ten­tei­len zu fin­den sind und setz­te den Rand Stück für Stück zusam­men. Zusätz­li­che Zei­len­um­brü­che nach der 5. und nach jeder 6. Zei­le im Text­edi­tor gaben dabei zusätz­li­che Ori­en­tie­rung. Auch bei den bei­den waa­ge­rech­ten Kan­ten half der Text­edi­tor sehr.

Doch für das Inne­re kom­me ich mit dem Text­edi­tor nicht wei­ter. Der gro­ße Zah­len­block müss­te wie ein recht­ecki­ges »Kuchen­blech« in 36 Zei­len und 28 Spal­ten auf­ge­teilt wer­den. Das ist mit dem Text­edi­tor sehr müßig. Der nächs­te logi­sche Schritt war dann Programmieren.

Für sowas ist für mich PHP die Spra­che der Wahl. Zuerst sind die Zei­len dran. Die Funk­ti­on chunk_split() war da mein ers­ter Gedan­ke. Sie teilt einen String (Zei­chen­fol­ge) in gleich lan­ge Stü­cke auf. Zum Bei­spiel »dasist­ein­lan­ger­text« wird bei Län­ge 4 zum Array [»dasi«, »stei«, »nlan«, »gert«, »ext« ]. Ich muss aber 350 Zei­chen in 28 Tei­le (Anzahl der Puz­zle­tei­le neben­ein­an­der) tei­len. 350 : 28 ergibt 12,5 Zei­chen pro Teil. Also abwech­selnd 12 und 13. Dazu kommt noch, dass die Rand­tei­le grund­sätz­lich weni­ger Zif­fern und Zei­len ent­hal­ten. Ich ent­wi­ckel­te einen Algo­rith­mus, wel­cher mit Fließ­kom­ma­zah­len durch den String wan­dert und das alles berück­sich­tigt. Eine wei­te­re Schlei­fe, auch mit Fließkomma-Offset und ‑Schritt­wei­te fasst die auf­ge­teil­ten Zei­len in Blö­cke zusammen. 

Die ers­te Ver­si­on sah nach der gelun­ge­nen Auf­tei­lung des recht­ecki­gen Zah­len­blocks in Puzzle-»Schäfchen« so aus:

Das führ­te dazu, dass ich an dem Abend alle gefun­de­nen Clus­ter an ihre Posi­ti­on set­zen konn­te und danach ein­zel­ne wei­te­re Puz­zle­tei­le. Bei jedem habe ich 5–6 Zif­fern aus der Mit­te ein­ge­ge­ben und der Brow­ser hat da hin gescrollt, wo er fün­dig wur­de. Eine Ska­la rund um das Puz­zle half mir bei der Orientierung.

Mit dem Sys­tem war es aller­dings nur mög­lich, eine Zif­fern­fol­ge zu suchen. Da ich die Zif­fern des Puz­zles schon in einem zwei­di­men­sio­na­len Array aus klei­ne­ren Blö­cken auf­ge­teilt hat­te, war der Weg frei, inner­halb die­ser auf­ge­teil­ten Struk­tur zu suchen und für jede Fund­stel­le die ent­spre­chen­den Blö­cke gleich mit Posi­ti­on im Puz­zle (Zei­le | Spal­te) anzu­zei­gen. Das habe ich am drit­ten Tag (2.10.) genau so umge­setzt und beim wei­te­ren Fül­len des Puz­zles optimiert.

Hier kann man nun die Zif­fern meh­re­rer Puz­zle­tei­le mit Kom­ma getrennt ein­ge­ben und erhält für jedes Puz­zle­teil die Zei­le | Spal­te, wo es hin soll. Das mach­te echt Spaß, denn mit den gefun­de­nen Wer­ten für die Auf­tei­lung stimm­ten die Posi­tio­nen immer.

Eine funk­tio­nie­ren­de Live-Version gibt es unter https://projekte.svenspages.de/pi-puzzle-helper/ und den Quell­text habe ich hier auf Git­hub ver­öf­fent­licht. Lei­der kann man das Puz­zle nicht mehr kau­fen. Viel­leicht wird das Puz­zle ja wie­der auf­ge­legt, da es ja jetzt eine Such­ma­schi­ne dafür gibt? 🙂

Die letz­ten Puz­zle­tei­le habe ich dann am 4. Tag wie­der auf die klas­si­sche Puzzle-Art ein­ge­setzt. Also nach den »Nasen« schau­en, nach der Far­be, nach den Kan­ten. Und am 5. Tag früh um drei war ich fertig.

Ich bin mir nicht sicher, ob es jemand auf die klas­si­sche Wei­se gelöst hat, ob man es so lösen muss. Es ist kein Bil­der­puz­zle, son­dern ein recht­ecki­ger Block aus 74900 Dezi­mal­stel­len. Ich ken­ne auch nach dem Puz­zle Pi nur auf 15 Nach­kom­ma­stel­len genau. Das reicht aber aus, um die meis­ten Taschen­rech­ner damit voll­zu­schrei­ben — oder hier die Gren­ze zwi­schen dem ers­ten und dem rechts dane­ben zu queren.

Es hat sehr viel Spaß gemacht — sowohl das puz­zeln als auch das pro­gram­mie­ren. Wann schreibt bzw. braucht man schon mal eine Such­ma­schi­ne für ein Puzzle?

74.900 Dezi­mal­stel­len von Pi auf ein­mal zu sehen ist schon beein­dru­ckend. Der Rekord liegt aktu­ell bei  202,112,290,000,000 Nach­kom­ma­stel­len (Stand: 28.06.2024). 202 Bil­lio­nen. Das ist 2.698.428.438 mal mehr. An kur­zer Kan­te anein­an­der gereiht wäre das dann ein 50 cm brei­ter und 1.888.900 km lan­ger Strei­fen. Das ist mehr als zwei­mal zum Mond und zurück.

Oder als Qua­drat mit 30,732 km Kan­ten­län­ge (43.903 Zei­len * 61.494 Puz­zles + 1 Zei­le * 25.554 Puz­zles) aus­ge­legt wür­de über mei­ner Hei­mat­stadt aus­ge­legt so aussehen:

Es wäre schön, wenn man nicht nur die ers­ten 2,1 Mil­li­ar­den (was ziem­lich genau ein tau­sens­tel Pro­zent des aktu­el­len Rekords ist, aber man kann sich wenigs­tens Post­kar­ten aus dem Ergeb­nis machen), son­dern all die­se bis­her errech­ne­ten Dezi­mal­stel­len online nach Zif­fern­fol­gen durch­su­chen könn­te. Viel­leicht gibt es da doch noch inter­es­san­te Gesetz­mä­ßig­kei­ten aufzudecken…