Ce défi est créé pour célébrer mon premier langage ésotérique, le revers !
Le revers est un langage unidimensionnel avec un flux de pointeur non linéaire. Le pointeur se déplace de trois étapes à la fois, exécutant uniquement toutes les trois instructions.
Le programme 1..1..+..O..@
ajoutera 1 + 1 et affichera 2 avant de se terminer. Les instructions intermédiaires sont ignorées, 1<>1()+{}O[]@
tout comme le même programme.
Lorsque le pointeur est sur le point de descendre de la fin de la bande, il inverse la direction et avance dans l'autre sens, tout [email protected]+.
comme le même programme. Notez qu'il ne compte l'instruction de fin qu'une seule fois. Cela nous permet de compresser la plupart des programmes linéaires, tels que1O+1@
Votre défi ici est d'écrire un programme ou une fonction qui prend une chaîne et de produire les instructions qui seraient exécutées si le programme était interprété comme Backhand (vous n'avez pas besoin de gérer de réelles instructions Backhand). Vous devez uniquement sortir jusqu'à ce que le pointeur atterrisse sur le dernier caractère de la chaîne (auquel cas l'exécution devrait normalement revenir en arrière).
Mais attendez , ce n'est pas tout! Lorsque votre programme lui-même est interprété de cette manière, le code résultant doit afficher l'un des éléments suivants:
(Mostly) works
Turing complete
'Recreational'
(les guillemets peuvent être soit'
ou"
, mais pas les deux)Perfectly okay
Only a few bugs
Par exemple, si votre code source est code 2 backhand
, le programme ce cankb od2ahd
doit sortir l'une de ces phrases.
Cas de test:
"1 1 + O @" -> "11+O@"
"1O+1@" -> "11+O@"
"HoreWll dlo!" -> "Hello World!"
"abcdefghijklmnopqrstuvwxyz" -> "adgjmpsvyxurolifcbehknqtwz"
"0123456789" -> "0369" (not "0369630369")
"@" -> "@"
"io" -> "io" (Cat program in Backhand)
"!?O" -> "!?O" (Outputs random bits forever in Backhand)
"---!---!" -> "-!-----!"
Et un programme de référence écrit, bien sûr, Backhand ( cela pourrait être un peu bogué, d' accord, je pense que je l'ai corrigé).
Règles.
- Les échappatoires standard sont interdites
- L'entrée du premier programme ne contiendra que des caractères ASCII et des sauts de ligne imprimables (c'est-à-dire des octets
0x20
-0x7E
ainsi que 0x0A) - Vous pouvez choisir si votre deuxième programme est converti à partir de votre premier octet ou par des caractères UTF-8.
- Deuxième programme:
- La casse n'a pas d' importance, donc votre sortie pourrait l'être
pErFectLy OKay
si vous le souhaitez. - Toute quantité d'espaces de fin / de début (nouvelle ligne, tabulations, espaces) est également correcte.
- Le deuxième programme doit être la même langue que le premier, mais pas nécessairement le même format (programme / fonction)
- Je suis heureux d'inclure des suggestions de commentaires sur des phrases supplémentaires (tant qu'elles ne sont pas trop courtes)
- La casse n'a pas d' importance, donc votre sortie pourrait l'être
- Comme il s'agit de code-golf , votre objectif est d'obtenir la réponse la plus courte pour votre langue!
- Dans deux semaines, j'attribuerai une prime de 200 à la réponse de revers la plus courte.
la source
"---!---!"
(ou toute chaîne où le dernier caractère apparaît plus d'une fois)Réponses:
R , 187 octets
Essayez-le en ligne!
L'espace unique à la fin est nécessaire pour que le
\n
ne soit jamais imprimé lorsque le programme est appliqué à lui-même.Explication
Partie 1:
Non golfé:
Partie 2:
La fonction produit ceci lorsqu'elle agit sur l'ensemble du programme:
la source
Python 2 ,
1631301271211159996 octetsEssayez-le en ligne!
Les sorties:
la source
Perl 6 ,
10186 octetsWow, -25 octets grâce à nwellnhof en améliorant radicalement le premier programme
Essayez-le en ligne!
J'espère que plus de gens profiteront du rebond comme celui-ci. Le programme Backhanded est
Qui commente juste
{"(Mostly) works"}
.la source
05AB1E ,
43403837 octets-2 octets (40 → 38) grâce à @Emigna .
Essayez-le en ligne . (PS: basculez la langue de 05AB1E (hérité) à 05AB1E pour le cas de test
0123456789
. La version héritée est plus rapide, mais elle affiche des résultats incorrects pour les entrées de nombres avec des zéros en tête.)Le programme «en revers» deviendra:
Qui sortira
perfectly okay
en minuscules.Essayez-le en ligne.
Explication du programme de base:
Explication du programme «en revers»:
Pas à pas, les événements suivants se produisent:
„ÃеÝ
: STACK devient["perfectly okay"]
[
: Démarrer la boucle infinieN©
: STACK devient["perfectly okay", 0]
I
: STACK reste["perfectly okay", 0]
parce qu'il n'y a pas d'entrée#
: STACK devient["perfectly okay"]
et la boucle continueN
: STACK devient["perfectly okay", 0]
#
: STACK devient["perfectly okay"]
et la boucle continueN©
: STACK devient["perfectly okay", 1]
I
: STACK reste["perfectly okay", 1]
parce qu'il n'y a pas d'entrée#
: STACK devient["perfectly okay"]
, et la boucle se rompt à cause de1
(véridique)perfectly okay
Voir les étapes ici avec le débogueur sur TIO activé.
Voir cette astuce 05AB1E de la mine (section Comment utiliser le dictionnaire? ) Pour comprendre pourquoi
„€€Ã€„Ѐ€µ'€Ý
sontthe pointed
,dm one
etbeen
et„ÃеÝ
estperfectly okay
.Ancienne version de 38 octets:
Essayez-le en ligne . (PS: basculez la langue de 05AB1E (hérité) à 05AB1E pour les cas de test
0123456789
et@
. La version héritée est plus rapide, mais elle affiche des résultats incorrects pour les entrées de nombre avec des zéros en tête ou des entrées à caractère unique.)Le programme «en revers» deviendra:
(Où
q
quitte le programme et fait tout le reste sans opération.)Essayez-le en ligne.
la source
/
être «\»?N>3*©
au lieu d'XU
enregistrer 2. J'ai également l'impression qu'il devrait y avoir un moyen de faire toutes les impressions dans la boucle, ce qui permettrait d'économiser encore plus d'octets./
aurait dû être\
.. Et merci pour le -2. J'ai en effet le sentiment qu'on peut jouer au golf plus loin. Il semble trop long pour la fonctionnalité de base d'imprimer toutes les 3 valeurs, y compris le rebond.[ûDN3*©è?®IgD#<ÖNĀ*#
sans le if-else au préalable, qui est 2 octets plus court que le if-else avec boucle. Malheureusement, nous avons encore besoin duq
pour le programme en revers, il sera donc également de 38 octets . Mais j'ai le sentiment que la pause peut certainement être améliorée d'une manière ou d'une autre en gardant à l'esprit les entrées à un seul caractère, l'index 0 et la divisibilité par la longueur 1 en même temps ..Python 2 , 130 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 130 octets
Tentative précoce. Pas très satisfaisant.
Essayez-le en ligne!
Lorsque le code est traité par lui-même, les caractères suivants sont isolés:
qui donne:
la source
Gelée , 34 octets
Un programme complet ou un lien monadique acceptant une liste de caractères qui imprime ou donne (respectivement).
Essayez-le en ligne! Ou consultez la suite de tests .
Le code analysé par revers est alors:
Un programme complet ou une impression de lien niladique ou donnant (respectivement) Turing complet .
Comment?
le code analysé par revers est alors:
la source
Enchantements runiques , 294 octets
Essayez-le en ligne!
Version non compressée (et presque lisible):
Essayez-le en ligne!
C'est ... aussi proche que possible.
Pour le comprimer davantage, il faudrait trouver un moyen de gérer les différents points de permutation de boucle sans les faire entrer en collision avec d'autres éléments. La première ligne (qui est la seule partie qui doit être passée en entrée à elle-même) doit rester séparée: la chaîne entière ne peut pas tenir sur la deuxième ligne sans causer de problèmes (
_
pour les espaces requis):Cela
?
ne peut pas être éloigné du!
qui lui-même ne peut pas être éloigné du\
et aucun des messages autorisés n'autorise aucun de ces trois personnages à cette position.L'alternative serait d'utiliser la redirection de flux, mais cela conduit à un problème sur la ligne inférieure:
Comme nous devons éviter le commutateur de boucle dans le programme principal.
Problèmes connus:
abcdefghijklmnopqrstuvwxyz
mais pas l'intégralité de sa propre source). Et il y a une limite quel que soit le nombre de fusions. Peut gérer jusqu'à 58 octets d'entrée tels quels (en outre, l'augmentation du nombre d'adresses IP nécessite de trouver comment les fusionner sans utiliser plus d'espace). Peut contenir deux entrées IP supplémentaires sur la ligne de retour de boucle (à droite deU
sur la ligne commençant\y<<
dans la version non compressée, ou une à gauche sur la ligne au-dessus dey<<
dans la version compressée) augmentant la longueur maximale d'entrée à 78.1\ \ 1\ \ +\ \ O\ \ @
). Il s'agit d'une limitation de l'analyse syntaxique des entrées du langage.0
s (comme lorsqu'il est transformé en nombre sur la pile, le0
est perdu). Encore une fois, limitation de l'analyse syntaxique des entrées du langage.Comment ça fonctionne
Entrée:
Boucle principale (tout ce qui éclate la pile est précédé d'un dup):
@
. Vrai: terminer. (Commande de fin exécutée)Boucle secondaire:
la source