Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 25.12.07 12:54 
Lösung zu Paranuss 3, das kaputte Lied

Da bei dieser Aufgabe durchaus der Text der Aufgabenstellung interessant ist, zitiere ich ihn hier nochmal:
Paranuss 3 lautete:
Cold Times - Kein Kind ist je vergessen

Zumindest bisher nicht. Der Weihnachtsmann hat mal wieder ein großes Problem. Jedes Jahr stellt er Listen mit den Namen der Kinder zusammen, die er beschenken muss. Damit er nicht komplett die Übersicht verliert, hat er für jede Stadt eine eigene Liste. Er ist auch schon fast fertig für dieses Jahr. In der letzten Stadt allerdings hat Rudolph mal wieder so viel Weihnachtspunsch getrunken, dass er nicht nur eine rote Nase bekommen hat, sondern auch nicht mehr so gut geradeaus fliegen kann. Und so kam es, dass er mitsamt dem Schlitten gegen eine Sternschnuppe gefahren ist. Dabei hat sich der Weihnachtsmann nicht nur eine kleine Gehirnerschütterung zugezogen, so dass er sich nicht mehr an den Namen der letzten Stadt erinnern kann, die er noch besuchen muss (keine Angst, es geht ihm ansonsten gut). Es ist auch nicht nur die Liste mit den Namen komplett durcheinander gekommen, die irgendwann mal alphabetisch sortiert war. Zudem ist auch sein mp3-Player hingefallen, und dabei ist ein Lied gründlich durcheinander geraten.
Das wäre ja eigentlich nicht so schlimm - nur dummerweise ist der Titel dieses Liedes der Name der Stadt, die er noch beschenken muss. Ein Backup ist natürlich nur was für kleine Wichtel, daher hat der Weihnachtsmann keines dabei. Sein Handy funktioniert zum Glück noch, aber seine Wichtel sind schon in der Südsee und schneiden mit ihren Surfbrettern die tosenden Wellen und haben keine Lust mehr zu arbeiten.

Könnt ihr dem Weihnachtsmann helfen und ihm den Namen der (antiken) Stadt nennen, damit auch dieses Jahr kein Kind vergessen wird? Den Namen der Stadt muss komplett in Kleinbuchstaben eingegeben werden!


Wie in dem Hinweis gesagt, kann man das größtenteils durch Knobeln lösen. Eigentlich ist dieses Rätsel sehr sehr einfach gewesen. Wer schonmal Daten mit Streams gelesen und geschrieben hat, und schonmal Bubblesort implementiert hat, hat alle Vorraussetzungen, um dieses Rätsel zu knacken.

Die gesuchte Stadt war nicht Delphi, sondern Antissa (das Lösungswort war also "antissa").

Gedanken am Anfang.

Wenn man die Eigenschaften der mp3-Datei mit denen der Textdatei vergleicht, kann man folgende Gemeinsamkeit feststellen: Die Anzahl der Frames im mp3 stimmt mit der Anzahl der Namen in der Liste überein. Die Framezahl können diverse mp3-Tag-Editoren anzeigen, aber auch gängige Player wie z.B. Winamp.
Das legt die Vermutung nahe, dass die Frames des Stückes genauso durcheinander geraten sind, wie die Liste. Im regulären Gewinnspiel gabs ja eine ganz ähnliche Frage - nur musste man da die Buchstaben eines Textes sortieren. Man steht also vor der Aufgabe, das Lied in seine einzelnen Frames zu zerlegen, und diese zu sortieren, wie es die Unordnung in der Namensliste vorgibt. Das ließe sich z.B. per Bubblesort einfach so lösen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
for j := 0 to NameList.Count - 2 do
  for i := 0 to NameList.Count - 2 do
  begin
    if AnsiCompareText(NameList[i], NameList[i+1]) > 0 then
    begin
      swapName  := NameList[i+1];
      swapFrame := FrameArray[i+1];

      NameList[i+1]   := Namelist[i];
      FrameArray[i+1] := FrameArray[i];

      NameList[i]  := swapName   ;
      FrameArray[i] := swapFrame;
    end;
  end;
Bleibt die Frage, wie man an das Framearray kommt.

Die billige Lösung

Ich habe den Fehler gemacht, und eine mp3-Datei mit konstanter Bitrate genommen. Das heißt, dass jeder Frame dieselbe Größe hat (eigentlich können sie auch mal um ein Padding-Byte abweichen, aber das ist hier scheinbar auch nicht der Fall). D.h. 1.564.390 Bytes geteilt durch 4286 Namen sind 365. Man teilt die Datei einfach in 4286 Stücke zu je 365 Byte auf und sortiert diese Brocken. Anschließend schreibt man die hintereinander wieder in eine Datei und bekommt dann ein anständiges Lied bei raus.
Dann spielt man das Ding ab, startet nebenbei ein gemeines Adventsrätsel-Zerstörer-Programm wie Tunatic (das darf jeder selber googeln) und bekommt die Lösung präsentiert. So war das nicht geplant.

