Votre tâche consiste à écrire un programme comptage / fonction non vide de l' octet L , qui, lorsqu'ils sont répétés M fois, vérifie si un nombre entier positif donné N est égal à L × M .
Vous devriez, en théorie, prendre en charge un nombre arbitraire de répétitions (une valeur entière positive arbitraire de M ), mais c'est bien si, en raison des limitations du langage, il ne peut pas fonctionner au-delà d'un certain seuil. La lecture du code source de votre programme ou l'accès aux informations le concernant sont strictement interdits .
Pour fournir une sortie, vous devez choisir une valeur cohérente pour l'un des états (vrai ou faux) et utiliser toute autre sortie possible (pas nécessairement cohérente) pour l'autre état ( discussion ).
Vos réponses seront notées par la longueur L de votre programme initial (en octets), avec moins d'octets étant mieux.
Exemple
Disons que votre programme (initial) l'est ABCDE
. Alors:
ABCDE
(1 répétition) devrait vérifier si l'entrée est égale à 5 .ABCDEABCDE
(2 répétitions) devrait vérifier si l'entrée est égale à 10 .ABCDEABCDEABCDE
(3 répétitions) devrait vérifier si l'entrée est égale à 15 . Etc...
Le score de cet exemple de code serait de 5 , car la source initiale est longue de 5 octets.
L
concaténée après lui-mêmeM
devrait renvoyer si son entréeN
est égale àL*M
?Réponses:
Gelée , 1 octet
La sortie est 0 pour une correspondance, différente de zéro pour une non-correspondance.
Essayez-le en ligne!
Comment ça fonctionne
Cela profite du format de sortie trop libéral. La répétition de
’
M fois diminue simplement les M fois d' entrée , le résultat sera donc nul si et seulement si l'entrée est LM , où L = 1 .la source
Haskell, 8 octets
Essayez-le en ligne!
Comme beaucoup d'autres réponses, il renvoie 0 pour la vérité et non 0 pour la fausse en soustrayant à plusieurs reprises la longueur du code du numéro d'entrée.
la source
Rétine ,
2120 octetsEssayez-le en ligne! Répétez simplement la partie dans la fenêtre Code pour voir comment elle gère les multiples.
Donne
0
les entiers multiples et positifs corrects pour tout le reste.Explication
Regardons d'abord le programme unique:
Cela convertit un nombre décimal en unaire (en utilisant
_
comme chiffre unaire).Si la chaîne est vide (ce qui ne peut pas se produire à ce stade, car l'entrée est garantie positive), nous la remplaçons par une seule
_
.Maintenant, nous nous débarrassons des 20 premiers traits de soulignement. Si l'entrée était
20
, cela se traduit par une chaîne vide.Et enfin, nous comptons le nombre de soulignements dans le résultat, qui est nul si l'entrée était
20
.Maintenant, que se passe-t-il lorsque nous répétons le code source. Étant donné que nous n'insérons pas de saut de ligne lorsque nous rejoignons les programmes, la première ligne ira juste à la fin de la dernière ligne, nous l'obtenons lorsque le double du programme:
Maintenant, au lieu de compter les soulignés, nous nous retrouvons avec l'étape suivante:
Cette étape ne fait rien, car il n'y a plus de chiffres dans la chaîne de travail à ce stade, donc l'expression régulière ne peut pas correspondre.
Maintenant, cette étape devient pertinente. Si l'entrée était un plus petit multiple de 20, la chaîne a été vidée par la copie précédente du code source. Dans ce cas, nous le transformons en un seul soulignement, qui, nous le savons, ne pourra plus jamais être transformé en chaîne vide par notre programme. De cette façon, nous nous assurons que seul le M e multiple est accepté (et pas tous les multiples jusqu'au M e).
Nous supprimons à nouveau les 20 premiers soulignements. Ainsi, M répétitions du code source supprimera si possible 20 millions de soulignements de la chaîne.
Et lorsque nous arrivons à la fin du programme, nous comptons toujours les traits de soulignement pour que les entrées valides donnent zéro.
la source
Fragment de code machine x86 32 bits, 1 octet
Entrée dans EAX, sortie dans EAX: 0 pour vrai, non nul pour faux. (Laisse également le drapeau ZF défini sur true, non défini sur false, afin que vous puissiez
je was_equal
). En "bonus", vous n'avez pas à vous soucier de l'emballage; Le x86 32 bits ne peut traiter que 4 Go de mémoire, vous ne pouvez donc pas faire M assez grand pour envelopper tout autour et trouver1 == 2**32 + 1
ou quelque chose.Pour créer une fonction appelable, ajoutez une
0xC3
ret
instruction après avoir répété0x48
M fois. (Non compté dans le nombre total, car de nombreuses langues doivent répéter uniquement le corps de la fonction ou une expression pour pouvoir rivaliser).Appelable depuis GNU C avec l' attribut de fonction x86 du prototype
__attribute__((regparm(1))) int checkeqM(int eax);
GNU Cregparm
, comme-mregparm
, utilise EAX pour passer le premier argument entier.Par exemple, ce programme complet prend 2 arguments, et JITs M copies de l'instruction + a
ret
dans un tampon, puis l'appelle en tant que fonction. (Nécessite un tas exécutable; compiler avecgcc -O3 -m32 -z execstack
)les exécutables non PIE sont chargés plus bas dans la mémoire virtuelle; peut faire un plus grand malloc contigu.
Notez que GNU C ne supporte pas les objets de tailles plus grand que
ptrdiff_t
(signé 32 bits), maismalloc
etmemset
faire encore du travail, de sorte que ce programme réussisse.Fragment de code machine ARM Thumb, 2 octets
Le premier argument
r0
et la valeur de retour dansr0
est la convention d'appel ARM standard. Cela définit également des indicateurs (les
suffixe). Fait amusant; la version sans réglage de drapeausub
est une instruction large de 32 bits.L'instruction de retour que vous devez ajouter est
bx lr
.Fragment de code machine AArch64, 4 octets
Fonctionne pour les entiers 64 bits. Entrée / sortie dans
x0
, selon la convention d'appel standard.int64_t foo(uint64_t);
AArch64 n'a pas (encore) de mode Thumb, donc 1 instruction est la meilleure que nous puissions faire.
la source
__builtin___clear_cache
est uniquement nécessaire parce que vous exécutez la mémoire que vous avez obtenuemalloc
. Si vous avez obtenu la mémoire à lammap
place, l'optimisation ne se produit pas.V , 16 (ou 1) octets
Réponse ennuyeuse:
un octet.
Réponse moins ennuyeuse:
Essayez-le en ligne!
Hexdump:
J'ai en fait écrit ceci environ 5 minutes après la sortie du défi. Il m'a fallu 30 minutes pour patcher cette horrible pile de code spaghetti que j'appelle une langue .
la source
Perl 5
-p
, 6 octetsEssayez-le en ligne!
utilise
0
pour égalla source
-p
solution Perl 6 valide .Brachylog , 2 octets
Essayez-le en ligne!
la source
Python 3 , 27 octets
Essayez-le en ligne!
Code répété deux fois:
Essayez-le en ligne!
la source
Brain-Flak , 24 octets
Essayez-le en ligne!
Renvoie
0
pour égal et autre chose pour différent.Comment ça fonctionne:
Ce
n
temps d' exécution du code sera soustraitn * 24
de l'entrée, donnant 0 uniquement lorsque l'entrée =n*24
.la source
Stax , 1 octet
Essayez-le en ligne!
la source
TI-Basic (série 83), 4 octets
Prend l'entrée
Ans
: par exemple, vous pouvez taper17:prgmCODEGOLF
pour exécuter ceci avec une entrée de17
. Imprime (et renvoieAns
) la valeur0
si l'entrée est égale à L × M , et une valeur différente de zéro sinon.Notez que le
:
fait partie du code, donc si vous entrez ceci dans l'éditeur de programme, vous devriez voirsi vous le saisissez une fois et
si vous le saisissez trois fois.
la source
Haskell , 12 octets
Essayez-le en ligne!
Sorties
0
pour vérité et certains entiers non nuls pour fausse.Solution alternative, 12 octets
Essayez-le en ligne!
la source
Befunge-98 , 15 octets
Essayez-le en ligne!
Essayez-le doublé!
Utilise 0 pour égal et toute autre chose pour inégale.
Explication:
Ce code répété plusieurs fois ressemblera à ceci:
]
virage à droite. Envoie l'IP vers le bas.>
se déplacer vers l'est. Envoie le droit IP.f
pousser un 16.v
se déplacer vers le sud. Envoie l'IP vers le bas. Si c'est la dernière fois, passez à l'étape 8.]
virage à droite. Envoie l'IP à gauche.+
ajouter. Ajoute le 16 en haut de la pile.v
se déplacer vers le sud. Envoie l'IP vers le bas. Passez à l'étape 2.<
déplacer vers l'ouest. Envoyez l'IP à gauche.#
sauter. sauter par-dessus]
et enrouler jusqu'à la fin.+
ajouter. Ajoute le 16 en haut de la pile.&
contribution. Appuyez sur un numéro de l'utilisateur.-
soustraire. obtenir la différence de somme sur laquelle nous travaillions et l'entrée..
impression. Imprimez le résultat.@
fin.la source
Pure Bash , 15
Entrée donnée comme paramètre de ligne de commande. Sortie en tant que code de sortie du shell -
1
pour VRAI et0
pour FAUX.la source
Fusain , 13 octets
Essayez-le en ligne! Sur la base de ma réponse, je double la source, vous doublez la sortie! Explication:
Gère la sortie
1
pour la vérité et la0
fausse. Répétitions ultérieures comparer l'entrée contre13
,26
,39
,52
etc. , mais à chaque fois que la réponse est surchargée alors que la réponse finale est considérée.la source
JavaScript ES6, 32 octets
si vrai, 0 et faux comme les autres, 31 octets
la source
MIPS, 4 octets
Utilise
$a0
comme argument et valeur de retour.MIPS, 8 octets (en utilisant la convention d'appel MIPS)
x86, 5 octets
Ceci est ma première réponse x86, donc les commentaires sont les bienvenus. Utilise la convention _fastcall avec ecx comme premier argument.
Peter Cordes a une solution à 1 octet dans les commentaires.
Commentaire de Brainfuck : La partie difficile est d'obtenir que brainfuck retourne une seule valeur. Sinon, quelque chose comme ça serait facile.
la source
sub $4, %al
/mov %al, %dl
. Ou revenez toujours dans AL / EAX et vous obtenez alors la solution de Dennis, avecdec %eax
(1 octet en mode 32 bits). Et oui, les conventions d'appel personnalisées conviennent parfaitement à asm. C'est asm, pas seulement "asm qui est facile à appeler depuis C"; le vrai code écrit en asm utilise des conventions d'appel personnalisées là où cela aide, c'est donc totalement justifiable.r0
laquelle est également le retval, donc Thumbsub r0, #2
est de 2 octets.ret
à la fin du bloc de répétition avant de pouvoir les appeler. Normalement, j'inclus le nombreret
d'octets pour mes réponses asm x86. Mais je pense que le fait de plier les règles ici au corps de la fonction est logique, sinon de nombreuses langues ne peuvent pas rivaliser du tout.xchg %eax, %ecx
/sub $4, %al
/xchg %eax, %ecx
fait 4 octets et suit la convention _fastcall. L'utilisation des codages courts AL, imm8 et xchg-with-eax est souvent utile pour le golf de code.objdump -drwC -Mintel
pour obtenir un hexdump des octets de code machine.add r32, imm8
est également de 3 octets: opcode + ModR / M + imm8. Toutes les instructions qui peuvent prendre un imm32 ont un opcode alternatif qui prend un imm8 étendu par signe. Voir felixcloutier.com/x86/ADD.html par exemple; toutes les instructions "classiques" ALU (mais pas MOV) qui remontent à 8086 ont tous ces encodages, y compris les AL / AX / EAX spéciaux sans modr / m, juste op + imm8 / 16/32. Cette réponse a des exemplesOctave: 23 octets
Si N = L * M, l'expression renvoie
0+i
(c'est-à-dire un nombre purement imaginaire), sinon l'expression donne un nombre complexe avec une composante réelle.Pour un résultat un peu plus agréable au prix d'un octet supplémentaire:
Si N = L * M l'expression revient
-1
, sinon un nombre positif.Démo:
PS, vous pouvez obtenir le même résultat avec
+24;if N==ans;-1;end;ans
mais le nombre de bytec est le mêmela source
Lua,
5646 octetsGénère un 0 (sans retour à la ligne) s'il est égal et rien ou une série de nombres négatifs (avec zéro précédent dans certains cas) s'il n'est pas égal.
Seul: Essayez-le en ligne!
Répété plusieurs fois: essayez-le en ligne!
Explication
Lors de la première itération (quand il
a
n'a pas encore été défini et l'est doncnil
), définita
un nombre pris depuis l'entrée, sinon vers lui-même. Dans les deux cas, 46 est ensuite soustraita
.Cela s'imprime juste
a
si elle est inférieure à (pour éviter les cas où l'entrée était supérieure à la longueur totale) ou égale à zéro, et la chaîne vide sinon.-10 octets pour se souvenir que Lua effectue automatiquement les conversions entre les nombres et les chaînes. Oups.
la source
JavaScript (ES6), 47 octets
C'est en utilisant la même technique que Benoit Esnard dans cette réponse (à partir de je double la source, tu double la sortie! ).
Imprime 0 si n = 47 * M , ou une valeur non nulle sinon.
Démo pour M = 1
Démo pour M = 2
la source
Brain-Flak , 24 octets
Essayez-le en ligne!
Il suffit de soustraire 24 de l'entrée. Sorties
0
pour vrai et rien d'autre pour faux.Brain-Flak , 68 octets
Essayez-le en ligne!
Celui-ci est plus sophistiqué qu'il émet
1
pour vrai et0
pour faux.la source