– AoC2017 – 

aoc2017

Meine Cartoontätigkeit leidet z.Zt. unter dem AoC2017, dem Advent of Code, einem undotierten Programmierwettbewerb, bei dem jeden Tag eine Aufgabe veröffentlicht wird, bzw. zwei Aufgaben, die zweite ist dabei meist nur eine leichte Variation oder Verschärfung von Aufgabe 1, kann aber auch leichter als diese sein, und setzt nur deren Lösung voraus, was aber auch organisatorisch verpflichtend ist, weil man den zweiten Teil erst präsentiert bekommt, wenn man den ersten gelöst hat. 

Das ganze ist sehr sorgfältig und aufwendig gemacht. Man muss sich anmelden und jeder bekommt zwar das gleiche Rätsel, aber unterschiedliche Eingabedaten, so dass man nicht die Lösung eines anderen posten kann.

Jede Aufgabe kommt im Gewand einer realitätsfernen Story daher, in der Computer- und Programmelemente vorkommen, aber hilfreich für das Verständnis, was genau die Aufgabe ist, ist es nicht. Es ist aber auch so phantastisch, dass es dabei auch nicht stört.

Allerdings habe ich mit der Aufgabenstellung schon mehrfach Verständnisschwierigkeiten gehabt. Das könnte besser sein.

Dann gibt es Übersichtsseiten, wer in den Top 100 ist (bei ca. 35.000 Teilnehmern derzeit), man kann leicht sehen, was man selbst schon gelöst hat, der wievielte man für welche Aufgabe war. Das ist wiederum sehr schön.

Die meisten Aufgaben kommen auch mit einem Beispiel, Beispieldaten und der erwarteten Lösung für diese daher, so dass man sich Testfunktionen schreiben kann, was nun seit einigen Jahren immer populärer geworden ist. Solange das selbstgeschriebene Programm für die Beispielfrage nicht die Beispiellösung ausspuckt braucht man die Berechnung der oft strukturell identischen, aber viel größeren Aufgabe, nicht zu beginnen, geschweige denn seine falsche Lösung einreichen.

Was auch nicht so erquicklich ist: Die Aufgaben werden früh um 6:00 Uhr veröffentlicht, was in New York bekanntlich gegen Mitternacht ist, in San Francisco dagegen 18:00 +/- Winterzeit/Sommerzeitstündchen. Um in die Top-100 des Tages zu kommen braucht man um 6:30 Uhr gar nicht mehr zu hoffen.

Oft verhake ich mich aber beim Lösungsweg irgendwo und brauche länger. Besonders erquicklich ist, wenn man das Beispielproblem löst, aber die Lösung bei den ernsten Daten falsch ist.

Das Bild ist keine Illustration eines bestimmten Rätsels, sondern das Kopfschwirren der Zahlen. Wer nicht mit Scala vertraut ist wird auch selten wissen, dass diese Sprache eine Wendeltreppe als Symbolbild verwendet. Dieses Bild hatte ich mir allerdings einst auf einen Kalender geklebt, als ich von Scala noch nichts wusste, und beim Frühjahrsputz, den ich jetzt doch noch in Angriff genommen habe, ist es mir vor 2 Tagen wieder in die Hände gefallen – Frühjahrsputz ist mehr als Aufräumen als als Putzen zu verstehen.

Beim Arbeiten mit Scala bin ich oft damit beschäftigt, die Daten von einem Format in ein anderes zu konvertieren. Teils wegen der Aufgabenstellung, bei der aus einer Texteingabe Dezimalzahlen zu extrahieren sind, die dann zu massieren sind, dann in Hexadezimalformat verwandelt werden müssen, um schließlich als binäre 0-1er-Ketten in einer Matrix zu landen, wo man Inseln zusammenhängender Einsen zählen soll, hier ein 55×30 Ausschnitt der 128×128 Matrix:

.2.777.777777...QQ.QQ..I..FF.<.[..E.I.:.....]]...]]].]. ...777777.77.;;..QQQ.Q.I..FFF.F.>.EE..::...]]]].]]]]...
W.77777.7.777...QQQQQQ.FFFFF.F..EE...:.....]]..]]]]]..
.M...7....777.E.R..QQQ..F.FFFFF.#.E..:::.>>.]]...]].]..
.M.777...777.EEE.
....F.F...F..U.EEEE.....>.]]]..].]]..
.M..7.]..7...E..@...FFFFF.FFF.^..E.E.;..]].]].]]..]].].
.MM..#.....A.E.@@.F.F......FFF.EEEEEE..]]].....]].]]]]]
.M...##..#.AA...@.FFFF.//..FF.........?.]]].].].]...]..