Die richtige Lösung

Nehmen wir an, das mit der konstanten Bitrate hätte nicht geklappt, oder wir wollen auch das Lied im Hinweis hörbar machen. Wie kommt man an die Frames? Im Hinweis stand, dass sich Hinweise in der Aufgabenstellung verstecken. Gehen wir die mal durch. Ich denke, dass der erste Teil durchaus in einer Weihnachtsgeschichte vorkommen kann. Holprig wirds am Ende, oder? Die Wichtel schneiden mit ihren Surfbrettern tosende Wellen? Ok. Sie surfen. Gesurft sind wir in diesem Advent auch genug durch die Seiten der Sponsoren. Der Sponsor für dieses Rätsel ist die Entwickler-Ecke selbst. Tosende Wellen. Waves. Es geht hier um Musik. Wav. Die Wellen werden geschnitten? Suche in der Entwickler-Ecke WAV SCHNEIDEN. Wer mag, kann auch Suche in der Entwickler-Ecke MP3 SCHNEIDEN. Und wem das nicht hilft, der kann auch einfach dem Suche in der Entwickler-Ecke WEIHNACHTSMANN HELFEN, wie es in der Aufgabe gewollt war. Man findet jeweils ein paar Topics, zwei davon sind hilfreich, nämlich dieses oder dieses. In diesen beiden Topics stand mal Delphi-Code, der eine mp3-Datei in einzelne Frames zerlegt. Dieser Code wurde gelöscht, und durch folgendem Hinweis ersetzt:
Zitat:
Edit: Wer suchet, der findet, und ist doch nicht am Ziel. Hier war mal ein Stück Code, das dem Weihnachtsmann auf seiner Suche nach dem Ziel helfen kann, doch der böse Grinch hat ihn versteckt, und stattdessen ein Bild hinterlassen. Aber der Grinch spielt gerne verstecken, und konnte es auch hier nicht lassen.
Zusätzlich wurde folgendes Bild angehängt (Hinweis: hier als jpeg, für das weitere braucht man das Original Bitmap)

user defined image


Ok, dann wurde das Mp3-Rätsel also verlagert in ein Bild-Rätsel. Es sollte offensichtlich sein, dass in diesem Bild weitere Hinweise versteckt sind, die man zu Lösung benötigt. Um es kurz zu machen: Die Lieblingsbeschäftigung vom Grinch ist Suche in der Entwickler-Ecke VERSTECKSPIELEN. Man findet dann dieses Topic mit folgendem Hinweis:
Zitat:
Edit: Wer beim Versteckspielen schummeln will, muss zunächst das Passwort herausfinden. Es handelt sich dabei um den Titel eines sehr schönen Stückes von einer Band, die sonst eher durch Rumbrüllen auffällt. Bekannte Titel wären z.B. "Über, über" oder "Was kostet der Fisch".

Aber bedenke: Die Musik, die du eigentlich suchst, ist nicht hirn- sondern erdfrei!
Dies ist auch der Grund, warum ein Shout von Regan aus der SB gelöscht wurde. Er sagte was von "Hyper Hyper DF! How much is the fish?" Mag Zufall sein, aber durchaus ein komischer. Das Zip-Archiv im Anhang dieses Topics ist mit einem Passwort geschützt.
Man muss nun ein letztes Mal suchen. Ich glaube, man kann durchaus rausfinden, welche Band hier gemeint ist. Eine Suche nach Scooter (am besten die Suchergebnisse als Beiträge anzeigen lassen) liefert schnell den Titel "Rhapsody in E", den ein sympathischer Moderator der Entwickler-Ecke ab und zu ganz gerne hört. Damit kann man das Archiv entpacken. Das darin enthaltende Programm enthüllt folgenden Text, der sich in dem Bild versteckt:
Zitat:
Erinnert euch an vergangene Tage,
und vergangene Gewinnspiele.

Hasht den Grinch und ihr findet den
Code gezipt im Ordner Downloads
auf Gausis Webseite.

Doch seid gewarnt!

Der Code wird helfen, aber nicht
direkt des Rätsels Lösung offenbaren!

Wem die bisherigen Zaunpfähle nicht
reichen, dem sei hier noch gesagt:

Als der Weihnachtsmann sich von dem
Unfall erholt hat, und das Plasma der
Sternschnuppe langsam abkühlte, hat
es einmal ganz laut Pong gemacht.

Doch seid gewiss: Städte, die von
Vulkanen verschüttet worden sind,
muss der Weihnachtsmann nicht
mehr besuchen!


Jetzt muss man noch wie im letzten Jahr den MD5-Hashwert von "Grinch" berechnen und findet darüber den Quellcode, der einem die Frames der mp3-Datei liefert: 809D05A8FFCEAD983EEF570DA8BBFC52.zip

Mit kleinen Modifikationen lässt sich leicht das Programm im Anhang schreiben, was beide Lieder wieder richtig sortiert.

