La complexité de Kolmogorov d'une chaîne s est définie comme la longueur du programme P le plus court qui génère s. Si la longueur de P est plus courte que la longueur de s, alors s est dit compressible , sinon s est incompressible . La plupart des cordes sont incompressibles ...
Écrivez le programme le plus court qui génère cette chaîne (sans espaces et sans retours à la ligne):
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
La sortie devrait ressembler à:
d9a6b63356a7954b29b0ac7f2aaa6d19b84b4cf8b62aac95a14b4e...7294
Remarque: aucune entrée utilisateur n'est autorisée, ni accès Web, ni bibliothèques (sauf celle requise pour l'impression de la sortie).
Edit I: la séquence semble aléatoire ... mais elle s'avère être très compressible en manipulant un peu de nombres premiers ...
Edit II: Bravo! Je vais revoir les réponses dans les prochaines heures, puis attribuer la prime. Voici mon idée sur la façon dont cela pourrait être résolu:
- Si vous essayez de compresser les données, vous n'allez pas loin ...
- Sur Internet, vous pouvez trouver l' Encyclopédie en ligne (bien connue?) Des séquences entières (OEIS);
- essayer les premiers chiffres hexadécimaux
d9, a6, b6, 33, ...
(ou leur représentation décimale) ne donne aucun résultat; - mais si vous convertissez les nombres en binary (
1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0
) et les recherchez sur OEIS, vous obtenez ce résultat . - Comme l'a noté Claudiu, j'ai également donné un petit indice dans la question (Edit I ci-dessus) ... :-)
Le gagnant est : Peter Taylor (GolfScript, 50), avec une mention spéciale pour Claudiu (Python, 92), le premier qui l'a "résolu".
la source
Réponses:
GolfScript (50 octets)
Étant donné que tout le monde révèle maintenant son code, je vais également anticiper la demande d'OP de désobscurcir:
Vue d'ensemble de la dissection
38200,{:x,{)x\%!},,2=},
4/
p
pourp&2 != 0
, et faire une base-2 à la conversion de base-16:{3\{2&!!1$++}/.57>39*+}%
(c'est là que les astuces intéressantes sont)+
Dissection plus détaillée de la conversion de base
Étant donné une pile contenant une chaîne vide et une liste de nombres premiers, nous devons effectuer deux conversions:
Il existe de nombreuses façons tout aussi longues de faire 1; par exemple
ou même
Pour 2, l'approche évidente est
Mais base est un long mot, et comme 16 = 2 4, nous pouvons facilement enregistrer quelques caractères avec
Maintenant, le gaspillage le plus évident est les 18 caractères consacrés à cette chaîne. Nous voulons juste une fonction du chiffre au code ASCII. Nous voulons mapper
0
sur'0' = 48
, ...,9
sur'9' = 57
,10
sur'a' = 97
, ...15
sur'f' = 102
.Mais maintenant, jetez dans le mélange une interdiction
base
. Nous devons le mettre en œuvre nous-mêmes. La mise en œuvre évidente (dans ce sens, la plus simple) est qu'ilk base
s'agit d'un pli{\k*+}*
. L'alternative un peu plus longue est une itération simple, qui a besoin d' un cas de base:0\{\k*+}/
. La base 2 est légèrement spéciale:1$++
équivaut à\2*+
pour la même longueur, et j'ai adopté cette approche.Les deux sont plus longs que les 5 caractères
2base
, mais comme nous parcourons maintenant les valeurs, nous pouvons tirer dans la partie 1 pour avoir une seule boucle. Nous remplaçonsavec
pour une belle économie de 1 caractère, ou
pour une perte de 1 caractère.
Mais bien que cette perte de 1 caractère ressemble à un pas en arrière, considérez ce qui arrive à ce 0. Il est multiplié par 16 et ajouté à la sortie de conversion de base. Et la dernière chose que nous faisons est d'ajouter un multiple de 16 à la sortie. Nous pouvons donc combiner les deux comme
Le joint le plus court et l'intelligence bonus le rendent plus intéressant.
la source
base
? Toutes les autres solutions utilisent un équivalent (utilisations de la minehex
, celle de C utiliseprintf("%x")
, utilisations de haskellshowHex
)base
est en fait plus longue que celle-ci, car j'ai fait la plupart de l'optimisation après avoir précisé que je ne pouvais pas l'utiliser.base
me donne une valeur de 0 à 15, il a donc encore besoin de travail pour se convertir0-9a-f
. Je pourrais revisiter l'utilisationbase
à un moment donné, mais pas ce soir.Python, 92 caractères
Ici, c'est mesdames et messieurs, le code lui-même!
Marzio a laissé un indice intelligent en disant que "il se révèle être très compressible peu de nombres premiers". J'étais sûr que le "petit" n'était pas en italique par accident, alors j'ai converti la chaîne hexadécimale en bits et j'ai essayé de trouver des modèles. Je pensais qu'au début, il représentait tous les nombres premiers sous forme de bits et les concaténait ensemble, mais cela n'a pas fonctionné. Alors peut-être en ne prenant que quelques chiffres, ou en supprimant tous les zéros dans la chaîne de bits - toujours non. C'est peut-être une chaîne de bits du bit le moins significatif des premiers nombres premiers? Pas assez. Mais finalement, j'ai trouvé celui qui a fonctionné - c'est une chaîne de bits du deuxième bit le moins significatif des premiers nombres premiers cependant nombreux.
Donc, mon code fait exactement cela: générer juste assez de nombres premiers, prendre le deuxième bit de each (
i/2%2
), les concaténer comme une chaîne binaire, puis le convertir en base-10 (int(..., 2)
) puis en base-16 (hex(...)
).la source
Haskell, 105
Hachage SHA1:
a24bb0f4f8538c911eee59dfc2d459194ccb969c
Sortie:
Modifier: Code:
J'ai raté la règle de ne pas utiliser de fonctions de bibliothèque, sauf pour l'impression (putStr). Je suppose que les opérateurs mathématiques, bien qu'ils soient techniquement des fonctions, sont autorisés.
la source
C,
136116109 109103 caractèresOK alors, voici mon effort:
la source
printf
renvoie le nombre de caractères écrits, qui est toujours non nul ici, vous pouvez utiliser!printf(...)
au lieu deprintf(...)*0
pour enregistrer un caractère.JS, 764
si nous considérons cette chaîne comme base64, nous pouvons avoir une version plus petite en utilisant la version non-base-64-ed:
Mais je pense que l'auteur veut plutôt que nous trouvions la logique derrière cette chaîne non aléatoire.
la source
Mathetmatica - 56
Le mystère est déjà résolu, il suffit donc de mettre en œuvre l'idée
la source
J - 46 car
Ne me dérange pas, je connecte juste le J golf ici pour la postérité. Ce n'était pas assez intelligent pour comprendre l'astuce.
A expliqué:
p:i.1007 4
- Créez une matrice de 1007 lignes et 4 colonnes des nombres entiers à partir de 0, puis prenez les nombres premiers correspondant à ces nombres entiers. Oui,p:
est un J intégré. Oui, nous manquons de quatre nombres premiers.2|<.-:
- Divisez par deux chaque nombre (-:
), posez-le au sol (<.
) et prenez ce module 2 (2|
). C'est la même chose que de prendre le bit significatif suivant.#.
- Convertissez chaque ligne du résultat de la base 2 en un entier. Cela nous donne 1007 numéros de 0 à 15 inclus.'0123456789abcdef'{~#.
- Prenez chaque ligne de cette matrice de bits comme binaire pour un nombre, et utilisez ce nombre pour sélectionner dans la liste des chiffres hexadécimaux. Cela convertit tous les quatre bits en hexadécimal.1!:2&4
- L'interpréteur J a un problème avec la sortie de chaînes de plus de 256 caractères, nous devons donc envoyer ces données directement à stdout. Vous en gagnez un peu, vous en perdez un peu.4[
- Enfin, jetez le résultat de1!:2
et à la place, sortez les 4 manquants de la sortie. Nous faisons cela parce que c'est plus court que d'inclure ces quatre derniers nombres premiers et de retourner un résultat vide ici.la source
JS, 503
Suivant l'idée de @xem:
la source
Mathematica, 55
Testé sur Mathematica 8. Cela fait appel à deux observations:
FromDigits
ne vérifie pas réellement la plage des chiffres donnés, donc si vous l'appliquez à une liste du formulaire,{2,0,2,2,0,...}
vous obtenez simplement deux fois le résultat comme si vous vous y étiez appliqué{1,0,1,1,0,...}
. Mais c'est exactement la forme générée parBitAnd
ing les nombres premiers avec 2.la source