Votre défi est d'écrire N extraits de code tel que, lorsque vous concaténer le premier K ≥ 1 ensemble, ils produisent le nombre K . Plus N est élevé , mieux c'est. Voici le hic: vous ne pouvez utiliser aucun caractère plus d'une fois dans vos extraits.
Règles
- Vous pouvez utiliser le même caractère plusieurs fois dans un (et un seul) extrait de code.
- Ces extraits doivent être concaténés dans l'ordre où ils sont présentés , sans en sauter aucun.
- Vous devez écrire au moins deux extraits.
- Tous les extraits doivent être dans la même langue.
- N'oubliez pas: les extraits ne doivent pas nécessairement être des programmes ou des fonctions complets, ni fonctionner seuls.
-1
est un extrait valide en Java, par exemple - Toutes les concaténations résultantes doivent produire la valeur K respective .
- Le gagnant est la personne ayant la valeur N la plus élevée. Le bris d'égalité est la durée globale du programme la plus courte en octets.
Exemple
Supposons que vos extraits étaient AD
, xc
, 123
et ;l
. Ensuite:
AD
devrait produire1
ADxc
devrait produire2
ADxc123
devrait produire3
- et
ADxc123;l
devrait produire4
.
Ce programme aurait un score de 4 .
number
code-challenge
source-layout
Conor O'Brien
la source
la source
1
et «2»?Réponses:
Python 3 , 1 112 056 extraits, 4 383 854 octets
Ceci est très similaire à la réponse Python 2 de @ WheatWizard . J'ai commencé à travailler sur ce sujet peu de temps avant qu'il ne soit publié, mais le tri des particularités de Python concernant les caractères non ASCII et les longues lignes a pris un certain temps. J'ai découvert que Python lit les lignes 8191 octets à la fois, et lorsque ces 8191 octets ne contiennent qu'une partie d'un caractère multi-octets, Python lance une SyntaxError .
Le premier extrait utilise un codage à partir du moins de caractères (distincts) pour l'intégralité de Turing .
Cette monstruosité construit simplement la chaîne suivante et l'exécute.
Les extraits suivants contiennent tous exactement un caractère. Les trois personnages sont
\n
,\r
et#
. Tous les caractères Unicode restants (à l'exception des substituts) suivent dans un ordre spécifique, ils s'alignent donc sur la limite de 8191 octets.Le script suivant génère les programmes appropriés pour l'entrée k entre 1 et 1112056 .
la source
Perl 5,
50 091151 extraits decodePremier extrait:
2e à 26e extraits:B
parZ
27e au 46e extraits: à
a
traversz
, à l'exclusion des caractères en "longueur"47e à 56e extraits:
0
par9
57e extrait:_
Les extraits restants sont les 50 105 caractères Unicode individuels que Perl considère comme des caractères «mots», à l'exclusion des 14 caractères mots distincts dans l'extrait initial, dans n'importe quel ordre.Eh bien, c'était une bonne idée, mais il s'avère qu'après une certaine longueur Perl vous donne une erreur "identifiant trop long". C'est le programme combiné le plus long que j'ai réussi à faire digérer par Perl:
La page de manuel perldiag indique que "les futures versions de Perl élimineront probablement ces limitations arbitraires" mais mon Perl 5.18 ne l'a pas fait.
Explication:
En mode non strict, Perl 5 interprète les chaînes de caractères non citées comme des "mots nus", les citant essentiellement pour vous automatiquement. Ils sont généralement mieux évités, mais ils aident certainement ici!
la source
a-z
extraits de code utiliseront très probablement les caractères de votre premier extrait de code.length("length(
.Python 2 , score 32
Avec des extraits suivants
B
,C
,D
, ...Y
,Z
,u
,v
,w
,x
,y
,z
.Dans une tournure d'ironie dramatique, Python 3 prend en charge les identificateurs Unicode, ce qui nous permettrait de devenir très stupide avec cette astuce - mais cela ne peut pas
print
sans parenthèses. Je pourrais aussi entasser des chiffres dans l'identifiant, mais je ne pense pas que cette approche soit très amusante pour en tirer plus.Essayez-le en ligne!
Python 2 , score 18, moins de triche
Essayez-le en ligne!
la source
JavaScript (ES6, V8 6.x),
5250298119526119638119683128781 extraits,88149147575179575631576121612789 octetsPlus loin, un extrait de pile qui génère le programme complet, l'évalue et crée un lien de téléchargement pour le fichier. Cet extrait continuera de générer de meilleures réponses car les versions ultérieures d'Unicode sont prises en charge par les nouvelles versions de JavaScript, qui ajoutent de nouveaux identifiants valides à la langue.
Utiliser ASCII uniquement
Explication
Cela utilise la technique de métaprogrammation de
Proxy
pour activer un piège de gestionnaire get sur l'objet et accéder au nom de la propriété sous forme de chaîne, en renvoyant l'identifiantlength / 2
comme valeur.Le premier extrait commençant par
new Proxy({},{get:(n,{length:e})=>e>>(e/e)}).nn
, chaque extrait supplémentaire ajouté incrémente la chaînelength
de l'identifiant en2
s'assurant au.repeat()
point de code respectif deux fois pour 2 octets utf-16 caractères et une fois pour 4 octets utf-16 caractères.Identifiants en JavaScript
Dans la spécification ECMAScript , an
IdentifierName
est défini avec la grammaire suivante:Générer la réponse
En utilisant initialement la propriété Unicode "ID_Continue", j'ai écrit un script Node.js qui génère la réponse complète. Maintenant, c'est juste un script côté client qui utilise un naïf
eval()
pour tester les caractères valides, en passant par tous les points de code unicode à la place:L'exécution
stat -f%z answer.js
donne un nombre d'octets de 612802, mais nous soustrayons 13 octets pourconsole.log(
et)
encapsulant la soumission réelle.Codage
La source est stockée sous la forme utf-8, ce qui se reflète dans le nombre énorme d'octets de la réponse. Cela est dû au fait que Node.js ne peut exécuter que les fichiers source encodés en utf-8.
JavaScript stocke en interne les chaînes avec le codage utf-16, de sorte que la "longueur de caractère" de chaîne renvoyée en JavaScript ne représente en fait que la moitié du nombre d'octets de la chaîne codée dans utf-16.
la source
x
au lieu de le$
libérer en tant que caractère identifiant supplémentaire?Python 2 , score
610+3 grâce aux pizzapants184
+1 grâce à WheatWizard
Essayez-le en ligne!
la source
print int(True)
à juste4/4
, vous pouvez ajouterand 7
pour 7, étant donné que vous n'avez pas à imprimer le numéro, il suffit de le `` produire ''&2
augmentera votre score d'un car il&
a une priorité plus élevée que^
, mais vous devez faire le numéro 2 d'une manière ou d'une autre. (Vous pouvez utiliser[[]==[]][[]<[]]<<[[]==[]][[]<[]]
)ord
était en conflit avecand
, mais j'ai corrigé celaTI-Basic (série 83, OS version 1.15 ou supérieure), score:
17181924(Tiebreaker: 53 octets.)
Vous pouvez obtenir un score très élevé en abusant de la longueur de chaîne comme d'habitude: commencez par (comme le souligne @Scrooble) et continuez d'ajouter des extraits à jeton unique jusqu'à la fin. TI-Basic en a plus de 700, ce qui fonctionne plutôt bien. Mais voici une autre approche:
length("A
length("length(
Notez que tokenizé, si (par exemple) TI-Basic la
e^(
commande n'utilise aucun des personnagese
,^
,(
.S'appuie sur une fonctionnalité non documentée de la
sub(
commande: en plus de rechercher des sous-chaînes, elle peut également être utilisée pour diviser un nombre par 100.Cela fonctionne si elle est en cours d' exécution sur une calculatrice fraîche, ce qui nous permet de supposer que
X
,Y
,Z
sont tous nuls, que les variables de fenêtre sont à leurs valeurs standards, que la calculatrice est en mode radian, et querand
trois premières sorties » seront au sujet0.943
,0.908
,0.146
.la source
PowerShell , 25 octets, score 5
1 Snippet:
' '.count
sorties1
. Il le fait en prenant la.count
chaîne, qui est une car il n'y a qu'une seule chaîne. Essayez-le en ligne!Extrait 2:
*2
sort2
car nous prenons l'1
extrait de code précédent et le multiplions par deux Essayez-le en ligne!Extrait 3: génère des
+!""
sorties3
en ajoutant le booléen non d'une chaîne vide. Cela convertit implicitement la chaîne vide en$true
, qui est à nouveau implicitement convertie en1
, donc nous en ajoutons un Essayez-le en ligne!Extrait 4:
-(-1)
sorties4
en soustrayant simplement un négatif Essayez-le en ligne!Extrait 5:
|%{5}
sorties5
en prenant le numéro précédent dans une boucle et chaque itération de cette boucle (une seule, car il n'y a qu'un seul numéro d'entrée) sorties5
Essayez-le en ligne!Merci à Jan pour un autre moyen de trouver
4
et une façon astucieuse de le faire5
.la source
' '.count*2+!""-(-1)|%{5}
pour un score de 5?$_
intérieur|%{ }
. Merci!C, 10 extraits, 45 octets
Essayez-le en ligne!
la source
MATL , Score
815,64123 octets11,23ZP
était son idée, tout en changeant3
avecI
pour l'extrait 7.OO...N&
était son idée.Plus à venir.Je ne connais pas les fonctions MATL par cœur, j'ai donc dû faire des allers-retours dans la documentation ... :)Essayez-le en ligne!
la source
5Yy
c'est sympa! J'utilise déjàY
en 3 pour obtenir le deuxième prime :(OOOOOOON&
. Si vous en ajoutez d'autres, ce sera probablement le dernier, à cause de&
yyyyyyyy...
? J'ai dû doubler le nombre, 24y
pour le faire dupliquer 12 fois ...?d
. Je suis sur mobile maintenant, mais essayezX#
de déboguer-imprimer la pileV , score 10
Essayez-le en ligne!
la source
Gelée , 253 octets, score 250
Extraits 1 caractère suivants:
Remarque:
¶
peut également être remplacé par\n
, il s'agit du même octet dans la page de codes de Jelly.Après avoir ajouté tous ces extraits, vous pouvez ensuite ajouter l'extrait à 2 caractères
”‘
.+1 grâce à Dennis .
Essayez-le en ligne!
la source
Lenguage , 1 112 064 extraits
Le n ème extrait est composé de 2 3n-1 répétitions du n ème caractère Unicode non-substitut, jusqu'au 1 112 064 ème et dernier caractère non-substitut du standard Unicode actuel inclus.
La sortie est en unaire (en utilisant l'octet nul comme chiffre) pour plus de simplicité. La décimale est possible, mais cela rendra les programmes encore plus longs. Avec unary, nous pouvons tester les premiers programmes.
Pour n = 1 , nous obtenons 4 répétitions de U + 0000 . Ceci est équivalent au programme brainfuck
.
, qui affiche un octet nul.Pour n = 2 , nous obtenons 32 répétitions de U + 0001 , pour un total de 36 caractères. C'est équivalent au programme brainfuck
..
, qui affiche deux octets nuls.Pour n = 3 , nous obtenons 256 répétitions de U + 0002 , pour un total de 292 caractères. Cela équivaut au programme brainfuck
...
, qui affiche trois octets nuls.Et ainsi de suite, jusqu'à n = 1 112 064 .
la source
'+'*(48 + d) +'.>'
pour chaque chiffre décimal de n permettrait d'obtenir le même score. C'est juste beaucoup plus difficile à décrire.BASIC (ZX Spectrum), score 244 (nouveau score 247) [est-ce de la triche?]
Extrait 1:
Extrait 2:
:
Extrait 3:
REM
Extraits 4 à 244: extraits à un seul caractère, utilisant tous les caractères ne figurant pas dans les extraits 1, 2 et 3.
Explication
Personnages
Sur Spectrum,
PRINT
est un seul caractère (code 245). L'extrait 1 utilise 11 caractères différents:2
,3
,5
,6
,+
,-
,*
,(
,)
,PRINT
etPEEK
ce que vous voyez comme des espaces sont une partie de caractèresPRINT
etPEEK
, si l'espace lui - même n'a pas été utilisé. J'ai décidé de donner le numéro de ligne 2356 car ce sont les seuls chiffres présents dans le code.Les caractères 13 et 14 ne sont pas autorisés. Cela signifie qu'il reste 243 caractères pour les extraits 2 à 244, en commençant par
:
etREM
pour éviter le code qui produirait une erreur ou ferait autre chose.Comment ça marche
C'est pourquoi je ne sais pas si cette réponse vient du livre.
23635 est l'emplacement de mémoire de la variable système 16 bits PROG, stockée sous la forme LH. (La valeur est généralement 23755. Mais à part un mauvais résultat s'il s'avère que ce n'est pas le cas, l'utilisation directe de ce numéro, même si cela raccourcirait le code, me coûterait des caractères numériques supplémentaires.) La valeur de PROG est l'emplacement de la mémoire où le programme lui-même est stocké. Les deux premiers octets sont le numéro de ligne stocké en tant que HL, les deux octets suivants sont la longueur de la ligne stockée en tant que LH. C'est ainsi que le programme recherche la longueur de sa propre ligne, donc quelque chose de approprié doit être soustrait
Sauvegarde des personnages
Compte tenu de la façon dont les numéros sont stockés, la ligne aurait pu se terminer par -114 pour que l'extrait 1 produise 1. Mais je ne voulais pas utiliser de chiffres supplémentaires, j'ai donc pris à la place deux numéros à 2 chiffres, qui devaient ensuite s'additionner à 122; 56 et 66 s'en sont bien sortis.
Le code est un peu moche avec toutes les valeurs d'imbrication et de calcul de PROG (
PEEK 23635+256*PEEK 23636
) deux fois. Mais si je le stockais puis utilisais la valeur stockée, cela coûterait des caractères / extraits supplémentaires - la ligne pourrait commencer commequi utiliserait 4 caractères supplémentaires:
LET
,p
,=
et:
.Je vais peut-être concevoir cela de sorte que tous les nombres soient calculés à partir de nombres qui n'utilisent qu'un seul chiffre et gagnent 3 extraits.
MODIFIER:
Voici le nouvel extrait 1 (c'est ainsi qu'une longue ligne unique est affichée sur le Spectrum, donc si vous voulez tester le code, cela vous aidera à voir que vous l'avez tapé correctement):
Je pourrais gagner un autre extrait en évitant le
+
et me contenter de-
. Je ne vais pas l'essayer, c'était assez une épreuve.la source
Klein 011 , 9 extraits
Extrait 1
Essayez-le en ligne!
Extrait 2
Essayez-le en ligne!
Extrait 3
Essayez-le en ligne!
Extrait 4
Essayez-le en ligne!
Extrait 5
Essayez-le en ligne!
Extrait 6
Essayez-le en ligne!
Extrait 7
Essayez-le en ligne!
Extrait 8
Essayez-le en ligne!
Extrait 9
Essayez-le en ligne!
Explication
Ce fut un défi vraiment amusant pour Klein. La topologie unique de Klein permet de faire beaucoup de choses intéressantes. Comme vous le remarquerez peut-être, les réponses 5-9 ajoutent simplement du remplissage (les lettres ne font rien dans Klein, je les ai donc utilisées comme remplissage) dans le code pour étirer la zone de délimitation. Cela entraîne l'IP à prendre un chemin différent à travers les parties antérieures du code en raison de la topologie unique de Klein.
Je vais faire une explication complète plus tard, mais pour l'instant voici une version plus facile à comprendre du programme avec toutes les lettres remplacées par
.
s.Essayez-le en ligne!
la source
> <> , Score:
Infini1.112.064-6 = 1.112.058Extrait 1 (6 octets)
Cet extrait renvoie le nombre de caractères après le; un de plus. Cela peut être étendu à
unetrès grande quantitéinfinied'extraits d'un caractère chacun. Un rapide google me dit qu'il y a 1 112 064 caractères Unicode possibles, moins les 6 que j'ai déjà utilisés.Essayez Il en ligne
la source
R , score: 79
Nous remercions Sean's Perl pour l'inspiration; cela abuse de certaines bizarreries de l'interprète R.
Premier extrait:
les extraits suivants sont les caractères suivants:
Essayez-le en ligne!
La
scan
fonction lit les données du fichier par""
défautstdin()
.Les documents pour
stdin()
indiquent que:Par conséquent, les données suivantes deviennent le fichier. Cela peut être développé de manière triviale et peut fonctionner avec plusieurs encodages différents.
la source
Pyke , 256 octets, score de 254
Veuillez noter que ce sont des codes hexadécimaux des octets réels, séparés par des espaces, car là l'octet nul (
\x00
) est inclus.Extrait de départ:
Extraits 1 caractère suivants:
Essayez-le ici!
la source
Java 8, 7 extraits (19 octets)
Juste un début, continuera à travailler dessus.
Essayez-le ici.
Explication:
La priorité d'exécution est peut-être rendue plus claire lorsque j'ajoute des parenthèses:
a*b
: Multiplieza
avecb
~a
:-a-1
a>b?x:y
:if(a>b){ x }else{ y }
a|b
: Bitwise-ORa
avecb
a^b
: Bitwise-XORa
avecb
a%b
:a
modulo-b
la source
Python 2 , 110 extraits
Voici l'extrait complet:
Essayez-le en ligne!
Le premier extrait est
Et puis les 109 extraits suivants sont les 109 octets suivants.
C'est assez "tricheur" comme le dit Lynn. Le premier extrait ouvre le fichier et soustrait 44 de sa longueur, puis chaque autre extrait ajoute 1 à la longueur du fichier sans changer la logique du programme dans son ensemble. augmentant ainsi le résultat de la sortie de 1.
la source
dc , score 13, 58 octets
Essayez-le en ligne! (Remarque, la version TIO ajoute un
f
après chaque extrait pour imprimer la pile entière, montrant que chaque extrait ne laisse qu'une seule valeur sur la pile; j'ai également oublié l'espace de tête sur le dernier extrait qui n'a pas d'importance fonctionnellement quand ils sont éclaté par des sauts de ligne mais compte pour mon utilisation des caractères)Chaque concaténation d'extraits supplémentaires laisse la valeur souhaitée et uniquement la valeur souhaitée sur la pile. Après avoir atteint 12, j'avais en quelque sorte manqué de moyens pour manger la pile. J'ai essayé d'utiliser les opérations mathématiques dès le début car elles engloutissent la pile et à mesure que nous entrons en plus grand nombre, il devient plus difficile de gérer de cette façon. Quand tout est dit et fait, il ne me reste plus que le chiffre 0 pour jouer et très peu de pile-popping, donc je pense que 13 est assez proche du maximum. Je suis sûr qu'il existe de nombreuses façons similaires (et probablement plus courtes) d'accomplir cela en DC, ce genre de mise en place. Notez que cygwin gère l'AF mélangé à 0-9 différemment de la plupart des versions de dc,
44C4r/CC 4//
fonctionne pour l'extrait final dans cygwin.la source
Pyth , 124 extraits
Essayez-le en ligne!
Caractères non imprimables où échappés à l'aide de trois caractères imprimables (
x..
). Le premier extrait est long de trois octets, chaque extrait après cela augmente de longueur d'un.la source
Beatnik , 22 octets, score de 20
En supposant que le mot "extrait" vous permet de pousser la valeur sur la pile.
la source
Octave, Score 86
Suivi par:
Cela exploite le fait qu'Octave traite tout après un nom de fonction comme une entrée de chaîne. Renvoie donc
nnz n
le nombre d'éléments non nuls dans la chaîne'n'
. Nous arrivons à 86 en ajoutant les autres caractères ASCII imprimables.',"%#
ne fonctionne pas.la source
APL (Dyalog) , score 12
+1 score grâce à @dzaima
Premier à troisième extraits:
Ensuite, chacun
234567890
.Essayez-le en ligne!
la source
Julia 0.6, 111217
Le script suivant crée le programme complet:
Explication
La macro
suivi de tous les caractères unicode distincts autorisés dans les identificateurs, calculés avec
isidentifier
. Certaines marques diacritiques gâchent le comptage, alors je les ai supprimées.la source
TeX, score 61 (peut-être 190)
Premier extrait:
60 autres extraits: dans n'importe quel ordre, chacun contenant un caractère sur
Explication:,
\len
qui est appelée à la fin, convertit une séquence de contrôle en chaîne, chaque caractère (y compris\
) est un jeton de caractère de cette chaîne; puis\glen
gobe le jeton\
, puis\tlen
compte les jetons restants. Il délivre donc la longueur de cette séquence de contrôle (non compris\
).Les caractères d'autres extraits prolongent la séquence de contrôle qui est initialement juste
\t
. Une séquence de contrôle à plusieurs caractères doit être composée uniquement de lettres, mais elles comptent toutes comme des lettres car elles ont toutes été affectées au code de catégorie 11 (en utilisant des codes ASCII pour que les caractères eux-mêmes n'apparaissent pas dans le premier extrait).J'ai décidé d'utiliser des codes octaux pour certains caractères qui m'ont coûté un symbole,
'
mais m'a sauvé deux chiffres, 8 et 9, alors j'ai gagné un extrait. J'aurais peut-être pu en gagner quelques autres si je n'en avais pas besoin\expandafter
.Sortie
Altération possible: encapsuler
\number\count1
pour\message{}
que la sortie ne passe pas en.dvi
sortie mais à la sortie console et.log
. Cela ne coûte pas de lettres supplémentaires.190
Malheureusement, TeX fonctionne avec ASCII et non Unicode (ou le fait-il maintenant?), Mais ma solution pourrait éventuellement être étendue pour inclure 129 extraits de plus à un seul caractère contenant les caractères avec les codes 127-255. Peut-être même certains caractères avant 32. Le caractère 32 (espace) ne fonctionnait pas, sinon je le mettrais aussi dans un extrait - je n'en avais pas besoin dans le premier extrait. Bien sûr, chacun de ces caractères supplémentaires devrait être
\catcode
inséré dans une lettre du premier extrait.la source
Pip, 57 octets, score = 16
Notez que
<tab>
représente un caractère de tabulation littéral (ASCII 9). Essayez-le en ligne!Chaque extrait est un programme complet qui génère le nombre souhaité. La plupart d'entre eux partent du principe que la dernière expression d'un programme Pip est imprimée automatiquement: par exemple, dans l'extrait 5, le code précédent est évalué, mais la seule partie qui compte est le
5
. Les exceptions à cela sont:RT9
(racine carrée de 9), mais après l'extrait 2, il est en fait analysé comme2RT9
(2e racine de 9) - ce qui, bien sûr, équivaut à la même chose.y
variable. L'extrait 8 renvoie ensuite la valeur dey
.o
(préinitialisé à 1). L'extrait 13 prend ce résultat et soustraitv
(préinitialisé à -1).1
sans une nouvelle ligne (Ok=k
, où estk=k
évalué à la valeur véridique par défaut de 1), puis s'imprime automatiquement6
.Autres trucs intéressants:
14
de la valeur de pi."F"
hexadécimal.la source
Zsh , score> 50 000 (1 112 046?), 16 + Σ (longueurs de point de code UTF-8) octets
Zsh gère les encodages multi-octets par défaut. L'extrait de base comporte 18 caractères uniques, 34 au total. Chaque autre point de code (sauf pour l'octet nul) peut être ajouté à cela. Au moment où j'écris ceci, mon script les testant est au point de code ~ 50 000, taille totale du fichier 150K, soit environ 30 extraits / seconde. Exécutez mon script de test complet vous-même ici. Vous voudrez peut-être l'ajuster pour commencer à certains points de code ultérieurs.
Essayez les 2000 premiers extraits en ligne!
Plus d'extraits sont possibles en utilisant cette technique .
la source