Code d'origine:
[[ ! "${1////x}" =~ [[:alnum:]] ]]&&[[ $# = 1 ]]&&bash -c "$1"
Contribution:
__=; (( __++, __-- ));
(( ___ = __, ___++));
(( ____ = ___, ____++));
(( _____ = ____, _____++));
(( ______ = _____, ______++));
(( _______ = ______, _______++));
(( ________ = _______, ________++));
(( _________ = ________, _________++));
${!__##-} <<<\$\'\\$___$______$_______\\$___$______$_____\\$___$_______$__\\$___$_______$_________\'\ \$\'\\$___$___$__\\$___$______$_______\\$___$_______$______\\$___$_______$______\\$___$_______$_________,\ \\$___$____$_________\\$___$_______$_________\\$___$________$____\\$___$_______$______\\$___$______$______\\$__$______$___\'
Explication:
Cela code "écho Bonjour, monde!" sous forme de séquences d'échappement octales (\ xxx).
Sauf que vous ne pouvez pas non plus utiliser de nombres, donc la première partie crée des variables pour les nombres 0-7. Vous pouvez les utiliser pour construire une chaîne avec des séquences octales qui seront évaluées pour vous donner la commande réelle.
Mais eval
est également alphanumérique. Donc, à la place, cela canalise cette chaîne en entrée d'une autre instance de bash
. $0
contient le nom de la commande utilisée pour appeler Bash, qui est généralement juste bash
(ou -bash
pour un shell de connexion) si vous l'exécutez normalement (via TIO ou en le collant dans un terminal). (Cela signifie d'ailleurs que si vous essayez de l'exécuter en le collant dans un script, les choses iront horriblement mal alors qu'il essaie de se bifurquer plusieurs fois.)
Mais de toute façon, vous ne pouvez pas dire $0
directement. $__
Contient à la place le nom de $0
("0") et vous pouvez utiliser l'expansion indirecte pour y accéder ( ${!__}
fait référence au contenu de $0
).
Et cela, enfin, vous donne toutes les pièces dont vous avez besoin.
05AB1E , Adnan
Essayez-le en ligne!
Comment?
la source
totalement humain , Python 2
Une solution est
la source
Pyth : M. Xcoder
G
est intégré à l'alphabet minuscule. Le code vérifie l'égalité par rapport à cela.la source
Gelée: EriktheOutgolfer
Gelée , 11 octets
Essayez-le en ligne!
Explication
Le code d'origine peut être expliqué comme tel:
Alors, prenez simplement "Bonjour, le monde!" et obtenez des points de code, mettez-les au carré, relancez-les en points de code, faites-les pivoter 5 fois vers la droite, puis ajustez et aplatissez le résultat.
la source
Octave par Stewie Griffin
Je ne sais pas si c'est la bonne solution (sur TIO, cela imprime le
\00
caractère), mais dans monoctave-cli
shell, cela ressemble à ceci:Dans le défi d'origine, il est également indiqué de ne rien imprimer (ou le caractère nul) , donc si rien n'est le même,
\00
cela devrait aller.Essayez-le en ligne!
la source
0
par un10
).Hello, World!
et un retour à la ligne. » est une citation exacte du défi. Et en effet, cela rend la réponse triviale.Python 3 par rexroni
Empêchez toute erreur en fermant tôt.
Essayez-le en ligne!
la source
JavaScript (ES6) Par Ephellon Dantzler
{length:1, charCodeAt:()=>(e='Hello, World!', String.fromCharCode=()=>'')}
Essayez-le en ligne!
C'était assez facile.
J'ai remarqué que toute entrée de chaîne ne serait pas possible de sortir
Hello, World!
parce que le tout à l'intérieurString.fromCharCode
ne renverrait que des multiples de 4, et!
a un code de caractère de 33. Donc, clairement, nous devons juste pirater tout le programme. Le piratage des fonctionnalités intégrées en JavaScript est trivial si l'on n'essaye pas de les arrêter (et même si on le fait, il existe généralement de nombreuses solutions de contournement ...).la source
JavaScript (ES6), Voile
Proxy simple qui ne renvoie le caractère recherché que tous les 3 fois qu'il est appelé.
Essayez-le en ligne!
la source
Ruby, par Histocrat
L'entrée magique est:
1767707618171221 30191World!
Essayez-le en ligne.
Explication:
1767707618171221
est un nombre premier et, écrit en base 36, il l'est"hello"
. Une fois capitalisé, cela produit"Hello"
, qui est imprimé en utilisant$><<
$><<", #$'"if/30191/
recherche le nombre30191
dans l'entrée et écrit pour stdout une chaîne composée d'une virgule, d'un espace et de tout ce qui est dans l'entrée après le30191
(en utilisant le$POSTMATCH
, qui est référencé ici par sa variante courte$'
).la source
Lua 5.1 par tehtmi
Passez ceci comme premier argument:
En supposant que le code d'origine se trouve dans un fichier
tehtmi.lua
, exécutez (dans bash ou un shell similaire):Il fonctionne également sur Lua 5.3, qui est utilisé par TIO, alors pourquoi ne pas l' essayer en ligne ? Je n'ai pas testé une implémentation qui utilise le noyau "PUC-Rio's Lua 5.1" (car je ne trouve pas vraiment d'informations), mais ma solution y fonctionne probablement aussi.
Comment?
Il exécute le premier argument sous forme de code, mais uniquement s'il contient moins de 5 caractères minuscules.
L'astuce est de courir
print("Hello, World!")
. Cela peut également être exécuté à l'aide de_G["print"]("Hello, World!")
, qui utilise uniquement des chaînes.Mais nous ne pouvons pas utiliser la chaîne directement en raison de la restriction du nombre de minuscules, cependant, vous pouvez exécuter
("").char
pour obtenir la fonctionstring.char
, qui peut convertir une série d'octets en une chaîne. Je l'ai assigné à une variable en majuscule (afin de ne pas atteindre la limite) afin que nous puissions l'utiliser pour construire à la foisprint
lesHello, World!
chaînes et les chaînes qui peuvent être utilisées comme ci-dessus.la source
next
place dechar
ce qui ne fonctionne pas sur Lua 5.3 en raison de la randomisation de l'ordre d'itération.JavaScript (ES6) par Voile
L'entrée doit être une chaîne contenant ceci:
Essayez-le en utilisant ceci:
Si vous ne vous souciez pas de l'exigence de retour à la ligne pour la sortie, vous pouvez remplacer les 6 dernières lignes par ceci:
Comment je l'ai fait
Les restrictions sur l'entrée sont qu'il s'agit d'une chaîne, chaque ligne fait deux octets de long ou moins, et que la longueur totale est de 80 octets ou moins. Ma première tentative après avoir compris que c'était correctement ceci:
Remarque: les
\
s doivent ignorer les sauts de ligne dans la chaîne en entrée. C'est incroyablement crucial pour la réponse, et je ne peux pas croire que je suis tombé dessus par accident. (Je le connaissais auparavant mais je l'ai oublié)Mais cela n'a pas fonctionné, car le
=>
doit être sur la même ligne que les arguments. Heureusement, j'ai eu l'idée d'encapsuler quelque chose de similaire dans une chaîne et de mettre un eval dans mon entrée pour le réduire à une ligne, ce qui a abouti à ma réponse finale. Une fois que l'évaluation dans l'entrée se produit, ce qui suit est généré sous forme de chaîne (qui est ensuite évaluée par une fonction, puis exécutée):C'était vraiment difficile à résoudre, mais j'ai finalement réussi.
De plus, le premier crack jamais!
la source
Cubically par MD XF
J'imagine que c'est toujours dangereux, mais je pense que j'ai une fissure, en attendant que j'ai raison en ce qu'il y a un bug dans l'interpréteur (que je viens de compiler).
Ma contribution
La sortie est
Hello, World!\n\n\n\n\n\n\n\n\n\n.....
avec des nouvelles lignes sans fin.Mais j'ai remarqué la dernière section de code:
définit le bloc-notes sur
0x0A
(nouvelle ligne) d'une manière effrayante, lit l'entrée sur la face 7 (la face d'entrée), puis imprime le visage 6 (face du bloc-notes) à plusieurs reprises jusqu'à ce que la face 7 soit nulle. Si vous définissez la face 7 sur zéro, vous ne devriez obtenir qu'une seule nouvelle ligne. Cependant, j'ai obtenu des sauts de ligne infinis et ma 13e entrée était un zéro, et je peux vérifier que le 7 face est toujours zéro en insérant un "numéro d'impression à partir de 7 face" dans la boucle:puis il imprime des
\n0
paires sans fin .Je regarde les spécifications sur la page cubiquement github et ce comportement ressemble énormément à un bug. La modification du dernier caractère du programme d'origine de a
7
à a0
entraîne le comportement attendu. L'interpréteur TIO présente le même comportement incorrect.la source
CJam , Erik le Outgolfer
Essayez-le en ligne!
Comment?
la source
C # (.NET Core) , Grzegorz Puławski
La solution que j'ai trouvée utilise très substantiellement les caractères non imprimables, donc essayer de le coller ici n'a pas bien fonctionné. Les valeurs d'octet pour l'entrée sont:
Ou la version chaîne est disponible dans le champ de saisie du lien TIO.
Essayez-le en ligne!
Le programme d'origine prendrait les caractères distincts dans l'entrée, puis inverserait l'entrée et multiplierait les éléments des deux listes. J'ai donc créé une chaîne de 26 caractères où les 13 premiers caractères étaient distincts, les 13 derniers caractères sont également apparus dans les 13 premiers, et chaque paire d'index s'est
[i, 26-i]
multipliée jusqu'à la valeur d'octet du i-ème caractère dansHello, World!
.la source
Ly , LyricLy
Essayez-le ici (bien que la page ne rende pas la nouvelle ligne).
n
prend des entrées, essaie de se diviser en espaces et de lancer en pouces, ceux-ci sont mis sur la pile.o
imprime les points ordinaux et8+
fait ce que l'on pourrait penser. L'entrée doit donc être inférieure de 8 aux points de code dans l'ordre inverse, divisé par des espaces.la source
2
cela fonctionnerait - est-ce juste la page herokuapp qui ne la rend pas?C (gcc), par Felix Palmen
Code d'origine:
Arguments:
Essayez-le en ligne!
Explication:
W(c)
calcule l'adresse d'une chaîne à partir de la liste des arguments à imprimer. Il commence par l'adresse du cème argument (O(c)
), qui est le 42ème argument dans ce cas, puis soustrait le premier caractère du deuxième argument (**O(2)
) comme un décalage entier, puis ajoutex
, qui est le nombre d'arguments.W(c)
utilise le deuxième argument, vous savez donc qu'il doit y en avoir au moins 3 (0, 1, 2). Puis "Bonjour, le monde!" peut aller dans le premier argument, puis pour répondre à cet argument, vous avez besoin d'un caractère dont la valeur ASCII correspond à l'équation "42-x + 3 = 1". Cela se trouve être ",".la source
JavaScript: ThePirateBay
Je remplace les méthodes
valueOf()
ettoString()
des objets analysés afin que la contrainte échoue avec aTypeError
.la source
6502 Assemblage (C64) - Felix Palmen
L'explication est légèrement impliquée.
Le code vérifie d'abord une virgule (nécessité de syntaxe), puis lit deux arguments, dont le premier est un WORD, stocké en petit-boutien aux emplacements de mémoire 0014 et 0015, le dernier étant stocké dans le registre X.
C'est assez intelligent, en utilisant notre entrée pour réécrire le programme. Il réécrit finalement le compteur de la boucle de sortie à la fin du programme.
Voici la partie sournoise:
sur le C64, d018 est un octet très important. Il stocke les points de référence pour les choses impliquant la sortie de l'écran. Voir ici pour plus d'informations. Si cela obtient une valeur erronée, cela fera planter votre C64. Pour imprimer les lettres mixtes majuscules et minuscules requises, cela doit être de 17 $.
Maintenant, nous commençons notre boucle de sortie:
Cette constante est ce qui a été écrit auparavant. Il détermine clairement la durée de la boucle. Il se trouve que c'est déjà la bonne valeur, mais nous devons encore y coller 0e.
Le reste n'est que les informations que nous devons imprimer, à partir de l'adresse mémoire c025.
Il s'agit donc simplement de suivre les calculs à partir de là.
la source
$FF
là, mais a ensuite décidé de le laisser.6502 Code machine (C64) - Felix Palmen
La bonne réponse est
Le code est assez compliqué, impliquant beaucoup d'auto-modification. Ainsi, au lieu de le désosser complètement, vous pouvez simplement l'utiliser pour se fissurer.
Voici un démontage légèrement plus utile du code, pour aider à comprendre ce qui s'est passé. La syntaxe est pour KickAssembler.
L'étiqueter comme ça m'a suffi pour voir que le code XORs un tas de constantes qui sont cachées afin d'imprimer ce dont nous avons besoin. Étant donné que XOR est réversible, si vous entrez la sortie souhaitée, il vous dira quelle est la clé.
J'ai donc changé la dernière ligne
il imprimerait donc la dernière entrée requise au lieu de planter sur une mauvaise entrée.
Et c'est ça!
S'il y a un intérêt, je vais plus déchiffrer le code.
la source
vice
. Mais peu importe, c'est la bonne solution.drops A in mystery+1, over the constant
" <- c'est en faitmystery+4
avec votre étiquette. Les offests sont en octets :) et FWIW, l'auto-modification est assez courante même dans le code 6502 sérieux , tant que le code s'exécute à partir de la RAM.Explode , Step Hen
Essayez-le en ligne!
la source
C (tcc) par Joshua
Essayez-le en ligne!
la source
MATL par Luis Mendo
Essayez-le en ligne!
la source
Jelly par Jonathan Allan
Code d'origine:
Essayez-le en ligne!
Contribution:
Explication:
la source
C (GCC sur TIO) par MD XF
Essayez-le en ligne!
Comment?
Il essaie d'imprimer le deuxième argument sous forme de chaîne, qui est un pointeur que nous pouvons déterminer sur l'entrée. Il se trouve que la mémoire de l'emplacement
4195875
démarre la"Hello, World!\n"
chaîne.Le nombre a été déterminé en ajoutant
print("%p", "Hello, World!");
avant leprintf
, en convertissant le nombre hexadécimal en décimal et en l'essayant sur le TIO d'origine. Cependant, il m'a montré laprintf
chaîne de format. En essayant certains nombres, j'ai découvert que la chaîne se trouve avant la chaîne de format.Donc, en mémoire, cela ressemblerait à ceci (comme une chaîne C):
Cela signifie également que toute mise à jour du compilateur peut casser la solution.
la source
JavaScript (Node.js) par Voile
['Hello, World!','','','','','','','','','','','','']
Essayez-le en ligne!
la source
Röda par fergusq
Essayez-le en ligne!
Explication à venir un peu ...
la source
JavaScript (ES6), Voile
Essayez-le en ligne!
la source
PHP par LP154
Essayez-le en ligne!
(TIO n'a pas la classe PDO définie, donc la démo ci-dessus utilise un codepad qui le fait)
Une autre solution:
Essayez-le en ligne!
la source
JavaScript (ES6), Voile
Étant donné la limite de 81 caractères, ce n'est probablement pas la solution prévue
Essayez-le en ligne!
la source