Finden Sie zunächst den Song "Dead Pixels in the Sky" von Nigel Stanford. Sie finden ihn auf seinem neuesten Album Automatica. Drücken Sie auf Play, denn es wird eine schöne 4:30 Hintergrundmusik sein, während Sie diesen Beitrag mit über 1.100 Wörtern lesen.
Wenn Sie ein langsamer Leser sind - und das werden Sie, wenn Sie an Advent of Code teilnehmen und versuchen, alle Anweisungen sorgfältig zu analysieren, um einen letzten (?) Fehler in Ihrem Code auszumerzen - fahren Sie mit "Space Cowboy" von Jamiroquai fort. Am Ende dieses Blog-Beitrags wird Ihnen klar werden, warum diese Songs so gut zum heutigen Tag passen.
Positionierung einer Asteroiden-Beobachtungsstation
Bei der heutigen Advent of Code-Herausforderung ging es darum, eine Position in einer Region der Galaxie mit vielen Asteroiden auszuwählen. Abhängig von der Anzahl der Asteroiden in einer ungehinderten Sichtlinie sollte eine optimale Position gefunden werden.
Als ich die Rätselbeschreibung las, wurde mir klar, welche Art von Advent of Code-Herausforderungen ich mag und vor welchen ich zunächst zurückschrecke.
Offensichtlich bevorzuge ich Rätsel, die eine konkrete Situation beschreiben, eine Situation, die ich mir geistig (oder auf dem Papier) vorstellen kann. Rätsel, bei denen es darum geht, durch reale und feste Dinge zu navigieren, wie Räume, Labyrinthe, Bäume und bewaldete Gebiete. Herausforderungen, bei denen es darum geht, physische Dinge zu bewegen, wie Pakete, Elfen, Bäume (wieder) und Aufzüge. Probleme bei der Manipulation von Strings oder Zahlen, Stapeln, Bäumen (wieder) und Listen.
Positionierungsadressen, Anweisungen und Bugs
Das lässt die Art von Problemen aus, die ich immer noch löse - und die ich lösen muss, sage ich mir - und die eher abstrakter Natur sind. Rätsel, in denen eine imaginäre Situation oder ein Gerät beschrieben wird, das simuliert werden muss. Dinge, bei denen es schwieriger ist, sich ein geistiges Bild davon zu machen. Ja, diese Assembunny-Programme, kommunizierenden Geräte und programmierbaren Handgelenkgeräte fallen eindeutig in diese Kategorie.
Zum Glück für Menschen, die gerne Assembler-Interpreter schreiben und ihre Interpreter anhand von Testprogrammen debuggen, kommt Advent of Code 2019 diesen Wünschen mehr als ausreichend nach. Wir haben den Intcode-Computer bereits an vier verschiedenen Tagen gesehen, und der Kalender zeigt erst den 10. Dezember an. Es ist eine sichere Vorhersage, dass dieser Computer mindestens noch einmal auftauchen wird.
Vor allem die gestrige Herausforderung war knifflig, und ich habe gesehen, wie ein paar Kollegen, die an #XebiaAoC teilnahmen, ihrem Frust am frühen Morgen Luft gemacht haben. An Tag 9 wurde eine neue (und letzte) Anweisung zum Befehlssatz des Intcode-Computers hinzugefügt. Ungewöhnlich für Advent of Code, war der Rätseltext zu dieser Anweisung etwas zweideutig und die mitgelieferten Beispiele zeigten nicht wirklich die vollen Möglichkeiten dieser Anweisung auf.
Ich hatte erst am Abend Zeit, mit dem täglichen Rätsel zu beginnen und stieß dabei auf einen ähnlichen Fehler, auf den viele meiner Kollegen gestoßen waren. Nachdem ich meinen Interpreter analysiert und versucht hatte, den Beispiel-Testfällen sorgfältig zu folgen, konnte ich den Fehler nicht entdecken. Es war frustrierend, anscheinend die Grenze der eigenen geistigen Fähigkeiten erreicht zu haben, zumindest in einem schläfrigen Zustand.
Es war kurz nach elf Uhr, als ich mit unserem Hund seine letzte Runde vor der Nacht drehen musste, an die frische Luft ging... und siehe da, plötzlich wurde mir die Natur meines Bugs klar.
Die Methode ist eine Variante der in der Softwareentwicklung weit verbreiteten Praxis des Rubber Duck Debugging. Ich selbst nenne dieses Verfahren daher von nun an "Dex the dog debugging":
Insights are often found /
by describing the problem aloud /
to the family's hound Twitter @jschulenklopper status
Positionierung Ihrer Programmiersprache
Vor einiger Zeit habe ich meine Kollegen gefragt: "Welche Programmiersprache(n) verwenden Sie normalerweise, um Advent of Code-Rätsel zu lösen... und warum haben Sie diese Sprache dieses Jahr gewählt?" Die Antworten sind so aufschlussreich, dass ich die meisten davon einfach wortwörtlich kopieren und einfügen werde:
- "Scala, da ich mit dieser Sprache am besten vertraut bin. Außerdem kann ich einige Dienstprogramme wiederverwenden, die ich letztes Jahr erstellt habe. Mein Ziel ist es nicht, eine neue Sprache zu lernen, sondern so schnell wie möglich zu sein..."
- "Ich werde die AoC wieder mit Ruby machen, genau wie in den vergangenen Jahren. In erster Linie, weil ich im Dezember [...] keine Zeit haben werde, mich an eine neue Sprache zu gewöhnen (sonst würde ich über Go nachdenken). Zweitens, weil ich Ruby als Programmiersprache wirklich mag, da sie oft zu schönem, prägnantem Code führt und nicht viele mentale Schritte zwischen der Lösung in meinem Kopf und dem Algorithmus in meinem Code erfordert."
- "Ich habe dieses Jahr Bash aufgegeben. Ich mache zuerst eine Quick-n-Dirty-Lösung in
Python , weil es eine einfache Sprache ist und ich sie besser beherrschen möchte. Dann versuche ich, die Lösungen in Apache Beam / Google DataFlow zu konvertieren, was ebenfalls Python ist." - "Ich benutze es, um Python zu lernen."
- "Kotlin: Ich habe einige Erfahrungen mit Kotlin gemacht und liebe es bisher. Es hat eine bessere funktionale Sprachunterstützung als Java (eine andere Sprache, die ich die meiste Zeit verwende). Sie bietet auch einige zusätzliche Funktionen (im Vergleich zu Java), die mir das Leben leichter gemacht und mir geholfen haben, Rätsel schneller zu lösen."
- "Python, um Python zu üben."
- "Go, weil ich mehr lernen möchte als 'eine REST-API in Go bauen'."
- "Kotlin, weil ich es in meinem aktuellen Projekt verwende und AoC einem hilft, diese exotischen Funktionen zu finden, die ich normalerweise nicht verwende."
- "Go, weil ich die Sprache besser verstehen möchte (und ein Gefühl dafür bekommen möchte, wie man TDD damit macht)."
- "TypeScript, weil es viele hilfreiche Funktionen enthält und die Notation kurz (und leicht zu interpretieren) ist."
- "Clojure, weil ich die Sprache liebe und sie meiner Denkweise entspricht (99% der Zeit). Ich wollte AoC benutzen, um Rust zu lernen, aber ich kann Clojure nicht so oft benutzen, also bin ich darauf zurückgekommen."
- "Clojure auch, ich versuche es während der AoC zu lernen."
- "Ich mache zum ersten Mal AoC. Ich verwende Python, weil ich mit dieser Sprache am besten vertraut bin."
- "Ich benutze dieses Jahr Go, um ein bisschen besser zu lernen, was über die trivialen Dinge hinausgeht. Wenn ich versuchen würde, effizient zu sein, würde ich Scala verwenden."
- "Ich verwende dieses Jahr zum ersten Mal Go, in den Jahren davor habe ich Java und im ersten Jahr sogar Python verwendet. Meistens verwende ich die Sprache, mit der ich gerade arbeite und/oder die ich am besten beherrsche."
- "Python, natürlich! Ich habe bereits meine
numpyundnetworkxImporte parat. Für mich geht es darum, den Algorithmus zur Lösung der Aufgabe zu finden, nicht darum, wie man eine Schnittmenge von Mengen berechnet. Dafür ist Python gut geeignet." - "Python, weil es meine Lieblingssprache ist, und da ich nicht mehr hauptberuflich programmiere, ist dies eine Chance, meine Kenntnisse in mindestens einer Sprache aufrechtzuerhalten."
Es ist sehr schön, diese Vielfalt an Programmiersprachen und Gründen innerhalb des #XebiaAoC zu sehen.
Positionierung eines Lasers zur Verdampfung von Asteroiden
"Tote Pixel am Himmel? Ein Weltraum-Cowboy? Was hat das damit zu tun?", werden Sie sich vielleicht fragen. In Teil 2 der heutigen Aufgabe wurde sofort klar, warum die Überwachungsstation so sorgfältig positioniert werden musste. Die Überwachungsstation ist mit einem riesigen rotierenden Laser ausgestattet, und all diese Asteroiden mussten verdampft werden, indem man sie mit dem Laserstrahl traf. Erinnern Sie sich noch an das Arcade-Spiel "Asteroids", ein Shooter mit Weltraummotiven? Genau das, aber von einer festen Position aus und mit sich nicht bewegenden Asteroiden.
Endlich eine konkrete Herausforderung, mit einer Situation, die ich mir vorstellen kann, um mein Gehirn mit Zwischenproblemen und möglichen Lösungen zu beschäftigen. Ich liebe es, diese Art von Rätseln zu lösen.
Advent des Codes 2019 Serie
- Advent of Code 2019 hat begonnen - Machen Sie mit!
- Advent of Code 2019 - Tag 2
- Advent des Codes: Wie Excel mir den Tag rettete und auch meinem Sohn den Tag rettete
- Advent des Codes - Tag 4: Visualisieren
- Advent des Codes - Tag 5: Saintaerkla2s
- Advent of Code - Tag 6: Wie ich an AoC hängen geblieben bin
- Advent of Code - Tag 7: Teilen Sie Ihren Arbeitsablauf
- Advent of Code - Tag 8: Wie einfache Dinge für manche Menschen sehr schwer sein können
- Advent of Code - Tag 9: Wie ich anfing, Spaß am Lösen von Programmierrätseln zu haben
- Advent of Code - Tag 10: Weltraum-Cowboys schießen Pixel in den Himmel
- Advent des Codes - Tag 11: Sein oder nicht sein
- Advent of Code - Tag 12: Nach dem Mond schießen
- Advent des Codes - Tag 14: Kettenreaktion
- Advent des Codes - Tag 16: Flüche
- Advent of Code - Tag 17: Vakuumieren eines Gerüsts mit dem Intcode-Programm
- Wie kleine grüne Männchen mir geholfen haben, ein Rätsel zu lösen
- Advent of Code - Tag 20: Ein bisschen Überarbeitung
- Advent of Code - Tag 21: Es ist ein Marathon, kein Sprint
- Advent of Code - Tag 22: Mischen von Karten bis in alle Ewigkeit
- Advent of Code - Tag 23: Das Netzwerk ist zuverlässig
- Advent of Code - Tag 24 & 25: Unkonventionelles Denken
Verfasst von
Jochem Schulenklopper
Contact