Der kosmische Ruf ist eine Nachricht, die 1999 und 2003 in den Weltraum gesendet wurde. Sie besteht aus 23 monochromen Bitmap-Bildern mit 127 * 127px, wie hier beschrieben .
Ihre Aufgabe ist es, ein Programm zu schreiben, das die gesamte 127 * 2921px-Nachricht entweder als Text (bestehend aus Nullen, Einsen und Zeilenumbrüchen) oder als Bild (auf dem Bildschirm gezeichnet oder auf der Festplatte gespeichert) anzeigt. Es wird zwei Kategorien von Gewinnern geben: eine für die Textausgabe und eine für die Bildausgabe.
Alle Tricks sind erlaubt, mit Ausnahme der üblichen Schlupflöcher.
Die 23 Seiten dürfen separat ausgegeben werden.
Es ist erlaubt, bis zu 23 Programme (wie eines für jede Seite) zu schreiben und deren Größe zu summieren, um Ihre Punktzahl zu bestimmen.
Es ist zulässig, bis zu 23 Binärdateien neben Ihren Programmen zu verwenden. Ihr Gewicht wird in Ihrer Punktzahl gezählt.
Der kürzeste Code (in Byte) gewinnt.
Bei 1 Bit pro Pixel enthält das Bild 127 * 127 * 23/8 = 46370 Bytes + 7 Datenbits. (Warnung: Es ist nicht erlaubt, eine zusätzliche Null auszugeben, wenn Sie Pixelwerte in 46371 Bytes speichern.)
Für die Textausgabe ist ein Zeilenumbruch / Leerzeichen zulässig.
Die visuelle Ausgabe kann außer den schwarzen Pixeln des kosmischen Aufrufs keine schwarzen Pixel enthalten. Es kann in einer Spalte gezeichnet (richtig sortiert) oder in 23 Bilder aufgeteilt oder animiert (wie ein GIF) und auch richtig sortiert werden.
Anhang: Die Textausgabe und die zu reproduzierende Bildausgabe:
0
, das leere Schnecken Programm druckt1
, und das leere GolfScript Programm druckt eine neue Zeile . Jemand könnte eine 0-Byte-, 373888-Programm-Antwort einreichen :)Antworten:
GIF, 27386 Bytes
Hier sind die Seiten der Originalübertragung, die in einzelne GIF-Frames unterteilt sind. Es stellte sich heraus, dass sie nicht so klein sind wie 1 PNG von allen :(
quelle
HTML, 16012b
Ich habe das Bild in PNG8 komprimiert, es in einem Texteditor geöffnet und angehängt
<svg onload="document.body.innerHTML='<img src=#>'">
am ende und voilà:
Demo: http://xem.github.io/miniCosmicCall/
NB: Das Anhängen
<img src=#>
funktioniert auch, aber es lässt viel Müll sichtbar, also ziehe ich es vor, es nicht zu tun.PS: Zum Spaß habe ich die gesamte Nachricht auch in einem einzigen ausführbaren Tweet abgelegt (Sie können ihn in eine Browserkonsole kopieren und das Bild wird angezeigt):
https://twitter.com/MaximeEuziere/status/742440423994580992
quelle
Python 2.7 -
109718077 Bytesaktualisieren:
LZMA funktioniert eigentlich aus irgendeinem Grund nicht für mich, also ging ich zurück zu Deflate.
Ich habe ein Online-Tool gefunden, mit dem ich das PNG noch weiter komprimieren kann (es wird eine verlustbehaftete Komprimierung angegeben, das Array bleibt jedoch unverändert).
__main__.py
Drehbuch ein bisschen mehr gespielt ...Die meisten Komprimierungsalgorithmen betrachten Daten als ein eindimensionales Array und können daher die sich wiederholenden zweidimensionalen Zeichen, die im kosmischen Aufruf angezeigt werden, nicht erfassen (IMO erschwert es auch Ausländern, Folgendes zu verstehen: P).
Zuerst habe ich jedes Zeichen als 7 * 5-Array ausgewählt und eine Liste aller eindeutigen Zeichen erstellt (101, wenn ich mich erinnere). Dann habe ich das Bild durchlaufen und als ein Zeichen gefunden wurde, wurden die Position und der Index dieses Zeichens (in der Zeichenliste) aufgezeichnet.
Diese Positionen könnten mit einem einzelnen int dargestellt werden, jedoch mit mehr als 2K Zeichen, und Positionen im Bereich von 0-370966 (divmod-Form) erfordern jeweils bis zu 3 Bytes. Ich habe die Zeichenpositionen jedoch der Reihe nach erfasst und stattdessen die absolute Position in die versetzte Position konvertiert, sodass die meisten Zahlen weniger als 1 Byte betragen. Ich habe diese Liste in utf-8 codiert, um die wenigen Zahlen zu berücksichtigen, die größer als 1 Byte waren
Nachdem ich alle übereinstimmenden Zeichen aufgenommen und entfernt hatte, speicherte ich das PNG mit maximaler Komprimierung. Anschließend habe ich das Python-Rekonstruktionsskript (in umgekehrter Reihenfolge), das PNG, die Chat-Zeichenvorlage und die Zeichenpositionsliste in eine ZIP-Datei gepackt, um die Tatsache zu nutzen, dass Python einen Ordner oder eine ZIP-Datei als Argument verwenden kann Die Ausführung beginnt bei jeder Datei auf der obersten Ebene
__main__.py
. Ich habe ein bisschen mit 7z herumgespielt, um die beste Komprimierung zu erzielen, was sich als LZMA mit einem 1M-Diktat und 32-Bit-Wörtern herausstellte.Hier ist das Decoder-Skript (gespielt, aber mit Kommentaren)
Link zum Download für die Zip-Datei ...quelle
Gzipbzip2
in der Shell,2091418965 BytesErstellen Sie die Ausgabedatendatei mit der in der Frage angegebenen Textausgabe
bzip2
und benennen Sie die Datei in ums
. Dies ermöglicht dann:den Job erledigen. Es summiert sich also auf 18958 Datenbytes und einen 7-Byte-Befehl.
quelle
Pyth, 46381 Bytes
Aus offensichtlichen Gründen kann es hier nicht gepostet werden.
Stichprobe.
Pastebin des Hexdumps des Programms.
quelle
jc.BC""127"
).Bash + WebP-Binärdatei, 11 + 15330 = 15341 Byte
Wie die Regeln besagen:
und
… Ich konnte nicht widerstehen, etwas dummes zu posten.
Das Programm befindet sich in Bash und gibt das Bild aus, indem es auf der Festplatte gespeichert wird.
Es wird eine Binärdatei verwendet, die auch eine Bilddatei ist (ja, WebP ist ein Bildformat), daher kann das Programm nur… eine Kopie dieser Datei erstellen.
Also, der Code (11 Bytes):
Angenommen, die Companion-Binärdatei heißt "b", schreibt der Code die Image-Datei mit der korrekten Erweiterung ("a.webp") auf die Festplatte.
Ich sehe wenig Grund, die Binärdatei hochzuladen, weil sie trivial durch Ausführen erstellt wird
es erzeugt die Datei mit 15330 Bytes. Wenn jemand möchte, kann ich es irgendwo hochladen.
Hinweis: Die
-z
Optioncwebp
aktiviert den verlustfreien Komprimierungsmodus.9
ist die Druckfestigkeit (max).quelle
Python 3, 64513 Bytes
Verwenden Sie nur ASCII!
http://pastebin.com/PMLb4Xti
Alte Version, 64529 Bytes: http://pastebin.com/nteYkUtM
quelle
import lzma,base64,os