Étant donné l'entrée d'un programme écrit en oOo CODE , indiquez le code BF qu'il représente.
Voici une brève description du fonctionnement de oOo CODE:
Tout d'abord, tous les caractères non alphabétiques sont supprimés (tout ce qui n'est pas dans la plage
A-Za-z
).Par exemple, prenons le programme
PROgRam reVERsES giVeN iNPut sEqUENcE
(un exemple donné sur la page wiki esolangs qui fait exactement ce que vous attendez). Après cette première étape, nous avons maintenantPROgRamreVERsESgiVeNiNPutsEqUENcE
.Ensuite, divisez tous les caractères restants en groupes de 3. Nous avons maintenant
PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE
. S'il existe un groupe de fin de 1 ou 2 caractères, éliminez-le.Convertissez chaque groupe de 3 lettres en une commande BF en fonction du tableau suivant:
ooo > ooO < oOo [ oOO ] Ooo - OoO + OOo . OOO ,
En d’autres termes, si la première lettre d’un groupe est en minuscule, la seconde en majuscule et la troisième en minuscule, la traduction sera renvoyée à la commande
[
.Avec notre exemple, cela devient finalement le programme BF
,[>,]<[.<]+
, qui inverse son entrée.
Puisqu'il s'agit de code-golf , le code le plus court en octets va gagner.
Cas de test:
<empty string> -> <empty string>
A -> <empty string>
Ab -> <empty string>
Abc -> -
AbcD -> -
AbcDe -> -
AbcDef -> --
1A_b%c*D[]e\\\f! -> --
PROgRamreVERsESgiVeNiNPutsEqUENcE -> ,[>,]<[.<]+
la source
Réponses:
oOo,
15691515 octetsCela devait être fait. Essayez ici .
Golfé:
Traduit en Brainfuck (avec des sauts de ligne pour plus de clarté):
Ungolfed avec explication:
Merci pour le défi intéressant!
la source
CJam,
3635 octetsTestez-le ici.
Explication
la source
JavaScript (ES6),
949391858483 octetsSauvegardé 1 octet grâce à @ dev-null
J'ai essayé de nombreuses variantes, mais cela semble être la plus courte. Fonctionne également sur une entrée vide!
Comment ça fonctionne
Tout d’abord, avec
x.replace(/[a-z]/gi,c=>
, on trouve prendre chaque lettrec
dans l’entrée. Nous fixonsa
etb
à""
l'autre extrémité de l'appel de fonction, la fonction ne tient pas compte des paramètres passés du second.a
stockera une chaîne binaire pour déterminer le caractère que nous sommes en train de créer etb
stockera le résultat.Maintenant , pour la partie source de confusion: d' abord, avec
(a+=+(c<'a'))
, nous ajoutons un0
àa
sic
est en majuscules;1
autrement. Cette expression renvoie la nouvelle valeura
, donc nous pouvons vérifier si elle a atteint trois caractères de longueur avec en vérifiant si le caractère à l' index 2 existe:[2]?
. Sinon, nous terminons simplement la fonction avec:0
.Si
a
est maintenant trois caractères de long, c'est un nombre binaire entre000
et111
. Nous pouvons convertir cela en nombre décimal en ajoutant"0b"
au début, puis en forçant le moteur à l'analyser sous forme de nombre'0b'+a-0
.Cependant, nous devons toujours réinitialiser
a
la chaîne vide. Nous ne pouvons pas simplement faire'0b'+(a="")-0
parce que cela voudrait dire que la chaîne analysée est juste0b
. Heureusement, quand elle est analysée sous forme de nombre, la chaîne vide devient 0, nous pouvons donc remplacer le0
avec(a="")
.Maintenant , nous avons notre numéro et nous pouvons simplement ajouter le caractère à cet indice
"><[]-+.,"
pourb
. Une fois le remplacement effectué, nous l’utilisons&&b
pour le renvoyer depuis la fonction. (Eh bien, à moins que le résultat de.replace
soit vide, cela ne se produit que sur une entrée vide et retourne de toute façon la chaîne vide.)la source
'0b'+a-0
vs+`0b${a}`
and+("0b"+a)
replace
gagne après tout!match
piste ...05AB1E ,
3532 octetsCode:
En utilisant une astuce très intelligente de Martin Büttner, tirée de cette réponse . Explication:
Essayez-le en ligne!
Utilise le codage CP-1252 .
la source
Retina ,
79757170 octetsMerci à randomra pour avoir sauvegardé 1 octet.
Essayez-le en ligne!
Explication
Nous commençons par enlever tout ce qui n'est pas une lettre.
Cela divise la chaîne en morceaux de trois caractères en renvoyant toutes les correspondances à 3 caractères (ne se chevauchant pas). Ceci jette automatiquement tout morceau de fin incomplet.
Ajoutez un
;
à chaque ligne. Nous utiliserons cela comme marqueur pour la conversion en base 2. En parlant de cela, nous allons simplement traiter les lettres majuscules comme des lettres1
minuscules0
.Cela fait une conversion amusante base-2 à unaire. A chaque étape, nous doublons simplement les caractères restants
;
et déplaçons;
celui vers la droite. Pourquoi ça marche? N'oubliez pas que nous interprétons les minuscules comme0
majuscules1
. Chaque fois que nous traitons une lettre, nous doublons simplement le total cumulé (à gauche) jusqu'à présent - les doubles lettres minuscules sont justes2*0=0
, elles peuvent donc être complètement ignorées et les majuscules représentent le nombre binaire jusqu'à présent; il est donc double de les doubler. ce que nous voulons. Ensuite, nous ajoutons la lettre actuelle à ce total courant qui représente0
ou1
correspond.Supprimez toutes les lettres minuscules / zéros.
Faites correspondre chaque ligne et remplacez-la par le nombre (décimal) de caractères de cette ligne. En raison de
;
cela, le nombre unaire devient son équivalent décimal + 1.Translittération qui substitue 1-8 avec la commande correspondante.
Supprimer les retours à la ligne.
la source
;
. Je vais éditer ça plus tard.MATL ,
3832 octetsEssayez-le en ligne!
la source
Japt,
3736 octetsTestez-le en ligne!
Comment ça fonctionne
la source
JavaScript (ES6),
11195 octetsSupprime simplement les non-lettres, convertit les majuscules en 1 et les minuscules en 0, se divise en groupes de trois, ignore un dernier groupe de 1 ou 2 et décode les groupes.
Edit: 16 octets enregistrés grâce à @ dev-null, bien que le code ne fonctionne plus lorsqu'il est transmis à la chaîne vide.
la source
match(/.../g).map().join
approche, mais j'avais mal calculé le nombre d'octets et cela ne m'a pas épargné. Merci pour le conseil sur le premier match cependant.Python 3, 91 octets
Hmm ... a l'air un peu long, surtout la deuxième ligne.
b=[b,2*b+(c<'a')][c.isalpha()]
est légèrement pire cependant.la source
Pyth, 40 octets
Essayez-le ici!
Pourrait économiser 2 octets si je peux sortir le résultat sous forme de liste de caractères au lieu d’une chaîne.
Explication
Filtre toutes les lettres, convertit les majuscules en 1 et les minuscules en 0, se divise en morceaux de 3, interprète chaque morceau comme un nombre binaire et l'utilise comme index en une chaîne contenant toutes les commandes BF.
la source
Jolf,
3134 octetsEssayez-le ici! Remplacer
►
par\x10
et♣
avec\x05
. Comme j'ai mal implémenté la fonction de hachage, je gagne 3 octets. :(la source
Hoon , 212 octets
Ungolfed:
Hoon ne possède pas d'expressions régulières appropriées, il ne dispose que d'une bibliothèque de combinateurs d'analyseurs syntaxiques, ce qui en fait un très joli mot. ++ scan se bloque également si l'ensemble du flux d'entrée n'est pas analysé. Je dois donc utiliser ++ rose, le contraindre en une unité et le décompresser pour obtenir la valeur "d'analyse la plus éloignée". Il utilise également beaucoup le currying et le mappage sur les listes (++ turn), aussi alias les noms de fonctions avec des variables d'une lettre.
Hoon est le langage de programmation d'Urbit, un projet de réimplémentation de table rase. Il est purement fonctionnel, typé statiquement, vaguement semblable à un lisp et compile pour Nock. Nock est une machine virtuelle basée sur un combinateur qui s'exécute sur un modèle de mémoire bignum d'arbre binaire.
Lorsque vous démarrez Urbit, vous êtes dans: Dojo, le shell et Hoon repl. Pour exécuter l'extrait, tapez simplement:
puis collez la fonction autonome sur la ligne suivante.
la source
Gelée , 27 octets
Essayez-le en ligne! Notez que les barres obliques inverses doivent être échappées dans la chaîne d'entrée pour l'avant dernier cas de test.
la source
Matlab, 98 octets
la source
Perl,
767372 + 1 = 73 octetsNécessite le
-n
drapeau:Utiliser le truc avec la conversion en base 2 .
Comment ça fonctionne:
la source
Julia, 107 octets
Il s'agit d'une fonction anonyme qui accepte une chaîne et retourne une chaîne. Pour l'appeler, assignez-le à une variable.
Ungolfed:
la source
Lua, 120 octets
Une utilisation importante d’
string.gsub()
ici, une fois de plus aurait pu me permettre de créer un pointeur à un caractère sur cette fonction pour obtenir des octets. C'est aussi mon premier programme lua sans espace! :RÉCe programme prend son entrée via un argument de ligne de commande et génère un programme BrainFuck, une commande par ligne.
Edit: 1 octet enregistré grâce à @Oleg V. Volkov
Ungolf et explications
la source
b
et un autre sur l'enregistrementstring.gsub
dans un fichier var plus court et le pliage manuel des premiers arguments:g=("").gsub g(g(g(g(arg[1],"[%A]",""),"%l",0),"%u",1),"...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)
Python 2, 112 octets
Je vais essayer de jouer au golf plus.
la source
Mathematica, 192 octets
Fonction anonyme qui prend la chaîne souhaitée en argument. Étapes de l'algorithme (assez simple):
la source
Ruby
1171141131118679 octetstr(?^+m='a-zA-Z','')
met m à'a-zA-Z'
et supprime les non-lettres.tr(m,?0*26+?1)
convertit les minuscules en 0, les majuscules en 1.scan(/.../)
divise la chaîne en groupes de 3 et élimine le dernier groupe s'il en a moins de 3{$><<"><[]-+.,"[$&.to_i 2]}
convertir chaque nombre binaire en un caractèrela source
tr("a-zA-Z","01")
? ou mêmetr("A-Za-z",10)
"AAz".tr("a-zA-Z","01")
donne111
gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
(86 octets). Modification de l'option d'entrée de ligne de commande en stdin; correction des guillemets dans la sortie (mais maintenant, il n'y a plus de fin de ligne)tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)
est plus courtePerl 6, 81 octets
Cela peut probablement être mieux fait, mais c'est mon tour
Usage
Ungolfed
la source
C ++,
173167 octetsProgramme complet, joué au golf (lecture de l'entrée standard):
Un peu non-golfé:
Notez que
@A
...Z[
en ASCII, et même pour`a
...z}
.la source
Japt v2.0a0
-P
, 27 octets3 octets sauvés grâce à @Shaggy
L'essayer
la source
Pyke, 31 octets, non compétitif
Pyke est plus vieux que le défi, mais j’ai ajouté quelques fonctionnalités pour le rendre plus compétitif - fonction de bloc. J'ai utilisé le même truc que @Martin Büttner .
Essayez-le ici!
la source
JavaScript, 148 octets
la source
TI-BASIC,
311288 octetsQuoi, pas de réponses TI-BASIC? Il est temps que je répare ça!
L'entrée est le code oOo dans
Ans
.La sortie est le code BF traduit .
Exemples:
Un-golfed:
(Newlines et commentaires ajoutés)
Remarques:
la source