Ce défi a été publié dans le cadre du défi LotM d'avril 2018 , ainsi que pour le deuxième anniversaire de Brain-flak
Je réfléchissais à la façon la plus efficace de coder les programmes de brain-flak. La chose évidente à faire, puisqu'il n'y a que 8 caractères valides, est de mapper chaque caractère sur une séquence de 3 bits. C'est certainement très efficace, mais c'est toujours très redondant. Il existe certaines fonctionnalités du code brain-flak dont nous pourrions profiter pour raccourcir l'encodage.
Les nilades, qui sont toutes représentées par 2 parenthèses appariées, agissent vraiment comme une seule unité d'information plutôt que 2. Si nous remplaçions chaque parenthèse par un caractère à un octet, cela rendrait les encodages beaucoup plus petits sans perdre de données.
Celui-ci est moins évident, mais les octets de fermeture des monades sont également redondants. Vous pensez pouvoir deviner ce que les
'?'
personnages représentent dans l'extrait de code suivant?{(({}?<>?<>?
Si nous supposons que l'entrée est un code de flak de cerveau valide, il n'y a qu'une seule option pour chacun de ces points d'interrogation. Cela signifie que nous pouvons sans ambiguïté utiliser un caractère de monade proche pour représenter chaque parenthèse fermante. Cela a l'avantage supplémentaire de garder le jeu de caractères petit, ce qui aiderait grandement si nous voulions utiliser un encodage huffman. Étant donné que le caractère de monade proche sera très probablement le caractère le plus courant sur une large marge, il pourrait être représenté par un seul bit, ce qui est extrêmement efficace.
Ces deux astuces nous permettront de compresser le code brain-flak via l'algorithme suivant:
Remplacez chaque support de fermeture d'une monade par
|
. Ou en d'autres termes, remplacez chaque parenthèse fermante qui n'est pas précédée par son match d'ouverture par une barre. Alors...(({})<(()()())>{})
deviendrait
(({}|<(()()()||{}|
Remplacez chaque nilad par son support de fermeture. Par conséquent, les crochets assortis sans rien utilisent le mappage suivant:
() --> ) {} --> } [] --> ] <> --> >
Maintenant, notre dernier exemple devient:
((}|<()))||}|
Supprimez les
|
caractères de fin . Parce que nous savons que le nombre total de barres doit être égal au nombre total de({[<
caractères, s'il manque des barres à la fin, nous pouvons les déduire. Donc, un exemple comme:({({})({}[()])})
deviendrait
({(}|(}[)
Votre défi pour aujourd'hui est d'inverser ce processus.
Étant donné une chaîne de brain-flak compressée contenant uniquement les caractères (){}[]<>|
, développez-la dans le code original de brain-flak. Vous pouvez supposer que l'entrée se développera toujours en un flak de cerveau valide. Cela signifie qu'aucun préfixe de l'entrée ne contiendra jamais plus |
de ({[<
caractères.
L'entrée ne contiendra pas de |
caractères de fin . Ceux-ci doivent être déduits du contexte.
Comme d'habitude, vous pouvez soumettre un programme complet ou une fonction, et les formats d'entrée / sortie sont permissifs. Et comme il s'agit d'un code-golf , votre code sera marqué par la longueur du code source en octets, plus le score est petit, mieux c'est.
Cas de test
Voici quelques cas de test. Si vous en voulez plus, vous pouvez générer vos propres cas de test avec ce script python et le Wiki Brain-Flak , d'où provient la majorité de ces cas de test.
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}
la source
Réponses:
Brain-Flak ,
952 916818 octets360 octets enregistrés en calculant les parenthèses opposées relativement plutôt qu'à partir de zéro (par exemple
')'
='(' + 1
au lieu de(((5 * 2) * 2) * 2) + 1
)Enregistré 34 octets avec des remplacements directs de DJMcMayhem
10 octets enregistrés en chevauchant le
>]}
code de gestion118 octets enregistrés en dédoublonnant les rouleaux
Économie de 40 octets en profitant de la pile vide pour simplifier le premier rouleau
Sauvegardé 48 octets en marquant EOF avec -1, permettant un code de roulement plus concis
Économisé 36 octets en utilisant le stock équivaut à la logique au lieu de la mienne
98 octets enregistrés grâce à Jo King qui a trouvé un moyen plus efficace de construire la sortie
Essayez-le en ligne!
Golf pour la première fois à Brain-Flak, il y a donc probablement de très grandes améliorations, mais cela fonctionne. Beaucoup de copier / coller pour gérer chaque type de support, et gros grâce au générateur d'entiers automatique et à l'extrait Roll d' ici .
Explication ici , TIO le formate plus facilement
Réponse bonus:
Brain-Flak compressé 583 octets
Essayez-le en ligne!
(Notez que le lien ci-dessus ne fonctionne pas parce que TIO n'a pas d'interpréteur Brain-Flak compressé. Vous pouvez trouver un transpilateur vers Brain-Flak ici )
J'ai vérifié que cela est valide en transpilant vers Brain-Flak à l'aide de cet outil, maintenant suffisamment efficace pour que le délai d'attente soit peu probable.
la source
<>(<()>)
par(<>)
. Vous pouvez également passer(<>{}<>)(<()>)
à(<(<>{}<>)>)
Retina 0.8.2 ,
10398 octetsEssayez-le en ligne! Le lien inclut des cas de test. Edit: enregistré 5 octets avec l'inspiration de @MartinEnder. Explication:
Mettez un
;
crochet après chaque parenthèse fermée et changez-les tous en parenthèses ouvertes, et changez également le|
s en;
sComptez le nombre de parenthèses ouvertes inégalées et ajoutez autant de
;
s.Copiez chaque support d'ouverture dans sa correspondance
;
.Retournez les crochets copiés et supprimez le
;
s.la source
|
quelque chose comme!
. Il ne serait pas même octets frais si vous traduisez>-}
à<-{
(qui je pense donnez
pour|
).z
mais j'ai quand même trouvé un moyen de raser quelques octets de plus.TIS ,
670666 octets-4 octets pour sauter en avant pour sauter en arrière
Code:
Disposition:
Essayez-le en ligne!
Je doute que ce soit le plus petit, mais je ne vois pas de moyen de le réduire. Malheureusement, tous les
NOP
s semblent nécessaires pour le moment, et je ne peux pas mettre la pile où@14
est actuellement en raison de la lecture deANY
dans@11
.La structure de cette solution est la suivante:
En voyant une accolade ouverte, l'ouverture est envoyée le long de la colonne de gauche pour être sortie, et la fermeture est envoyée le long de la colonne de droite à la pile.
En voyant une accolade fermée, l'ouverture et la fermeture sont toutes deux envoyées le long de la colonne de gauche pour être sorties.
En voyant un tuyau, la pile est sautée et envoyée en sortie.
Lors de l'EOF,
@1
commencera la lecture de@2
, au lieu du flux d'entrée de@0
.@2
produit un flux sans fin de tuyaux, de sorte que la pile sera drainée.Une fois l'entrée et la pile épuisées, le programme s'arrête.
Avertissement: en raison des limitations de TIS, la taille de la pile est limitée à 15. Si quelque chose est imbriqué plus profondément que cela, cette implémentation produira un résultat incorrect.
la source
JavaScript (ES6), 107 octets
Prend l'entrée comme un tableau de caractères. Renvoie une chaîne.
Essayez-le en ligne!
la source
Haskell,
127121 octetsEssayez-le en ligne!
Edit: -6 octets en utilisant la fonction de @ Laikoni pour trouver le crochet correspondant .
la source
Rubis , 104 octets
Il s'agit d'un programme complet qui sort sur la console.
(i<5?a:$>)<<r[-i]
doit être l'un des golfs les plus cool que j'aie jamais fait.Essayez-le en ligne!
Ruby , 106 octets
Ceci est ma première solution. Une fonction lambda anonyme qui prend et renvoie des chaînes.
Essayez-le en ligne!
la source
Brain-Flak ,
606 548 496 418 394390 octetsEssayez-le en ligne!
J'ai commencé par jouer à la réponse de Kamil Drakari , mais cela m'a échappé au point où j'ai décidé de l'afficher comme une réponse distincte.
Explication:
Et bien sûr ...
Brain-Flak compressé, 285 octets:
la source
Java 10, 424 octets
C'est un peu long, mais je n'arrivais pas à comprendre comment le raccourcir davantage. C'est un beau défi cependant.
Essayez-le en ligne ici .
Version non golfée:
la source
Python 2,
188184 184180177174173 octetsEnregistré 4 octets grâce à DJMcMayhem.
Essayez-le en ligne!
la source
s
se termine vide. Sinon, vous vous retrouvez avec les caractères supplémentaires à la mauvaise extrémité.Python 3 , 122 octets
Essayez-le en ligne!
la source
Haskell , 152 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
p
implémente un analyseur récursif, qui pourrait être trop efficace pour la grammaire simple.la source
m
pour trouver le support correspondant.Python 2 , 244 octets
Essayez-le en ligne!
Il a fallu plus d'une heure ou deux pour que cela fonctionne ...
la source