Je parcourais les esolangs et suis tombé sur cette langue: https://github.com/catseye/Quylthulg .
Une chose intéressante à propos de ce langage, c'est qu'il n'utilise pas de préfixe, de suffixe ou d'infixe, il utilise les trois , appelant cela la notation "panfix".
Voici un exemple. Pour représenter infix normale 1+2
dans panfix, il devient: +1+2+
. Remarquez comment l'opérateur est à la fois avant, entre et après les opérandes. Un autre exemple est (1+2)*3
. Cela devient *+1+2+*3*
. Remarquez à nouveau comment se *
trouve dans les trois endroits par rapport aux opérandes +1+2+
et 3
.
Le défi
Comme vous l'avez peut-être deviné, votre tâche dans ce défi est de convertir une expression d'infixe en panfix.
Quelques précisions:
- Vous n'avez qu'à gérer les quatre opérations de base:
+-*/
- Vous n'aurez pas à vous occuper des versions unaires de celles-ci, seulement binaires
- Vous devez gérer les parenthèses
- Supposons les règles de priorité normales d'
*/
alors+-
et d'associativité gauche pour chacun d'eux. - Les nombres seront des entiers non négatifs
- Vous pouvez éventuellement avoir des espaces à la fois en entrée et en sortie
Cas de test
1+2 -> +1+2+
1+2+3 -> ++1+2++3+
(1+2)*3 -> *+1+2+*3*
10/2*5 -> */10/2/*5*
(5+3)*((9+18)/4-1) -> *+5+3+*-/+9+18+/4/-1-*
C'est le code-golf , donc le code le plus court en octets gagne!
la source
S.split``
devrait être[...S]
, même si cela peut réellement aider à faire correspondre à l'/\d+|./g
avance et à travailler à la place.Mathematica,
203195 octetsC'est probablement moins qu'efficace, mais semble faire le travail.
Il s'agit d'une fonction anonyme qui prend une expression réelle et renvoie une chaîne avec la notation panfix. Mathematica trie la priorité des opérateurs au moment de l'analyse, plutôt qu'au moment de l'évaluation, donc l'imbrication doit être correcte automatiquement. Au moins, les cas de test fonctionnent comme prévu.
Explication: Il est assez facile d'interpréter l'expression entière comme un arbre, comme ceci:
À ce stade, les opérateurs (chaque nœud qui n'est pas une feuille) ne sont plus des opérateurs, ils ont en fait été convertis en chaînes telles que
"+"
. Les entiers sont également convertis en chaînes. Ensuite, une règle de remplacement répétée convertit chaque nœud qui a exactement deux feuilles en panfixparent-leaf1-parent-leaf2-parent
. Après quelques itérations, l'arborescence se réduit à une seule chaîne.La principale perte du nombre d'octets est que Mathematica interprète
Et cela se produit également au moment de l'analyse.
Golfé un peu, car le motif
a_/b_
est également interprété commea_ * (b_)^(-1)
. Quelques optimisations mineures ailleurs.la source
Prolog, 87 octets
C'est une fonction (principalement parce que l'écriture d'un programme complet a des niveaux cauchemardesques dans Prolog; normalement, même si vous compilez un programme, elle produit un REPL lors de son exécution), appelée
p
. Il prend l'entrée de stdin et les sorties sur stdout. Notez que vous devez ajouter un point à l'entrée, ce qui est une conséquence malheureuse de la façon dont les routines d'entrée de Prolog fonctionnent (elles utilisent les périodes dans l'entrée de la même manière que les autres langues utilisent les nouvelles lignes); qui pourrait ou non disqualifier la réponse.Explication
Les opérateurs arithmétiques, dans Prolog, sont normalement interprétés comme des constructeurs de tuple . Cependant, ils obéissent aux mêmes règles de priorité que les opérateurs arithmétiques réels sur lesquels ils sont basés; vous pouvez former des tuples avec la notation infixe et
+
et-
lier moins étroitement que*
et/
, avec la priorité prise de gauche à droite dans un groupe. C'est exactement ce que demande la question; ainsi, nous pouvons lire un tuple imbriqué entier à partir de l'entrée, et il a déjà la bonne structure. Voilà ce quip
fait.Ensuite, nous devons le convertir en notation panfix.
x
convertit l'entrée dans une liste panfixed des constructeurs et des entiers, et peut être lu comme une phrase en anglais presque directement: «x
deT
est: siT
un tuple avec le constructeurO
et les argumentsA
,B
puisO
,x
deA
,O
,x
deB
,O
, d' autreT
». Enfin, il suffit d'imprimer la liste sans séparateur (c'est-à-dire en utilisantmaplist
pour appelerwrite
chaque élément de la liste).J'ai utilisé SWI-Prolog pour tester cela, parce que ma version de GNU Prolog n'a pas
maplist
encore (apparemment, il a été ajouté à une version plus récente), mais il devrait généralement être assez portable entre les implémentations de Prolog.la source