Bleibt die Frage, wie man nun auf den Titel des Stückes kommen kann: Antissa von E.S. Posthumus. Dazu wurden folgende Hinweise gegeben, mit denen man mit Hilfe seiner bevorzugten Suchmaschine die Lösung finden kann.
  • Der Titel des Rätsels: Cold Times - Kein Kind ist je vergessen. Hört sich komisch an? Kann sein. Die Titelmelodie der Fernsehserie Cold Case - Kein Opfer ist je vergessen ist Nara von E.S. Posthumus
  • Das Bild, das der Grinch hinterlassen hat, ist ein Ausschnitt des Covers vom bisher einzigen Album dieser Band. Das Original "Matthäus und der Engel" von Michelangelo Merisi Da Caravaggio kann in San Luigi Dei Francesi in Rom bewundert werden.
  • Die Aussage, dass man eigentlich erdfreie Musik sucht. Das Album von E.S. Posthumus heißt Unearthed
  • Die Geschichte mit Pong, dem abkühlenden Plasma der Sternschnuppe und verschütteten Städten: Der Titel Pompeii auf diesem Album ist Hintergrundmusik zu dem äußerst genialen und kostenfreien Spiel Plasmapong, was es zur Zeit leider nicht offiziell zum Download gibt (Atari hat wohl die Markenrechte an Pong, und die Webseite is down...)

Man kommt so auf die Seite www.esposthumus.com und kann sich dort das komplette Album anhören (der IE spackt bei mir rum, Opera und FF haben keine Probleme). Alternativ kann man auch die Titel durchgehen und bei youtube o.ä. danach suchen - Antissa findet man auf jeden Fall mehrfach. Oder dem Link nach cdbaby.com folgen und dort den ersten Titel probehören. Zuletzt kann man noch bei Wikipedia verifizieren, dass Antissa tatsächlich eine antike Stadt ist/war, wie übrigens alle Titel auf diesem Album.

Und jetzt mal ehrlich: War das denn so schwer? :mrgreen:
Einloggen, um Attachments anzusehen!
_________________
We are, we were and will not be.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 25.12.07 15:28 
user profile iconGausi hat folgendes geschrieben:
Und jetzt mal ehrlich: War das denn so schwer? :mrgreen:

Jep ;)
Die Such-Schipseljagd die du noch draus gemacht hast wäre ja richtig interessant geworden. Schade, da hatte ich keine Zeit mehr zu.

user profile iconGausi hat folgendes geschrieben:
Dann spielt man das Ding ab, startet nebenbei ein gemeines Adventsrätsel-Zerstörer-Programm wie Tunatic (das darf jeder selber googeln) und bekommt die Lösung präsentiert. So war das nicht geplant.

*ganzleisewegschleich*

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 25.12.07 17:39 
user profile iconGausi hat folgendes geschrieben:
Dann spielt man das Ding ab, startet nebenbei ein gemeines Adventsrätsel-Zerstörer-Programm wie Tunatic (das darf jeder selber googeln) und bekommt die Lösung präsentiert. So war das nicht geplant.
Hatte ich nicht nötig - beim zweiten Abspielen der MP3 hat mir der WMP bereits Titel, Künstler und Cover präsentiert :shock: :lol: . Wenn Windows-Software etwas kann, dann ist es Nach-Hause-Telefonieren :zwinker: . Lustigerweise passierte das genau in dem Moment, in dem Tunatic mit dem Suchen begann :duck: .

Hier mal jedenfalls meine 9 Zeilen ;) :
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var names = File.ReadAllLines("Liste.txt");
using (var reader = new BinaryReader(new FileStream("Lied.mp3", FileMode.Open)))
using (var writer = new BinaryWriter(new FileStream("Out.mp3", FileMode.Create)))
  foreach (var block in
    names.Select(name => new {
      Name = name,
      Data = reader.ReadBytes((int)reader.BaseStream.Length / names.Length)
    }).OrderBy(block => block.Name))
    writer.Write(block.Data);
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Di 25.12.07 18:19 
Ich habs nicht gelöst und auch nix abgeschickt... dachte aber eine Zeitlang es wäre İzmir, weil die Antwort ja in kleinbuchstaben zu geben war und es bei uns kein großes I mit Punkt gibt... allerdings hab ich auch kein Lied gefunden das so heißt ;)

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 25.12.07 18:32 
user profile iconGausi hat folgendes geschrieben:
Dies ist auch der Grund, warum ein Shout von Regan aus der SB gelöscht wurde. Er sagte was von "Hyper Hyper DF! How much is the fish?" Mag Zufall sein, aber durchaus ein komischer.

Ich möchte nochmals betonen: Ich habe das wirlich rein zufällig gesagt, weil ich gerade Scooter gehört habe. Und wie du selbst sehen wirst (siehst !?), habe ich das Rätsel nicht gelöst, obwohl ich da schon sehr weit hätte sein müssen.