Basé sur cette question Math.SE ; numéro copié de cette réponse . Nombre à l’origine d’ une vidéo Numberphile , bien sûr.
Votre tâche consiste à générer le nombre premier à 1350 chiffres suivant:
888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888111111111111111111111111888888111111111111111111111111888888111111811111111118111111888888111118811111111118811111888888111188811111111118881111888888111188811111111118881111888888111888811111111118888111888888111888881111111188888111888888111888888111111888888111888888111888888888888888888111888888111888888888888888888111888888111888888888888888888111888888811188888888888888881118888188811188888888888888881118881188881118888888888888811188881118888111888888888888111888811111888811118888888811118888111111188881111111111111188881111111118888111111111111888811111111111888811111111118888111111111111188881111111188881111111111111118888811118888811111111111111111888881188888111111111111111111118888888811111111111111111111111888888111111111111111111111111118811111111111111111111111111111111111111111111062100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
Vous pouvez éventuellement inclure des nouvelles lignes dans la sortie.
Règles
- Ceci est kolmogorov-complexité , donc pas d'entrée.
- Votre programme doit être terminé en une heure sur un ordinateur standard. S'il est proche, j'utiliserai le mien à des fins de test. Si votre programme dure plus d'une minute ou ne se termine pas sur TIO, veuillez indiquer l'heure sur votre ordinateur.
- C'est du code-golf , donc le code le plus court, en octets, gagne.
Réponses:
Gelée ,
7471696866 octetsEssayez-le en ligne!
Comment ça marche
Le littéral
“©ạ-3ṗÇñ"ỤḍV8żṢ?ḤsMVE[,Ṃƭ"ḞÇsẇʂ(ụFsẠʂẆŀṣ’
remplace tous les caractères par leurs points de code dans la page de code de Jelly et interprète le résultat comme un nombre (bijectif) base-250, donnant le nombre entier suivant.Ensuite,
ḃ19
convertit ce nombre en base bijective 19, donnant le tableau de chiffres suivant.Maintenant,
ĖŒṙ
énumère les chiffres et effectue le décodage de longueur d’exécution, produisant le tableau suivant.Ensuite,
ị⁾81
indexe dans la chaîne 81 , en remplaçant les nombres impairs par le caractère 8 , le nombre pair par le caractère 1 . Ensuite,s30
divise le résultat en morceaux de longueur 30. En affichant un morceau par ligne, le résultat se présente comme suit.Maintenant,
m0
concatène le tableau de morceaux avec une copie inversée de lui-même. Ensuite,Z
compresse le résultat, en transposant des lignes et des colonnes.0
est un nilad imparable. Le résultat précédent est donc imprimé (sans sauts de ligne) et la valeur de retour est définie sur 0 .62
est un autre nilad imparable, le résultat d'avant ( 0 ) est imprimé et la valeur de retour est définie sur 62 .ȷ446
est encore un autre nilad imparable. 62 est imprimé et la valeur de retour est fixée à 10 446 .Enfin,
‘
incrémente le résultat. Le résultat final ( 10 446 + 1 ) est imprimé à la fin du programme.la source
[8, 1]
... Oh, c'est intelligent! Je vole ce truc j'espère que ça ne vous dérange pas :))) et puis oui ajoutez tout ça bizarre 06210..01. nice :)SOGL V0.12 ,
81787573 octetsEssayez-le ici!
Explication:
la source
Gelée , 136 octets
Essayez-le en ligne!
Explication (numéros abrégés)
-121 octets grâce à Dennis utilisant des
“...’
littéraux au lieu de nombres normauxla source
“...’
les littéraux économisent beaucoup d'octets. tio.run/…0;6;2;1;
semble terriblement verbeux.Gelée ,
133 8473 octetsEssayez-le en ligne! (footer formate le nombre décimal avec les dimensions qui donnent le blason).
Comment?
Une forme codée de longueur binaire d'un format binaire du côté gauche du blason
8
et1
jusqu'à la ligne avant celle commençant0621
par celle0621
indiquée, puis multipliée par 10 446 et incrémentée.la source
Charbon de bois ,
10710498968779 octetsEssayez-le en ligne! Lien vers le code détaillé pour une explication
la source
Proton , 368 octets
Essayez-le en ligne!
la source
Ruby , 180 octets
Essayez-le en ligne!
178 octets + 2 octets pour
-Kn
(force le codage ASCII.)43 caractères généralement non imprimables entre les premières citations. Hexdump:
Comment?
Tout le monde était en train de coder la durée, donc je voulais essayer quelque chose de différent.
La version "image" formatée du nombre premier peut être séparée en deux parties: une grille de 8 et 1 de 30x30, et une deuxième section composée principalement de zéros pouvant être codés en dur. En se concentrant sur la première partie, nous observons que cette position est symétrique au centre. Si nous pouvons produire la moitié gauche, nous ne pouvons imprimer que la moitié de chaque ligne avec son envers.
La moitié d'une ligne est composée de 15 caractères. Si nous remplaçons les 8 par des zéros, chaque ligne peut être interprétée comme un nombre binaire de 15 bits. De manière pratique, la distance d'édition entre chaque ligne consécutive est généralement faible. J'ai donc décidé d'implémenter ma solution en stockant la première ligne
s
(888888888888888
qui devient juste 0) et en appliquant une série d'opérations de retournement de bitss
, en imprimant le résultat à chaque fois. .Comme chaque ligne a une longueur de 15 bits, j'ai codé ces opérations sous forme de chiffres hexadécimaux - par exemple, si l'opération est
b
(ou 11), nous retournons le bit 11. Certaines lignes diffèrent de plus d'un bit, elles nécessitent donc une chaîne hexadécimale. chiffres. Il nous reste un peu (f
) afin que nous puissions l’utiliser comme délimiteur entre ces chaînes et comme valeur "ne rien faire". Exemple ci-dessous (vous pouvez voir ces lignes dans le post référencé dans la question):Pour mettre tout cela ensemble, nous encoderions
0123456789ab
, puis nous séparerions avecf
, ne ferions rien avecf
, alors5
. Cela fonctionne parce que nous allons faire.split(?f)
plus tard pour obtenir chaque ensemble d'opérations par ligne, ce qui donnera["0123456789ab", "", "5"]
, et""
sera un no-op.La différence entre les lignes 3 et 4 ci-dessus est de loin le plus long ensemble de modifications, et la distance de modification entre deux lignes consécutives est généralement de 0 à 2; je dirais donc que cet encodage est relativement peu coûteux, même si je suis sûr qu'il peut Soyez améliorés.
La totalité de la chaîne encodée finit par être
fff0123456789abff5f6f7ff8f4f3f012fff8bfef7af69df458cf01237bf6af59f48f237f16f045f3f12f0
(86 octets), ce qui donnera la grille 30x30 entière. Mais nous n'avons pas encore fini ...Les chiffres hexadécimaux peuvent être représentés par 4 bits (
b
->1100
, etc.). Cela signifie que si nous voulons coder notre chaîne 4 bits à la fois plutôt que d'utiliser des octets, nous pouvons couper la longueur de la chaîne de moitié. C'est donc ce que j'ai fait - l'hexdump montre la chaîne représentée dans 43 octets. Après cela, il ne reste plus qu'à utiliser la nifty String # unpack de Ruby avecH*
(interpréter comme chaîne hexadécimale, le gros doigt en premier) pour développer la chaîne de 43 octets dans la version à 86 octets que nous connaissons et adorons, et effectuer une boucle sur chaque ensemble d'opérations renverser des bits - pour notre chaîne stockées
et une opération quec
nous effectuonss ^ 2**c.to_i(16)
pour renverser le bit correspondant.Une fois que chaque série de modifications est terminée, nous complétons le fichier binaire résultant à 15 bits, commutons tous les 0 à 8, puis imprimons le résultat et l'inverse. Comme indiqué précédemment, la partie du numéro située après la grille 30x30 peut être codée en dur, nous le faisons donc
puts'0621'+?0*445+?1
.La chaîne encodée finale n'a aucune possibilité de travailler sur TIO, la version de TIO utilise donc des échappements, qui fonctionnent toujours mais sont plus longs.
la source
Python 2 ,
760523329205196 octets-237 octets grâce à Stephen. -124 octets grâce à Jonathan Frech.
Essayez-le en ligne!
la source
8
et1
et en combinant621
621
. Merci!CJam,
532412340231210209 octetsEssayez-le en ligne
L'encodage de longueur de plage a été étendu à partir de la base 92 (la base 250 a conduit à des caractères multi-octets, donc elle a dû être ajustée). En outre,
4341089843357287864910309744850519376
est étendu à partir de la base 92 et converti en binaire. Un 1 signifie que la longueur de la plage est deux chiffres, 0 signifie qu'il s'agit d'un chiffre. Par exemple, les 4 premiers chiffres de la représentation binaire sont 1101 car les quatre premières exécutions sont[93,8],[24,1],[6,8],[24,1]
(93 8, 24 1, etc.).la source
JavaScript,
454450332207204 octets-4 octets grâce à Stephen. -125 octets grâce à Shaggy et Dom Hastings.
Il y a un bateau de non-imprimables dans cette réponse, alors voici un hexdump:
la source
+'1'
comme c'est déjàString
et+'0621'
peut être+0+621
![...`]
me rend tellement fouJavaScript (ES6),
206205204203198 198197194 octetsJe suis venu avec cela pendant que je travaillais sur la solution de i cri everytim dit que c’était suffisamment différent pour justifier une publication autonome.
Ceci inclut une charge de fichiers non imprimables entre le
]
et le,
. Suivez donc le lien TIO ci-dessous pour le visualiser avec des échappements Unicode (chaque séquence de\u
4 chiffres compte pour 1 octet).Essayez-le en ligne
la source
MATLAB / Octave ,
319318 octetsCeci est ma première tentative à ce défi. Encore un peu volumineux et il existe probablement des moyens plus efficaces de le faire, mais je pensais le publier de toute façon, car la méthode était plus intéressante que la simple compression.
Essayez-le en ligne!
La méthode utilisée ici consiste à utiliser un schéma de tri Run-Length-Encoding.
Nous commençons avec le numéro d'origine et comptons le nombre de chiffres consécutifs. Celles-ci sont écrites dans le résultat ci-dessous sous la forme du compte suivi directement du chiffre (espace séparé pour plus de clarté).
Si l'une des valeurs est supérieure à 95, nous la scindons en plusieurs morceaux de 95 ou moins - cela ne se produit que pour les 445 0 qui deviennent quatre ensembles de 95 0 et un ensemble de 65 0. Nous complétons également les nombres inférieurs à 10 avec un 0 pour que tous les éléments aient trois caractères. Cela donne avec les espaces supprimés:
Avec le recul, à ce stade, j’aurais pu franchir cette étape avant de fusionner le tout, mais c’est que vous vivez et apprenez. Nous faisons quelque chose d'intelligent qui consiste à prendre le nombre pour chaque groupe (2 chiffres) et nous en ajoutons 31. Comme ils sont tous <96, le nombre obtenu est la valeur ASCII d'un caractère imprimable (32 à 126). Nous donnant des comptes de:
Après un peu de remodelage dans MATLAB pour le rendre plus favorable au décodage, puis des
'
caractères d' échappement avec''
(sinon, MATLAB divise les littéraux de chaîne), nous nous retrouvons avec la chaîne intelligente:C'est la racine du code. Dans le code, tout ce que je fais alors est de remodeler le tableau en une chaîne 2D avec 128 paires de caractères. Pour chaque paire, le premier caractère est soustrait de 31, puis le deuxième caractère est affiché autant de fois.
Le résultat est le nombre premier d'origine:
Modifications:
la source
05AB1E , 76 octets
Essayez-le en ligne!
J'ai volé ça à Dennis:
A noté qu'il alterne toujours entre 8 et 1, j'ai donc compté les longueurs de chaque manche (Base 20):
Tout réuni et converti en un entier de base 10:
Le comprime plus loin en base 255:
Ensuite, après avoir créé le bit compressé ... Il ne reste plus qu’à le manipuler.
Sortie finale:
la source
C (gcc) , 277 octets
J'ai l'impression que cette ficelle pourrait être raccourcie d'une manière ou d'une autre.
Essayez-le en ligne!
la source
Perl 5 , 307 octets
Essayez-le en ligne!
la source
Bubblegum , 88 octets
Essayez-le en ligne!
la source
Ruby , 194 octets
La partie supérieure est codée RLE, le reste est simplement codé en dur.
Essayez-le en ligne!
la source
Kotlin , 339 octets
Essayez-le en ligne!
la source
CJam (
10881 octets)Démo en ligne
Dans le cas où l'encodage de caractères obéit à ce qui précède, ici, il est encodé en xxd:
La séquence initiale de 8 et de 1 est divisée en une moitié gauche et une longueur codée sous la forme de longueurs de séquences alternées. Les séries de plus de 24 sont divisées en séries de 24 au maximum, séparées par des séries de 0, afin que les longueurs puissent être codées en base 25 puis en base 256 pour les compresser.
la source
JavaScript (ES2017), 287 octets
Utilise une approche légèrement différente de la réponse de @icrieverytim . -10 octets grâce à la suggestion de @Shaggy d'utiliser à la
replace
place dematch
!la source
/// , 260 octets
Essayez-le en ligne!
Rien de très intéressant, juste un peu de compression.
la source
Mathematica, 192 octets
Voir: http://reference.wolfram.com/language/ref/Compress.html
la source
Python 2 ,
191190188 octetsEssayez-le en ligne!
Même principe que ma réponse ici
la source