Sende einen kosmischen Ruf


16

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:

kosmischer Ruf


19
„Es ist erlaubt, viele Programme (wie, eine für jede Seite) und die Summe ihrer Größe zu bestimmen , um Ihre Punktzahl zu schreiben.“ Das ist gefährlich: das leere Jelly Programm druckt 0, das leere Schnecken Programm druckt 1, und das leere GolfScript Programm druckt eine neue Zeile . Jemand könnte eine 0-Byte-, 373888-Programm-Antwort einreichen :)
Lynn

Haha, okay, also werde ich die Anzahl der Programme auf 23 begrenzen.
xem

Sind nachfolgende Zeilenumbrüche / Leerzeichen erlaubt?
Loovjo

yep. . . . . .
Xem

Können wir eine andere Datei verwenden oder müssen wir nur an der Quelldatei arbeiten? Z.B. Kann ich mit IO eine komprimierte Version speichern und dann dekomprimieren oder muss alles ein Literal im Code sein?
Hoffentlich

Antworten:


18

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 :(

Animiertes GIF für kosmische Anrufe


7
Hallo und willkommen bei PPCG! Dies wird zwar nicht gewinnen , aber es ist immer noch ein guter Beitrag.
NoOneIsHere

Hast du geschwankt? Kann möglicherweise 300 Byte einsparen, wenn Sie für die Übergänge zusätzliche Transparentfolien verwenden.
Magic Octopus Urn

7

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


1
kürzeste Antwort + 1
Erik der Outgolfer

habe mein letztes wort noch nicht gesagt!
xem

Ich bin sicher, ich kann nicht verstehen, was Sie hier sagen wollten.
Erik der Outgolfer

Entschuldigung, ich wollte versuchen, etwas noch kleiner zu machen
xem

6

Python 2.7 - 10971 8077 Bytes

aktualisieren:

  • 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).

  • Ich habe das __main__.pyDrehbuch ein bisschen mehr gespielt ...
  • Ich habe festgestellt, dass ich einen Schritt ausgelassen habe (Extrahieren der Datendateien aus dem ZIP-Archiv).
  • DL-Link hinzugefügt (siehe unten)

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)

import sys,zipfile as z
z.ZipFile(sys.argv[0]).extractall() #extract data files from zip to cwd
from numpy import*
o=open  #next line overwrites open, which I need
from PIL.Image import*
from scipy.ndimage import*
a=imread('p')[:,:,0]/255 #read image file
a[:2414,0]=0 #draw vertical borders
a[2541:,0]=0
a[2412:,-1]=0
a[:2287,-1]=0
for x in range(0,2921,127):a[[x,x+126],:]=0 #draw horizontal borders
with o('c','rb') as f:t=f.read();C=[int(i)for c in t for i in'{0:08b}'.format(ord(c))] #read character template file and convert to list of bytes
C=array(C[:-1]).reshape([101,7,5]) #re-slice (extra 0 appended to make even number of bytes) and re-shape
with o('l','rb') as f:L=array([ord(x)for x in f.read().decode('utf_8')]).reshape([2158,2]) #read decode and reshape positional list
p=0 #relative position accumulator
for e in L:p+=e[0];x,y=p%127,p/127;a[y:y+7,x:x+5]=C[e[1]] #divmod for x,y position and paste character template onto array at position
i=fromarray(a*255)
i.show()
Link zum Download für die Zip-Datei ...


Ich bin :) (und herzlichen Glückwunsch zu diesem Ergebnis!)
Xem

@xem ... kurz nach dem Posten habe ich weiter damit rumgespielt und es ist kaputt rn (Python gibt mir eine Art Zlib-Fehler beim Laden) und es ist auch auf meinem Arbeitscomputer. Ich werde es montags aufstellen, wenn ich es wieder in einen funktionierenden Zustand versetzen kann. : P
Aaron

Ich habe das Gefühl, dass es möglich sein könnte, ein Gleichgewicht zwischen der PNG-Komprimierung und den von mir codierten Zeichen (weniger verwendete) zu optimieren, um ein paar weitere Bytes zu sparen.
Aaron,

1
@ Xem Ich fügte ein dl Link ...
Aaron

Ich liebe die 2D-Komprimierungsidee ... Was ist mit der 3D-Komprimierung? (Stapeln der Bilder)
NonlinearFruit

3

Gzip bzip2 in der Shell, 20914 18965 Bytes

Erstellen Sie die Ausgabedatendatei mit der in der Frage angegebenen Textausgabe bzip2und benennen Sie die Datei in um s. Dies ermöglicht dann:

bzcat s

den Job erledigen. Es summiert sich also auf 18958 Datenbytes und einen 7-Byte-Befehl.


1
Ich denke, Sie können stattdessen ein paar k mit 'bzip2' speichern!
Dom Hastings

@DomHastings: Ich bin endlich deinem Rat gefolgt.
Julie Pelletier

Für weitere Forschung: Bubblegum und Zopfli .
Digital Trauma

2

Pyth, 46381 Bytes

Aus offensichtlichen Gründen kann es hier nicht gepostet werden.

jc.BC"<too long>"127

Stichprobe.

Pastebin des Hexdumps des Programms.


Sie kodieren die Bits 7 mal 7 in lateinischen 1-Zeichen, richtig? Einfach und nett! :) Natürlich suche ich nach einer viel besseren Komprimierung: p
xem

1
Ja, ich mache eine bessere Komprimierung. Ich habe sie übrigens 8 mal 8 codiert.
Undichte Nonne

Übrigens, ich frage mich, wie Sie zu dieser Punktzahl gekommen sind: 127 * 127 * 23/8 = ungefähr 46371 Bytes. Wo sind die 355 anderen Bytes geblieben?
Xem

Danke, es passt jetzt genau dazu. Sie können die zusätzlichen 10 Bytes im obigen Code sehen ( jc.BC""127").
Undichte Nonne

Wie gehst du mit dem Extrabit um? (Die gesamte Nachricht dauert 46370 Bytes + 7 Bits. Ihr letztes Byte kann eine zusätzliche Null erzeugen, die keine gültige Ausgabe darstellt.)
xem

2

Bash + WebP-Binärdatei, 11 + 15330 = 15341 Byte

Wie die Regeln besagen:

Ihre Mission ist es, ein Programm zu schreiben, das die gesamte 127 * 2921px-Nachricht anzeigt… oder als Bild (auf dem Bildschirm gezeichnet oder auf der Festplatte gespeichert ).

Es ist zulässig, bis zu 23 Binärdateien neben Ihren Programmen zu verwenden. Ihr Gewicht wird in Ihrer Punktzahl gezählt.

und

Alle Tricks sind erlaubt, mit Ausnahme der üblichen Schlupflöcher.

… 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):

cp b a.webp

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

cwebp -z 9 <downloaded input file> b

es erzeugt die Datei mit 15330 Bytes. Wenn jemand möchte, kann ich es irgendwo hochladen.

Hinweis: Die -zOption cwebpaktiviert den verlustfreien Komprimierungsmodus. 9ist die Druckfestigkeit (max).


OP-Autor gefällt das
xem

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.