Vous devez écrire un programme ou une fonction qui, lorsqu'il est administré une nonvide chaîne S de N caractères ASCII imprimables † , émet un programme qui se termine avec le code de sortie C , où C est le point de code ASCII à la position 0 dans S . Ce programme que vous écrivez en outre un programme de sortie P , de telle sorte que, lorsqu'il est exécuté, il sort avec le code de sortie C ' , où C' est le point de code ASCII en position 1 dans S . Le programme P sortira un autre programme P ' . Ce processus se répète jusqu'à ce qu'il ne reste plus de caractères dans S. Après cela, vous ne devez rien produire, suivi d'un retour à la ligne facultatif; et doit quitter avec le code de sortie 0.
† Les caractères entre 0x20
et 0x7e
inclus.
Quelques règles supplémentaires:
- Les programmes auto-modifiables ne sont pas autorisés: vous devez sortir la source vers STDOUT (ou, retourner la valeur initialement)
- Vous ne pouvez pas lire votre propre code source.
Le programme le plus court en octets gagnera.
Pour certains tests rudimentaires, ce script rubis peut être utilisé. (Le premier argument est la façon dont vous invoquez le script, le second le programme et le troisième la chaîne d'entrée.)
Exemple hypothétique
Disons que le programme l'est FOO
. Lorsqu'on lui donne la chaîne "ABC", il sort BARA
. Ce programme se termine avec du code 65
et des sorties BARB
. Cela se termine à son tour avec du code 66
et des sorties BARC
. Ce programme se termine avec du code 67
et des sorties BAR!
. Cela ne produit rien et se termine avec du code 0
.
0
est le succès. tio.run/nexus/…33 throw
lancer un nombre arbitraire. Vous utilisez des négatifs pour le niveau OS et le décalage est -512. Idk beaucoup non plus, mais je regarde ici: complang.tuwien.ac.at/forth/gforth/Docs-html/…Réponses:
Python 2,
12610194 octetsEn faisant cela, j'ai trouvé que le code Python ne peut pas contenir d'octets NUL littéraux.
Essayez-le en ligne (affiche le code de sortie dans les informations de débogage)
Notez que chacun des programmes non vides ci-dessous a un saut de ligne de fin.
Pour l'entrée
Hello
, les sorties ci-dessus:qui imprime
...
qui imprime
qui imprime
qui n'imprime rien (le programme vide)
qui n'imprime rien et se termine avec le code 0.
la source
Python 3, 77 octets
Ce code prend l'entrée de STDIN et sort le premier programme vers STDOUT.
Si l'entrée est
ABCDE
, les résultats sontoù chaque ligne contient le code de sortie et la sortie du programme précédemment exécuté (la première ligne est le premier programme).
la source
Python 3 ,
115108100 octetsEssayez-le en ligne!
Pour l'entrée
Hello
, le programme imprime:Le programme ci-dessus imprime:
et sort avec le code
72
.Essayez-le en ligne!
Le programme ci-dessus imprime
et sort avec le code
101
.Essayez-le en ligne!
Le programme ci-dessus imprime:
et sort avec le code
108
.Essayez-le en ligne!
Le programme ci-dessus imprime:
et sort avec le code
108
.Essayez-le en ligne!
Le programme ci-dessus n'imprime rien et se termine avec le code
111
.Essayez-le en ligne!
Le programme vide n'imprime rien et se termine avec le code
0
.Essayez-le en ligne!
la source
C, 156 octets
Essayez-le en ligne!(Ouvrez l'onglet de débogage pour voir le code de sortie.)
Prend l'entrée comme argument de ligne de commande.
Pour l'entrée "ABC", cela sort le programme
qui renvoie 65 et sorties
qui renvoie 66 et sorties
qui renvoie 67 et sorties
qui ne produit rien et renvoie 0.
la source
Python 2, 67 octets
Basé sur cette réponse , mais modifié pour utiliser Python 2, avec un programme trivial
0
pour ne rien imprimer et quitter.Essayez-le en ligne
la source
RPL, 73 octets
Avec la page de codes hp8.
Allumez votre HP48 ou similaire, ou lancez droid48 . N'oubliez pas de
-52 SF
pour une meilleure visualisation de la pile. Je suppose que vous avez déjà poussé la chaîne, par exemple"ABC"
, sur la pile. Saisissez ensuite la fonction suivante:(Pour plus de commodité, je suggère d'appuyer deux fois sur la touche α avant de taper quoi que ce soit, ce qui verrouille le mode de saisie alpha. Plus tard, utilisez simplement la touche DEL pour annuler les délimiteurs de fermeture insérés automatiquement. Utilisez simplement la touche ENTER pour valider. N'oubliez pas l'espace après le poignarder l'opérateur.)
Cette fonction pousse immédiatement sur la pile un programme auto-modifiable, sous forme de liste. (Mais la fonction ci-dessus ne se modifie pas). Comme le L dans RPL signifie à l'origine LISP, appuyer sur la touche EVAL évaluera en effet ce programme. Il retourne le code de sortie au niveau de pile deux, et se laisse modifié (oui, ici c'est discutable), pour un dernier EVAL. Appuyez donc plusieurs fois sur EVAL jusqu'à ce que le programme s'arrête enfin pour se déposer au niveau de pile un. Le code de sortie final 0 apparaît donc au niveau un, avec les codes de sortie précédents ci-dessus. Si vous avez oublié d'
-52 SF
, vous pouvez naviguer dans la pile après chaque EVAL en appuyant sur la touche ▴ (quitter ce mode de navigation avec la touche ON). La fonction ci-dessus accepte les chaînes avec des caractères 0x0 à l'intérieur, pour créer de telles chaînes0 CHR
et+
êtes vous amis. L'auto-modification consiste à supprimer le caractère utilisé de la chaîne incorporée (laSUB 2 SWAP PUT
branche). Par conséquent, le programme abandonné est plus court après chaque EVAL. La4 DROPN
branche s'assure que l' rien de sortie seront interdits. Pour toujours.l'instruction du PO est respectée, abandonnant entre autres le programme lui-même. Bien sûr, tout cela suppose que votre note est un-55 SF
adepte. Utilisateurs de-55 SF
Je suppose qu'une solution RPL / 2 existe et pourrait comporter un véritable code de sortie Unix, mais afaik RPL / 2 a une introspection limitée et ne peut pas évaluer les listes.
la source
sed ,
467461 octetsLes codes de caractères sont difficiles:
Essayez-le en ligne!
Sinon, la logique est plutôt simple: (1) échapper les caractères spéciaux (il y en a deux), (2) encapsuler
s/^/…/;q\1
couche , (3) répéter.Voici la sortie pour
hello
:Et un petit script que j'ai utilisé:
la source
PowerShell,
172156 octets.L'
h3l}'{l0
entrée donnera la sortie suivanteEssayez-le en ligne!
Qui à son tour sortira
Essayez-le en ligne!
La dernière exécution ne produira rien et le code de sortie sera 0.
Essayez-le en ligne!
la source