Avertissement: Non, ce n'est pas un défi de plaisanterie pour inverser une chaîne.
Tâche
Il n'y a qu'une seule opération à prendre en charge: soustraction ( -
).
Vous n'avez également que deux atomes à prendre en charge: zéro ( 0
) et un ( 1
).
Ici, la notation préfixe -AB
est équivalente à la notation postfixe AB-
, où A
et B
sont des expressions.
Votre tâche consiste à convertir (récursivement) une expression en notation préfixe en son équivalent en notation postfixée.
Définitions
Une expression en notation de préfixe est générée par la grammaire suivante:
S > -SS
S > 0
S > 1
Une expression en notation postfixée est générée par la grammaire suivante:
S > SS-
S > 0
S > 1
Exemple
Prefix notation: --01-0-01
Parentheses: -(-01)(-0(-01))
Convert: (01-)(0(01-)-)-
Postfix notation: 01-001---
Règles et liberté
- Vous pouvez renommer l'opération et les atomes en n'importe quel caractère, tant qu'il est cohérent.
- Le format d'entrée doit être cohérent avec le format de sortie (à part le fait que l'entrée est en notation préfixe et la sortie est en notation postfixe).
Cas de test
Input Output
1 1
0 0
-01 01-
-10 10-
--01-0-01 01-001---
Testcases crédits à Dada .
Réponses:
brainfuck , 32 octets
Essayez-le en ligne!
J'ai utilisé
@
comme opération, car son point de code (64) est pratique.U
est également possible avec le même nombre d'octets, en utilisant 3 * 85 + 1 = 256 = 0.Explication
La bande est utilisée comme une pile. À chaque itération de la boucle principale, le pointeur de données démarre deux cellules à droite du haut de la pile.
la source
Rétine ,
373029 octetsEssayez-le en ligne! Sauvegardé 7 octets en réalisant que les termes commencent toujours par un chiffre, donc je n'ai plus à limiter la correspondance au dernier
-
(auparavant c'était le seul garanti à être suivi de deux termes). Sauvegardé 1 octet en ne mettant pas-
s sur leur propre ligne. Par exemple,-01
devient-0¶1
qui est ensuite remplacé par01-
. Maintenant, si je dois--010
dire--0¶1¶0
Je veux changer l'intérieur-0¶1
pour01-
que je puisse remplacer le-01-¶0
par01-0-
, mais peu importe lequel des deux-
je supprime, je supprime donc celui au début de la ligne, comme c'est plus facile à tester.la source
-0-0-00
devrait devenir0000---
.Haskell ,
6259 octetsEssayez-le en ligne! Utilisation:
fst.f $ "--01-0-01"
.0
et1
peuvent être des caractères arbitraires plus grands que le caractère-
.Edit: -3 octets grâce à Zgarb!
La fonction
f
analyse récursivement une expression et retourne un tuple de cette expression en notation postfixe et la chaîne restante, en suivant la grammaire simple à partir de laquelle des expressions de préfixe valides peuvent être construites:Si le premier caractère
a
de la chaîne d'entrée est plus grand que-
, nous sommes à une expression atomique et retournons un tuple d'une chaîne avec du caractèrea
et le reste de la chaîne d'entrée.Si nous trouvons a
-
, deux expressions doivent être analysées. Cela peut être réalisé en obtenant(a,x)<-f r
la première expressiona
, puis en analysant àx
nouveau la chaîne de repos(b,c)<-f x
pour obtenir la deuxième expressionb
et la chaîne de repos finalec
.(a,(b,c))<-f<$>f r
fait exactement cela parce que<$>
sur les tuples mappe une fonction deux le deuxième élément d'un tuple tout en étant trois octets plus court que(a,x)<-f r,(b,c)<-f x
. Après avoir obtenu les deux expressions et la chaîne de repos, les expressions sont concaténés et « - » est ajouté:(a++b++"-",c)
.la source
f(x:r)|x>'-'=([x],r)|(a,(b,c))<-f<$>f r=(a++b++"-",c)
f(x:r)|x<'0',(a,(b,c))<-f<$>f r=(a++b++"-",c)|1<3=([x],r)
lorsque j'ai cherché une version avec les deux cas combinés, ce qui est plus long.Haskell, 54 octets
La fonction
v
prend une chaîne et une fonction, réorganise la sous-expression initiale, puis applique la fonction au reste de la chaîne jusqu'à ce que tout soit réorganisé. La pile d'appels et l'argument de fonction conservent ensemble l'expression qui est analysée. La fonctionh
répond au défi et est simplementv
appelée avec elle-même comme premier argument factice.la source
v f l=l
si vous la déplacez en deuxième.v id
.last
tour d'un octet.Perl 5 , 57 octets
J'utilise
x
comme opérateur au lieu de-
(voir le lien TryItOnline ci-dessous).Essayez-le en ligne!
Explications:
/x((?0)|.)((?0)|.)/
correspond récursivement à une expression complète: ax
au début, puis une expression(?0)
(c'est un appel récursif) ou un atome (.
), suivi d'une autre expression-ou-atome.Ensuite, je dois enregistrer la deuxième expression / atom (
my$n=$2;
) car sinon les appels récursifs la remplaceront.La fonction est ensuite appelée récursivement sur la première expression (
f($1)
), puis sur la secondef($n)
, et lax
est ajoutée à la fin (.x
).la source
Python 3,
117112105 1051009876626159 octetsJournal des modifications:
!=
en>
(-1 octet, copié à partir de la suggestion de @ovs)Utilisez-le comme ceci:
la source
return
lambda x:p(x)[0]
pourrait probablement remplacer votref
fonction.else
, je pense .d="-"
vraiment économisé des octets?def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]
pour 59 octetsPyth, 20 octets
Cela crée une fonction
y
qui attend une chaîne comme paramètre.Essayez-le en ligne: démonstration ou suite de tests
Explication:
La fonction
y
analysera et convertira la première expression de préfixe en une expression de suffixe. Donc, si elle est appelée commey"10"
elle ne reviendra que1
.la source
Rétine ,
343129 octetsEssayez-le en ligne!
;
sont utilisés pour indiquer les nœuds, qui sont initialement composés d'un seul numéro, puis deviennent tout ce qui a déjà été analysé.-
sont transformés en nouvelles lignes afin que.+
nous puissions saisir tout ce qui n'est pas un non analysé-
.la source
Perl 6 , 45 octets
Essayez-le en ligne!
la source