Die Arecibo-Nachricht ist eine interstellare Funknachricht von 1974, die grundlegende Informationen über Mensch und Erde enthält und an den Kugelsternhaufen M13 gesendet wird, in der Hoffnung, dass außerirdische Geheimdienste sie empfangen und entschlüsseln können ... Die Nachricht bestand aus 1.679 Binärziffern, ungefähr 210 Bytes ...
Die Zahl 1.679 wurde gewählt, weil es sich um ein Semiprime handelt (das Produkt aus zwei Primzahlen), das rechteckig in 73 Zeilen und 23 Spalten angeordnet ist. Die alternative Anordnung, 23 Zeilen mal 73 Spalten, erzeugt einen unverständlichen Zeichensatz (wie alle anderen X / Y-Formate).
Dies ist die Nachricht, bei der Farbe hinzugefügt wurde, um die einzelnen Teile hervorzuheben. Die eigentliche binäre Übertragung enthielt keine Farbinformationen.
Ihre Aufgabe ist es, die Arecibo-Nachricht in der im Bild gezeigten exakten 23x73-Anordnung auszugeben. Jedes dieser Ausgabeformate ist akzeptabel:
- Text, wobei ein Zeichen für Einsen und ein anderes für Nullen verwendet wird (unter Verwendung der üblichen Regeln für die Zeilentrennung)
- Ein 2D-Array mit zwei unterschiedlichen Werten
- Ein 23x73-Bild mit zwei unterschiedlichen Farben
- Ein ununterbrochener Strom von 1679 Elementen mit zwei unterschiedlichen Werten (dh eines der oben genannten Formate, aber flach).
- Eine 1679-Bit-Ganzzahl. Geben Sie die Bit- und Byte-Reihenfolge (Endianze) in Ihrer Lösung an.
Der Einfachheit halber finden Sie hier eine kopierfähige Version (auch eine Beispielausgabe im Textformat):
00000010101010000000000
00101000001010000000100
10001000100010010110010
10101010101010100100100
00000000000000000000000
00000000000011000000000
00000000001101000000000
00000000001101000000000
00000000010101000000000
00000000011111000000000
00000000000000000000000
11000011100011000011000
10000000000000110010000
11010001100011000011010
11111011111011111011111
00000000000000000000000
00010000000000000000010
00000000000000000000000
00001000000000000000001
11111000000000000011111
00000000000000000000000
11000011000011100011000
10000000100000000010000
11010000110001110011010
11111011111011111011111
00000000000000000000000
00010000001100000000010
00000000001100000000000
00001000001100000000001
11111000001100000011111
00000000001100000000000
00100000000100000000100
00010000001100000001000
00001100001100000010000
00000011000100001100000
00000000001100110000000
00000011000100001100000
00001100001100000010000
00010000001000000001000
00100000001100000000100
01000000001100000000100
01000000000100000001000
00100000001000000010000
00010000000000001100000
00001100000000110000000
00100011101011000000000
00100000001000000000000
00100000111110000000000
00100001011101001011011
00000010011100100111111
10111000011100000110111
00000000010100000111011
00100000010100000111111
00100000010100000110000
00100000110110000000000
00000000000000000000000
00111000001000000000000
00111010100010101010101
00111000000000101010100
00000000000000101000000
00000000111110000000000
00000011111111100000000
00001110000000111000000
00011000000000001100000
00110100000000010110000
01100110000000110011000
01000101000001010001000
01000100100010010001000
00000100010100010000000
00000100001000010000000
00000100000000010000000
00000001001010000000000
01111001111101001111000
Wenn Ihre Sprache aus irgendeinem Grund über eine integrierte Funktion für die Arecibo-Nachricht verfügt, können Sie diese integrierte Funktion möglicherweise nicht verwenden.
Viel Glück!
UPDATE: Ich habe die 05AB1E-Antwort akzeptiert, da es die erste war, die kürzer war als die ursprüngliche Nachricht. Lassen Sie sich dadurch nicht von neuen Lösungen abbringen.
UPDATE 2019-09-09: Die akzeptierte Antwort wurde auf eine neue 05AB1E-Antwort verschoben, da die vorherige 05AB1E-Antwort ungültig wird. Der gleiche Punkt gilt für das vorherige Update. neue lösungen sind weiterhin willkommen.
quelle
Antworten:
05AB1E , 182 Bytes
Probieren Sie es online! (verwendet
1
für 0 und0
für 1, wie in der Frage angegeben).Probieren Sie es online! (5 Bytes länger,
0
für 0 und1
für 1 wurden zur besseren Lesbarkeit neue Zeilen hinzugefügt).Der größte Teil des Codes ist eine Basis-255-Ganzzahl-Konstante N, der Rest ist ein Asymmetric Numeral System- Decoder, der hartcodierte Wahrscheinlichkeiten von 75% / 25% verwendet (die tatsächliche Häufigkeit von 0 beträgt 76,35%, was so nahe an 75% liegt, dass dies der Fall ist) würde nur 1,2 Bits in der Nutzlast einsparen, während die nette und runde 75% uns mehrere Bytes im Decoder einsparen lässt).
Hier ist der ANS-Encoder, der die Konstante generiert hat: Probieren Sie es online aus!
quelle
05AB1E ,
215210200 BytesDank Magic Octopus Urn 15 Bytes gespart
Probieren Sie es online! oder mit Zusätzlicher Formatierung
Base-255-codierte Trinary-Zeichenfolge, deren Vorkommen durch
0000
ersetzt wird2
.quelle
0000
mit2
von 9 weiterem Bytes. - pastebin.com/aZ6tHxjx für 201Java,
688 678 590 379361 BytesGibt eine Zeichenfolge zurück.
-10 Bytes durch Rückgabe des Rohdatenstroms (alte Antwort)
-88 Bytes durch Verwendung von 10er-Zahlen (danke @ceilingcat!)
-211 Bytes (ich wusste, dass es golfen werden kann!) Durch Verwendung einer Base-36-codierten BigInteger (danke @JollyJoker) !)
-18 Bytes durch Verwendung einer anderen codierten Ganzzahl (nochmals danke @JollyJoker)
Probieren Sie es online!
Erläuterung:
quelle
Jelly , 213 Bytes
Probieren Sie es online!
Ich habe mit der Huffman-Codierung herumgespielt, aber die Verbesserungen der Datengröße wurden durch den zusätzlichen Code aufgewogen. Als solches ist dies einfach eine Base-250-codierte Version der gewünschten Ausgabe. Die Ausgabe besteht aus einer Ganzzahl, die bei Dekodierung als bijektive Basis 2 die 1D-Liste von 1s und 2s ergibt. Vielen Dank an @Emigna für den Hinweis auf die Änderung der Regeln.
Probieren Sie es online aus - mit weiterer Dekodierung, um die Ausgabe zu demonstrieren!
Wenn eine konventionellere Binärcodierung bevorzugt wird, ist hier eine solche, die eine ganzzahlige Darstellung der invertierten Binärnachricht codiert. Das höchstwertige Bit der Ganzzahl steht für den Beginn der Nachricht.
quelle
Brainfuck,
236020081938 BytesProbieren Sie es online!
Ich werde das wahrscheinlich bald noch weiter Golf spielen.
quelle
Deadfish ~ ,
111510881084 BytesProbieren Sie es online!
Wenn jemand die Geduld hat, weiter Golf zu spielen, grüße ich Sie im Voraus. : P
-27 Bytes durch Drucken von 10s und 100s an den entsprechenden Stellen.
-4 Bytes durch Drucken von drei 1000 und einem 1001 in Zeile 3
quelle
Piet , 1763 codels
Gibt einen Strom von 0s und 1s aus (keine Zeilenumbrüche).
Codel Größe 1:
Codel Größe 4, zur leichteren Anzeige:
Erläuterung
Anmerkungen
Das Programm folgt einem spiralförmigen Pfad im Uhrzeigersinn von links oben in die Mitte. Die verstreuten schwarzen Blöcke, die in etwa den Diagonalen folgen, sind die Flusskontrolle. Hier ist die Spur von NPiet .
Ich arbeite seit dem Tag daran, an dem diese Herausforderung aufstieg, aber es hat ein bisschen gedauert, bis die Nachricht "geschrieben" wurde! Ich habe zuerst die letzten Schleifen und den Sentinel-Wert geschrieben und dann die Nachricht von der Mitte nach außen aufgebaut. (Da Piet immer von links oben mit der Ausführung beginnt, musste ich das Bild mischen und drehen, um übermäßige Leerzeichen zu vermeiden, aber es passte perfekt!)
Unterhaltsame Tatsache: Die Lauflängencodierung in Piet spart (von sich aus) keinen Platz. Es sind n Kodierungen einer Farbe erforderlich, um den Wert n auf den Stapel zu schieben , oder n Kodierungen verschiedener Farben, um so viele Einsen auf den Stapel zu schieben. Es ist also so oder so die gleiche Anzahl von Codels. Aber die größeren Zahlen, die RLE gibt, bedeuten, dass Sie arithmetische Tricks verwenden können (z. B. können Sie anstelle von 9 3 drücken, duplizieren und multiplizieren), um die Anzahl der Codels zu verringern, und witzig geformte Blöcke, um die verfügbaren Leerzeichen auszufüllen.
Ich war mir nicht sicher, wie ich die Punkte für Piet-Einträge zählen sollte. Ich fand einige, die alle Codels zu zählen scheinen, und andere, die explizit nur die aktiv verwendeten zählen. Ich habe sie alle gezählt. Das Ignorieren von weißen Codierungen (auch derjenigen, durch die sich das Programm niemals bewegt) ähnelt dem Ignorieren von Leerzeichen in einer typischeren Programmiersprache.
Oh, und ich habe erst jetzt (zwei Stunden nach dem Posten) gemerkt, dass ich das letzte bisschen Zeit damit verschwendet habe. Ich wollte die fast vollständig weiße letzte Zeile und Spalte abschneiden, also habe ich die Dinge herumgemischt ... einschließlich der schwarzen Flusskontrollblöcke. Die Bildränder funktionieren jedoch genauso wie bei Schwarz! Wenn ich mich nur daran erinnert hätte, hätte ich nicht so viel Zeit gebraucht, um über die Feinheiten von DPs und CCs zu rätseln ...
quelle
C # (Visual C # Interactive Compiler) ,
366332329319 ByteErsetzen Sie alle zu testenden Instanzen von
␀
mit\0
.Probieren Sie es online!
C # (Visual C # Interactive Compiler) , 305 Byte, 210 Zeichen
Das Gleiche gilt für oben, ersetzt
␀
mit\0
zu testen. Ausgabe alsIEnumerable<string>
.Probieren Sie es online aus! (Mit freundlicher Genehmigung von Jo King)
quelle
++
in12-i++%2
ist ein Nopp (zumindest hat es bei mir funktioniert, als ich es entfernt habe)Perl 6 , 368 Bytes
Probieren Sie es online!
Die lange Zeichenfolge ist die Nachricht als einzelne Base-36-Zahl (mit einem einzelnen vorangestellten 1-Bit, um die führenden Nullen zu erhalten), die dann zurück in binär konvertiert und jeweils 23 Bit gedruckt wird.
quelle
>>.say
und verwenden&{S/.//}
, um Bytes zu speichern. Haben Sie darüber nachgedacht, stattdessen eine andere Basis zu verwenden?Wolfram Language (Mathematica) , 383 Byte
Probieren Sie es online!
quelle
Node.js , 333 Bytes
Gibt eine Binärzeichenfolge mit 1.679 Zeichen zurück.
Probieren Sie es online! (mit formatierter Ausgabe)
JavaScript (ES8), 413 Byte
Gibt eine Binärzeichenfolge mit 1.679 Zeichen zurück.
Probieren Sie es online! (mit formatierter Ausgabe)
quelle
Bubblegum,
275236 BytesProbieren Sie es online!
quelle
Bash + GNU-Tools, 351 Bytes
TIO
quelle
MathGolf ,
223220 BytesProbieren Sie es online!
Erläuterung
quelle
L/n
in die Fußzeile verschieben, es sind also 220 Byte. Können durch Portierung der 05AB1E / Java-Antworten mehr Bytes gespart werden ( diese komprimierte Ganzzahl verwenden , in Base-3 konvertieren und alle2
s durch0000
s ersetzen )?2
zu♫░╞
? EDIT: Egal. Wie ich sehe, ist keine Basiskonvertierung (außer binär / hexadezimal) für die Konvertierung in Base-3 integriert?+
in die Fußzeile verschiebenPerl 5 , 460 Bytes
Probieren Sie es online!
quelle
Python 2 , 336 Bytes
Probieren Sie es online!
Gibt eine Folge von Bytes aus
quelle
Java (OpenJDK 8) , 364 Byte
Probieren Sie es online!
Erläuterung: Zuerst musste
n->new java.math.BigInteger(str,36).toString(2)
nur eine Radix-36-Zahl in eine Binärzahl konvertiert werden, aber dafür waren neun zusätzliche Zeichen für führende Nullen erforderlich. Dann kam mir die Idee, einige Nullen als Zwei zu codieren. Eine Länge von vier Nullen scheint die Länge der Basis 36 zu minimieren, son->new java.math.BigInteger(str,36).toString(3).replaceAll("2","0000")
In der Diskussion unter dieser Antwort finden Sie Informationen zum Bugfix für führende Nullen von @KevinCruijssen
quelle
[Python 2] , 345 Bytes
Ich habe die Länge von Strings von 0s als Byte ab chr (31) kodiert. Dann habe ich die restlichen 10101 als Binärzahlen von chr (70) bis chr (126) codiert. Binäre Zeichenfolgen, die nicht passten, wurden in kleinere Blöcke aufgeteilt.
Bearbeiten: Reduziert auf 326 Bytes. Danke Jo King
Bearbeiten: Ein Fehler im Code-Generator-Programm wurde behoben
Bearbeiten: Letzte Bearbeitung
quelle
o
einer Variablen speichern .Zsh , 577 Bytes
Probiere es online aus !!
Verwendete benutzerdefinierte Codierungslogik. Die Zeichenfolge
S
ist 421 Zeichen, könnte möglicherweise etwas mehr komprimiert werden. Buchstaben stehena-w
für wiederholte0
s. Zahlen stehen1-9
für wiederholte1
s. Buchstabenx y z
repräsentieren10 100 1000
jeweils.Vielleicht hätte ich es mit Byte-Pair-Codierung oder Ascii85 versuchen sollen .
quelle
Bash ,
702697 BytesProbieren Sie es online!
quelle
Ruby , 362 Bytes
Ganzzahl in Basis 36 geschrieben. Es gibt sicherlich eine effizientere Möglichkeit, die Ganzzahl zu komprimieren, z . B. mit
zlib
oderbase64
.Probieren Sie es online!
quelle
[C ++ (VC ++) (aber auch mit gcc getestet)], 585 Bytes
Probieren Sie es online!
ungolfed version (fehlt die Pause nach dem 1679. Element und geht bis zum 1680.):
als erklärung: ich habe die 73 zeilen der beispielausgabe zu einer langen zeile verkettet. Ich habe sie hexadezimal codiert, wobei die Bitreihenfolge msbfirst ist (mit diesem Programm https://github.com/Marc-Bender/longBinaryStreamToHex/releases/download/addedErrorCode-4/longBinaryStreamToHex.exe ). Ich habe die Ausgabe davon um ungefähr 70 verkürzt hexadezimale Ziffern, bei denen die Buchstaben 'G' - 'Z' als Zeichen verwendet werden, um die letzte Ziffer eine bestimmte Anzahl von Malen zu wiederholen (Z = 2mal, Y = 3mal ...), der Rest sollte für Code-Golfer relativ selbsterklärend sein . Missbrauch des Präprozessors zum Verkürzen von Schleifen, Missbrauch des
,
Operators und dergleichen.Das Ausgabeformat ist ein ununterbrochener Strom von 1679 0/1-Werten.
quelle
Perl 6 , 348 Bytes
Basiert auf Benjamin Urquharts Java-Lösung .
Verwendet einen geraden Stream aus 0 und 1 Zeichen. Der unten stehende Link enthält Code, um die Ausgabe zu verschönern.
Probieren Sie es online!
quelle
Tcl , 366 Bytes
Probieren Sie es online!
quelle
C ++ (mit Gnu-Bibliothek mit Mehrfachgenauigkeit), 359 Bytes
Dies gibt den String als eine Zeile aus. Es verwendet '1' für 0 und '0' für 1: /
Es liest einfach die eingebettete Zeichenfolge als Basis 62 und druckt sie als Basis 2.
Verwenden Sie
g++ -g arecibo.cpp -lgmp -lgmpxx
zum Kompilieren und Linkquelle
class_mpz
mitmpz_class
Perl 6 , 276 Bytes
Probieren Sie es online!
Ausgänge als Serie von 1679 0s und 1s. Sie können es in verschiedenen Zeilen haben, indem Sie
.comb(23)>>
vor demsay
hinzufügen .Erläuterung:
Ich kann wahrscheinlich Bytes sparen, indem ich die Ausgabe stattdessen als 1679-Bit-Ganzzahl verwende oder die Bit-Darstellung umkehre.
quelle
C ++ (gcc) , 748 Bytes
Probieren Sie es online!
Durch Ersetzen der am häufigsten verwendeten Teilzeichenfolge durch ein neues Zeichen, bis es sich nicht mehr lohnt
quelle
Python 3 , 331 Bytes
Probieren Sie es online!
quelle