Die Kolmogorov-Komplexität eines Strings s ist definiert als die Länge des kürzesten Programms P, das s ausgibt. Ist die Länge von P kürzer als die Länge von s, so spricht man von komprimierbarem s, andernfalls ist s inkomprimierbar . Die meisten Saiten sind inkompressibel ...
Schreiben Sie das kürzeste Programm, das diesen String ausgibt (ohne Leerzeichen und ohne Zeilenumbruch):
d9 a6 b6 33 56 a7 95 4b 29 b0 ac 7f 2a aa 6d 19 b8 4b 4c f8 b6 2a ac 95
a1 4b 4e a5 9d b3 e7 c9 4c 49 59 ec 94 b3 aa 6c 93 8f 11 5a 4d 39 75 82
ec ea 24 cc d3 2d c3 93 38 4e b7 a6 0d d2 b5 37 23 54 ad 1b 79 aa 6e 49
55 52 94 5a a7 3a 6a e9 e4 52 cd 2d 79 ad c6 12 b5 99 5b b4 76 51 17 4e
94 f3 9a a2 e7 15 6a 55 14 4d 4e 4a a3 5c 2f ab 63 cc b5 a6 a4 92 96 8a
2e c3 d8 88 9b 8c a9 16 f5 33 22 5b a2 e2 cc 1b 27 d4 e8 db 17 a4 39 85
ca aa 5b 4f 36 24 d3 c6 f6 94 ad d7 0f 71 24 e1 b1 c5 ef 65 35 6c 8d d7
1a 87 1e 25 df 5d c0 13 b2 6f 5a 57 28 98 bd 41 66 04 ed a2 52 c9 ac 83
b3 6c 56 7e d1 c6 cc 53 4a 62 c5 59 a9 b2 d4 af 22 a5 a9 f4 b2 99 23 32
f8 fb ae 48 6a 8a 9a b5 46 7a 36 59 9f 92 d3 25 b5 19 bd 8a 4a 49 62 a5
e4 59 fb e5 ba a2 35 dd a9 36 1d a9 c9 69 89 77 6a b2 34 2d 1d 22 61 c5
c2 66 1c e2 76 74 52 a5 d9 84 b9 8a a6 b5 14 ec 29 58 b2 bc 96 16 16 48
f5 c5 bd 2f 32 1b 3d 4f 4b 2e b2 6b 9a d9 32 a4 4b 5c bc 92 b7 b3 26 39
fa 42 2d 64 ed 1a 79 49 4c a3 b7 85 b2 a6 e2 8c d9 55 90 e1 a8 87 4b 60
a6 e1 ba c4 bb ec 32 39 76 90 a6 b4 c6 65 79 61 91 aa 3d 54 b7 18 3d 15
4b 06 db 30 8a 4d 4a a1 35 75 5d 3b d9 98 ac 55 5b 10 dd b3 e2 cc f1 5e
b3 2b 53 90 b6 ee 2b ac 8f 88 8d 95 5a 75 df 59 2d 1c 5a 4c e8 f4 ea 48
b9 56 de a0 92 91 a9 15 4c 55 d5 e9 3a 76 8e 04 ba e7 b2 aa e9 ab 2a d6
23 33 45 3d c4 e9 52 e3 6a 47 50 ba af e4 e5 91 a3 14 63 95 26 b3 8b 4c
bc aa 5a 92 7a ab ad a6 db 53 2e 97 06 6d ba 3a 66 49 4d 95 d7 65 c2 aa
c3 1a 92 93 3f ca c2 6c 2b 37 55 13 c9 88 4a 5c 62 6b a6 ae cc de 72 94
Die Ausgabe sollte folgendermaßen aussehen:
d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4e...7294
Hinweis: Es sind keine Benutzereingaben, kein Webzugriff und keine Bibliotheken zulässig (außer denen, die zum Drucken der Ausgabe erforderlich sind).
Edit I: Die Sequenz scheint zufällig zu sein ... aber es stellt sich heraus, dass sie sehr komprimierbar ist, wenn man ein bisschen Primzahlen verarbeitet ...
Edit II: Gut gemacht! Ich werde die Antworten in den nächsten Stunden überprüfen und dann das Kopfgeld zuweisen. Dies ist meine Idee, wie es gelöst werden könnte:
- Wenn Sie versuchen, die Daten zu komprimieren, gehen Sie nicht weit weg ...
- Im Internet finden Sie die (bekannte?) Online-Enzyklopädie der Integer-Sequenzen (OEIS);
- Das Ausprobieren der ersten hexadezimalen Ziffern
d9, a6, b6, 33, ...
(oder ihrer dezimalen Darstellung) führt zu keinem Ergebnis. - Wenn Sie jedoch die Zahlen in binary (
1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0
) konvertieren und sie in OEIS suchen, erhalten Sie dieses Ergebnis . - Wie von Claudiu angemerkt, habe ich auch einen kleinen Hinweis in der Frage (Edit I oben) gegeben ... :-)
Der Gewinner ist : Peter Taylor (GolfScript, 50), mit einer besonderen Erwähnung für Claudiu (Python, 92), der es als erster "gelöst" hat.
quelle
Antworten:
GolfScript (50 Bytes)
Da jetzt alle anderen ihren Code enthüllen, werde ich auch die Aufforderung von OP, die Verschleierung aufzuheben, vorwegnehmen:
Übersicht Dissektion
38200,{:x,{)x\%!},,2=},
4/
p
zup&2 != 0
und führen Sie eine Konvertierung von Basis 2 zu Basis 16 durch:{3\{2&!!1$++}/.57>39*+}%
(hier sind die interessanten Tricks)+
Detailliertere Aufteilung der Basisumwandlung
Bei einem Stapel mit einer leeren Zeichenfolge und einer Liste von Primzahlen müssen zwei Konvertierungen durchgeführt werden:
Es gibt viele gleich lange Möglichkeiten 1; z.B
oder auch
Für 2 ist der offensichtliche Ansatz
Aber base ist ein langes Wort, und da 16 = 2 4 , können wir mit leicht ein paar Zeichen sparen
Die offensichtlichste Verschwendung sind jetzt die 18 Zeichen, die dieser Saite gewidmet sind. Wir wollen nur eine Funktion von Ziffern zu ASCII-Code. Wir wollen Karte
0
zu'0' = 48
, ...,9
auf'9' = 57
,10
zu'a' = 97
, ...15
zu'f' = 102
.Aber jetzt werfen Sie in die Mischung ein Verbot auf
base
. Wir müssen es selbst implementieren. Die naheliegende Implementierung (in dieser Richtung die einfache)k base
ist eine Falte{\k*+}*
. Die etwas längere Alternative ist eine einfache Iteration, die einen Basisfall benötigt:0\{\k*+}/
. Die Basis 2 ist etwas Besonderes:1$++
entspricht\2*+
der gleichen Länge, und ich habe diesen Ansatz gewählt.Beide sind länger als die 5-Zeichen
2base
, aber da wir jetzt über die Werte iterieren, können wir in Teil 1 eine einzelne Schleife erstellen. Wir ersetzenmit
für eine schöne 1-Zeichen-Einsparung oder
für einen 1-Zeichen-Verlust.
Aber obwohl dieser 1-Zeichen-Verlust wie ein Rückschritt aussieht, überlegen Sie, was mit dieser 0 passiert. Sie wird mit 16 multipliziert und zum Ausgangssignal der Basisumwandlung addiert. Und das Letzte, was wir tun, ist, der Ausgabe ein Vielfaches von 16 hinzuzufügen. So können wir die beiden als kombinieren
Das kürzeste Gelenk und die zusätzliche Cleverness machen es interessanter.
quelle
base
? Alle anderen Lösungen verwenden ein Äquivalent (Mine verwendethex
, die C verwendetprintf("%x")
, Haskell verwendetshowHex
)base
länger als dieser, weil ich den größten Teil der Optimierung durchgeführt habe, nachdem ich klargestellt hatte, dass ich ihn nicht verwenden konnte.base
gibt mir einen Wert von 0 bis 15, so dass noch einige Arbeit zum Konvertieren benötigt wird0-9a-f
. Ich werde vielleicht irgendwann wiederkommenbase
, aber heute Abend nicht.Python, 92 Zeichen
Hier ist es meine Damen und Herren, der Code selbst!
Marzio hinterließ einen klugen Hinweis: "Es stellt sich heraus, dass es sehr komprimierbar ist, ein bisschen Primzahlen zu verarbeiten." Ich war mir sicher, dass das "kleine Bit" nicht aus Versehen kursiv geschrieben wurde, also habe ich die Hex-Zeichenfolge in Bits konvertiert und versucht, Muster zu finden. Zuerst dachte ich, er würde alle Primzahlen als Teile darstellen und zusammenfügen, aber das hat nicht geklappt. Dann nehmen Sie vielleicht nur ein paar Ziffern oder lassen alle Nullen in der Bitfolge fallen - immer noch nein. Vielleicht ist es eine Bitfolge des niedrigstwertigen Teils der ersten Primzahlen? Nicht ganz. Aber irgendwann fand ich die, die funktionierte - es ist eine Bitfolge des zweitniedrigstwertigen Bits aus den ersten, aber vielen Primzahlen.
Mein Code macht genau das: Erzeuge gerade genug Primzahlen, nehme das zweite Bit von jeder (
i/2%2
), verkette sie als binäre Zeichenkette, konvertiere sie dann in base-10 (int(..., 2)
) und dann in base-16 ().hex(...)
).quelle
Haskell, 105
SHA1-Hash:
a24bb0f4f8538c911eee59dfc2d459194ccb969c
Ausgabe:
Bearbeiten: Code:
Ich habe die Regel übersehen, keine Bibliotheksfunktionen außer dem Drucken (putStr) zu verwenden. Ich würde annehmen, dass mathematische Operatoren, obwohl sie technisch funktionieren, erlaubt sind.
quelle
C,
136116109103 ZeichenOK, hier ist meine Anstrengung:
quelle
printf
die Anzahl der geschriebenen Zeichen zurückgegeben wird, die hier immer ungleich Null ist, können Sie!printf(...)
anstelle eines Zeichens ein Zeichenprintf(...)*0
speichern.JS, 764
Wenn wir diesen String als base64 betrachten, können wir eine kleinere Version mit der un-base-64-ed-Version haben:
Aber ich denke, der Autor möchte, dass wir stattdessen die Logik hinter dieser nicht zufälligen Zeichenfolge finden.
quelle
Mathetmatica - 56
Das Rätsel ist schon gelöst, also einfach die Idee umsetzen
quelle
J - 46 Zeichen
Es macht mir nichts aus, nur den J-Golf hier für die Nachwelt zu protokollieren. War nicht klug genug, um den Trick herauszufinden.
Erklärt:
p:i.1007 4
- Erstellen Sie eine 1007-Zeilen-, 4-Spalten-Matrix der Ganzzahlen aus 0 und nehmen Sie dann die Primzahlen, die diesen Ganzzahlen entsprechen. Ja,p:
ist ein J eingebaut. Ja, wir haben vier Primzahlen zu wenig.2|<.-:
- Halbiere jede Zahl (-:
), lege sie auf den Boden (<.
) und nimm das Modulo 2 (2|
). Dies ist dasselbe, als würde man das nächstnotwendige Bit nehmen.#.
- Konvertieren Sie jede Zeile des Ergebnisses von Basis 2 in eine Ganzzahl. Dies gibt uns 1007 Zahlen von 0 bis einschließlich 15.'0123456789abcdef'{~#.
- Nehmen Sie jede Zeile dieser Bitmatrix als Binärzahl für eine Zahl und wählen Sie diese Zahl aus der Liste der Hexadezimalziffern aus. Dies konvertiert alle vier Bits in das Hex.1!:2&4
- Der J-Interpreter hat ein Problem mit der Ausgabe von Zeichenfolgen, die länger als 256 Zeichen sind. Daher müssen wir diese Daten direkt an stdout senden. Du gewinnst etwas, du verlierst etwas.4[
- Verwerfen Sie abschließend das Ergebnis von1!:2
und geben Sie stattdessen die fehlenden 4 aus. Wir tun dies, weil es kürzer als die letzten vier Primzahlen ist und hier ein leeres Ergebnis zurückgibt.quelle
JS, 503
Folgende @xem Idee:
quelle
Mathematica, 55
Getestet auf Mathematica 8. Dabei werden zwei Beobachtungen verwendet:
FromDigits
überprüft den Bereich der angegebenen Ziffern nicht wirklich. Wenn Sie ihn also auf eine Liste des Formulars{2,0,2,2,0,...}
anwenden, erhalten Sie nur das Doppelte des Ergebnisses, als wenn Sie auf zutreffen{1,0,1,1,0,...}
. Aber das ist genau die Form, die von erzeugt wirdBitAnd
die Primzahlen mit 2 erzeugt wird.quelle