Étant donné une entrée de n'importe quel programme Glypho valide, sortez son équivalent "lisible par l'homme".
Le glypho est une idée esolang intéressante:
La référence d'instruction est donnée ici. Pour chaque instruction, les caractères abcd représentent les symboles composant chaque instruction. a fait référence au premier symbole unique, b fait référence au deuxième symbole unique, etc.
aaaa ..... n NOP - no operation; do nothing aaab ..... i Input - push input onto top of stack aaba ..... > Rot - pops top stack element and pushes to bottom of stack aabb ..... \ Swap - swaps top two stack elements aabc ..... 1 Push - pushes a 1 onto the top of stack (creates new element) abaa ..... < RRot - pops bottom element and pushes to top of stack abab ..... d Dup - Duplicates top stack element abac ..... + Add - pops top two elements and pushes their sum abba ..... [ L-brace - skip to matching ] if top stack element is 0 abbb ..... o Output - pops and outputs top stack element abbc ..... * Multiply - pops top two elements and pushes their product abca ..... e Execute - Pops four elements and interprets them as an instruction abcb ..... - Negate - pops value from stack, pushes -(value) abcc ..... ! Pop - pops and discards top stack element abcd ..... ] R-brace - skip back to matching [
(crédit: Brian Thompson alias Wildhalcyon)
Ainsi, par exemple, PPCG
représenterait l' instruction Push -PPCG
correspond au modèle aabc
, où a
représente P
, b
représente C
et c
représente G
.
L'entrée sera une chaîne unique composée uniquement de caractères ASCII imprimables. Il aura toujours une longueur divisible par quatre (duh).
La sortie est chaque groupe de quatre caractères de la chaîne d'entrée remplacé par l'instruction qu'ils désignent. Utilisez les noms d'instructions à une seule lettre (ceux juste après les cinq points dans le tableau cité ci-dessus).
Puisqu'il s'agit de code-golf , le code le plus court en octets gagnera.
Cas de test:
In Out
------------------------------------------------
Programming Puzzles & Code Golof ]!]!]]]+
nananananananana batman! dddd]]
;;;;;;;:;;:;;;:: ni>\
llamas sleep 1-*
8488133190003453 <[oe
<empty string> <empty string>
Réponses:
Pyth,
373534 octetsLe code contient des caractères non imprimables, voici donc l'
xxd
hexdump:Voici une version imprimable à 36 octets:
Essayez-le en ligne. Suite de tests.
Explication
la source
CJam,
423935 octetsEnregistrement de 4 octets en empruntant l'idée de user81655 d'utiliser la base 3 au lieu de la base 4.
Exécutez tous les cas de test.
Il doit y avoir un meilleur moyen de compresser la table de recherche des commandes ...
la source
JavaScript (ES6), 97
Pour chaque bloc de 4 caractères, je remplace chaque symbole par sa position dans le bloc, obtenant un nombre de base 4. Par exemple
'aabc' -> '0023'
. Les nombres possibles sont compris entre 0..0123, c'est-à-dire 0..27 en décimal. J'utilise le nombre comme index pour trouver le bon caractère d'instruction à partir d'une chaîne de 28 caractères.Tester
la source
MATLAB, 291 octets
J'ai longtemps hésité si je devais engager ma réponse. Je jouais juste avec MATLAB. Je suis conscient qu'il n'est pas vraiment possible de générer du code dense (un faible nombre d'instructions / octets; environ 3 fois plus gros que vos solutions de ~ 100 octets) et que MATLAB n'est peut-être pas trop approprié pour le golf de code et je suis nouveau dans le golf de code . Mais je voulais simplement essayer, et le code fonctionne (caractères de nouvelle ligne conservés). Tous les indices sont les bienvenus. : P
la source
JavaScript (ES6),
115101 octets14 octets enregistrés grâce à @ edc65 !
Explication
Stocke la liste des instructions dans une chaîne avec chaque caractère à son index base-3. Par exemple,
+
correspond àabac
ce qui peut être représenté en base 3 comme0102
, ou11
en décimal. La seule instruction qui ne peut pas être représentée en base-3 est]
, mais avec l'algorithme utilisé pour calculer le nombre en base-3, il finit commodément par devoir être à la position 18 à la fin de la chaîne.Tester
Afficher l'extrait de code
la source
parseInt
et calculer le nombre avec une somme répétée et multiplier. Cela évite le problème avec '0123' qui n'est pas valide en base 3 mais donne 1 * 9 + 2 * 6 + 3 == 18 qui est une bonne position. Résultat:F=s=>s.replace(/..../g,g=>"ni]>\\1 <d+[o*e-!]"[[...g].map(c=>r=r*3+(m[c]=m[c]||++i)-1,r=i=0,m={})|r])
Python 2, 158 octets
Prend l'entrée comme
"test"
. La sortie est une liste de caractères.Essayez-le en ligne
Non golfé:
la source