Auswählen, um zum Inhalt zu springen.
[Tag 1 AoC] Verschwundener Chefhistoriker

[Tag 1 AoC] Verschwundener Chefhistoriker

Aktualisiert am
fx
ABS LÄNGE SUMME TEIL WERT

Die Advent Of Code Seite bringt jeden Tag neue Programmier-Rätsel – aber was, wenn wir sie mit Excel lösen? In diesem Beitrag zeige ich Schritt für Schritt, wie man das Rätsel von Tag 1 mit cleveren Excel-Funktionen lösen kann.

Die Prämisse

Santa's Chefhistoriker ist verschollen! Letzte Sichtung: Irgendwo zwischen Zelle A1 und XFD1048576. Die Seniorhistoriker-Elfen haben Sie rekrutiert, um in diesem Excel-Labyrinth nach 50 historisch signifikanten Zellen zu suchen, bevor der Weihnachtsmann am 25. Dezember startet.

Die Büro-Apokalypse

Sie stürmen ins Büro des Chefhistorikers und finden... Chaos in Reinform! Überall Post-its mit Zahlen, die aussehen, als hätte ein Taschenrechner Durchfall gehabt. Diese "Location IDs" sind offenbar der Schlüssel zum Rätsel.

Das Zahlen-Matchmaking

Die Elfen teilen sich in zwei Gruppen und erstellen jeweils eine Liste Ihre Aufgabe: Verkuppeln Sie die Zahlen! Es muss der Abstand der beiden Zahlen ermittelt werden, dazu wird die kleinste Ziffer mit der kleinsten Ziffer vergleichen und der Abstand berechnet, dann die zweitkleinste mit der zweitkleinsten, usw.

Beispiel:

A1: 342133
B1: 435393
A1(sortiert): 123334
B1(sortiert): 333459
C1(Lösung): 2+1+0+1+2+5 = 11
A2: 22222
B2: 22213
A2(sortiert): 22222
B2(sortiert): 12223
C1(Lösung): 1+0+0+0+1 = 2

Benötigte Funktionen (Spoiler):

  1. Ziffern extrahieren (Funktion: TEIL)
  2. Werte als Array sammeln (Funktion: SEQUENZ)
  3. Sortieren (Funktion: SORTIEREN)
  4. Text in Zahlen umwandeln (Funktion: WERT)
  5. Absolute Differenzen berechnen und summieren (Funktion: ABS und SUMME)

Tip 1:

Ziffern extrahieren: Zunächst müssen die Ziffern aus den Zahlen extrahiert werden. Dafür gibt es die Funktion TEIL.

=TEIL(342133; 1; 1) ergibt 3.

=TEIL(342133; 2; 1) ergibt 4.

Tip 2:

Mit der Funktion SEQUENZ lassen sich mehrere Ziffern extrahieren und in ein Array bringen:

=TEIL(342133; SEQUENZ(LÄNGE(342133)); 1).

Tip 3:

Die Funktion SORTIEREN sorgt dafür, dass die Ziffern nach Größe sortiert werden

=SORTIEREN(TEIL(342133; SEQUENZ(LÄNGE(342133)); 1)).

Tip 4:

Durch die Verwendung von TEIL wird das Ergebnis in ein Textformat konvertiert. Um Abstände zu berechnen wird aber ein Zahlenformat benötigt. Mit WERT wird Text wieder zu einer Zahl.

=WERT(SORTIEREN(TEIL(342133; SEQUENZ(LÄNGE(342133)); 1))).

Tip 5:

Wir benötigen absolute Werte, weil der Abstand von 1 zu 2 der gleiche ist wie von 2 zu 1. Mit ABS wird das Vorzeichen entfernt.

Lösung:

=SUMME(ABS(WERT(SORTIEREN(TEIL(A1;SEQUENZ(LÄNGE(A1));1)))-WERT(SORTIEREN(TEIL(B1;SEQUENZ(LÄNGE(B1));1)))))

Power Query

Das Rätsel lässt sich auch in Power Query lösen. Dazu muss eine Abfrage aus Text erstellt werden.

Daten aus Text abrufen

Dadurch werden die Zahlen in den Power-Query-Editor geladen.

Power-Query-Editor

Schritt 1

Wir können eine Liste aus den Ziffern erstellen mit Text.ToList. Hierdurch wird die Zahl 64256 zu der Liste {6,4,2,5,6}

=Table.AddColumn(Quelle, "Ziffernliste1", each Text.ToList([Column1]))

Schritt 2

Auch hier müssen die Ziffern wieder von Text in Zahlen umgewandelt werden. Dabei hilft List.Transform mit Number.From

=Table.AddColumn(Add_ZiffernListe_2, "Zahlenliste1", each List.Transform([Ziffernliste1], each Number.From(_)))

Schritt 3

Die Zahlen müssen mit List.Sort sortiert werden.

=Table.AddColumn(Convert_To_Numbers_2, "SortierteZahlenliste1", each List.Sort([Zahlenliste1]))

Letzter Schritt

Mit List.Sum, List.Transform und List.Zip können die Differenzen der einzelnen Zahlen gezogen werden. Number.Abs sorgt dafür, dass wir absolute Zahlen erhalten.

= Table.AddColumn(Sort_Zahlenliste_2, "Abstand", each List.Sum(List.Transform(List.Zip({[SortierteZahlenliste1], [SortierteZahlenliste2]}),each Number.Abs(_{0} - _{1}))))

Nun muss man nur noch die Spalte "Abstand" summieren.

Wir benutzen Cookies

Diese Webseite nutzt Cookies. Näheres dazu erfahren Sie in unserer Datenschutzerklärung.