.#########.A..Z.FF.F.//......]...T.#.]..]]]]].]]]]]..
.###.##..#.F..L.FFFFFF.......I.]...T...]]]].]...]]]].]]
##.#.#..U.
.^.....FFF...N......]].]...]]]]]]].44...]..]
#........__..@@@...FFF...I......]]]]..]]....]...C.]].5.
#.//.??....@@.@.=.@.......Z.ZZ....]]]]]]].]..X..CC.....
.S..??.KKK...@@...@.>>>>.ZZ.ZZ..]]]]]]..]]].].].CCC.33.
F.==..S.K....@..@@@@..>.ZZ.ZZ.RR...].]]...]]]]]........
..=.SSS......@@@@@.@.4.6.ZZZ.RR...].].]...].]...[[[.[[[
^^..SS............@@@.;.^....RRR..]]]]].]].]]].R.[[[[[.
.^^.S........5555.@....5..A..RR...].]]]]].[...#.[[[...[
M...SS......55.555...S..2.A.....]]]]]]]..[[.[.....[[...
.SSSS.S.S..55.555555.SSS.AAA..##.].....[[[..[.[[[[[[..K
.S.SS.SSS...55555.55.SSS..AAA..#.].....[.[[[[[[....[[[.
.SS...SSS.555...5..5.SS...AAA....]......[[.[.[..CC...[[
..SSS.SS.E...5555.55.SSS.AA.AAA......NNN..[[[[[.C..UU..
CC.SSSSSS.5...55.6..5.S.6....A.[..]....N.[[[..[....U.DD
CC.S.SS.S..55555.6..5...66666..[.[..NNNN.[...4..XX.....
C...SSSS.5555.55.6.555....666..[[[[.N....[....[..XX.XX.
...SS...55....55.6...5.555...22.[.[[...[[[..[.[.XX.XXX.
8._..[[.555.5..5..WW.55.55555...[[[[[[[[[[.[[[[[.XX.XXX
8..[[[...55555..5....555555...[[[[.[[.[..[.[.[....XXX.X
.\...\....55..5.5.55..5.5555..[[..[[[[.[.[.[.XX.X..X.

Die zweite Form der Transformation, mit der man oft zu kämpfen hat, betrifft die Datentypen bei Scala. Das jüngste Rätsel behandelt eine Reihe von irgendwas, Personen im Beispiel, die mit Buchstaben bezeichnet sind, a-e (wenn es Ernst wird dann a-p).
Manche Operationen sind elegant mit dem Datentyp Liste zu lösen. Hier soll man die Leute in der Reihe verschieben, wobei die, die hinten rausfallen, vorne wieder reinkommen.
Beispiel:

val reihe1 = Liste ('a', 'b', 'c', 'd')
// Verschieben um 3:
val reihe2 = reihe1.drop (3) ::: reihe1.take (3)

Wie für das Problem gemacht.

Ergebnis wäre dann „cdabc“. Nur gibt es nicht eine solche Operation, sondern 10.000 Operationen, und man soll ermitteln, was passiert, wenn man diese 10.000 Operationen, die der Rechner in Null-Komma-Nix erledigt 5 Milliarden mal wiederholt. Das geht dann nicht mehr im Flug und man hätte schnell ein Speicherproblem, würde man immer neue Listen generieren, denn Listen kann man nicht ändern. Das geht sehr gut mit Arrays, die aber dieses take/drop nicht können, also konvertiert man hin und her. Listen, Vektoren, Buffer, Arrays, Maps, Iterables, Streams, und, und, und, und.

Und ständig meckert der Compiler, dass die Funktion die man aufrufen will ein Array von Arrays von Strings erwartet, man aber eine Sequence von Iterables of Character zu übergeben versucht, und so konvertiert man die Hälfte der Zeit von diesem zu jenem und dann wieder zurück.

Und weil ja die Zeit drängt, arbeitet man riskant und probiert das einfachste aus, was vielleicht klappen könnte – mal gelingen solche Konversionen automatisch, mal nicht – und plant nicht so sorgfältig und überlegt alles vorher, weil schnell, schnell, die Konkurrenz reicht schon ihre Lösungen ein! :)

So – genug lamentiert. Den Diskussionen zu Folge haben die anderen einen ähnlichen Lösungsansatz wie ich gewählt, um Teil b der Aufgabe, die Wiederholung von 5 Milliarden Programmläufen, zu lösen, aber bei ihnen ging es auf, bei mir nicht, und ich weiß noch nicht wieso. Und in 6,5 Stunden kommt schon das nächste Rätsel, und 15 b habe ich auch noch nicht gelöst.

Ach ja, und dann war ich noch auf StackExchange zwischenzeitlich, um zu sehen, was es an neuen Inkscapefragen gibt, und jemand wollte wissen, wie man in Voronoidiagrammen automatisiert die Dreiecke nummerieren kann. Voronoidiagramme, was das ist, musste ich selbst erst mal rausfinden und probierte es aus. Ich hoffte mit der Pfad-numerieren-Funktion und einem Script spektakuläre Ergebnisse zu erzielen, aber es erwies sich nur halb so hilfreich wie gehofft. Und als ich die Testgrafik gerade in den Müll werfen wollte, da ging mir auf, dass diese Zahlenwolke zu dem passt, was mir sonst im Kopf herumschwirrt, und dass ich ja auch wenig veröffentlicht habe, zuletzt.

Übrigens habe ich Ende November verpasst zu feiern, dass ich jetzt 5 Jahre blogge und dabei rd. 1500 Beiträge veröffentlicht habe, also ca. 6 Stück pro Woche. Wie ich es hätte feiern wollen wüsste ich aber auch nicht. So nebenbei in einem Absatz erwähnen, das erscheint mir ganz angemessen.

Hinterlasse einen Kommentar

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..