Przeglądałem esolangi i trafiłem na ten język: https://github.com/catseye/Quylthulg .
Jedną interesującą rzeczą w tym języku jest to, że nie używa on przedrostka, postfiksa ani poprawki, używa wszystkich trzech , nazywając to notacją „panfix”.
Oto przykład. Do reprezentowania normalnej Infix 1+2
w panfix, staje się: +1+2+
. Zauważ, że operator jest zarówno przed, jak i po operandach. Innym przykładem jest (1+2)*3
. To się staje *+1+2+*3*
. Zauważ ponownie, jak *
jest we wszystkich trzech miejscach w odniesieniu do operandów +1+2+
i 3
.
Wyzwanie
Jak zapewne zgadłeś, Twoim zadaniem w tym wyzwaniu jest konwersja wyrażenia z infix na panfix.
Kilka wyjaśnień:
- Musisz tylko poradzić sobie z czterema podstawowymi operacjami:
+-*/
- Nie będziesz musiał radzić sobie z pojedynczymi wersjami tych, tylko binarnymi
- Musisz poradzić sobie z nawiasami
- Zakładamy normalnych zasad pierwszeństwa
*/
wtedy+-
i lewo skojarzenie dla nich wszystkich. - Liczby będą liczbami całkowitymi nieujemnymi
- Opcjonalnie możesz mieć spacje na wejściu i wyjściu
Przypadki testowe
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-*
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach !
źródło
S.split``
powinno być[...S]
, chociaż może faktycznie pomóc z góry dopasować/\d+|./g
i pracować nad tym.Matematyka,
203195 bajtówJest to prawdopodobnie mniej niż wydajne, ale wydaje się, że wykonuje swoją pracę.
Jest to anonimowa funkcja, która przyjmuje rzeczywiste wyrażenie i zwraca ciąg znaków z notacją panfix. Mathematica odróżnia pierwszeństwo operatorów w czasie analizy, a nie w czasie oceny, więc zagnieżdżanie powinno być automagicznie poprawne. Przynajmniej przypadki testowe działają zgodnie z oczekiwaniami.
Objaśnienie: Łatwo jest zinterpretować całe wyrażenie jako drzewo, na przykład:
Na tym etapie operatory (każdy węzeł, który nie jest liściem) nie są już operatorami, w rzeczywistości zostały przekonwertowane na ciągi znaków, takie jak
"+"
. Liczby całkowite są również rzutowane na ciągi. Następnie reguła powtarzanej zamiany konwertuje każdy węzeł, który ma dokładnie dwa liście do panfixparent-leaf1-parent-leaf2-parent
. Po kilku iteracjach drzewo zmniejsza się do jednego ciągu.Główną stratą w liczbie bajtów jest to, że Mathematica interpretuje
Dzieje się tak również w czasie analizy.
Grałem nieco w golfa, ponieważ wzór
a_/b_
jest również interpretowany jakoa_ * (b_)^(-1)
. Także drobne optymalizacje w innych miejscach.źródło
Prolog, 87 bajtów
Jest to funkcja (głównie dlatego, że napisanie pełnego programu ma koszmarne poziomy bojlera w Prologu; normalnie, nawet jeśli kompilujesz program, po uruchomieniu generuje REPL), wywoływane
p
. Pobiera dane wejściowe ze standardowego wejścia i wyjścia na standardowe wyjście. Zauważ, że musisz dodać kropkę do wejścia, co jest niefortunną konsekwencją sposobu, w jaki działają procedury wprowadzania Prologa (używają kropek w danych w taki sam sposób, jak inne języki używają znaków nowej linii); które mogą dyskwalifikować odpowiedź.Wyjaśnienie
Operatory arytmetyczne w Prologu są zwykle interpretowane jako konstruktory krotkowe . Jednak przestrzegają tych samych reguł pierwszeństwa, co rzeczywiste operatory arytmetyczne, na których się opierają; możesz tworzyć krotki z zapisem infiksowym
+
i-
wiązać mniej ściśle niż,*
i/
z pierwszeństwem od lewej do prawej w grupie. Właśnie o to pyta pytanie; w ten sposób możemy odczytać całą zagnieżdżoną krotkę z wejścia i ma ona już odpowiednią strukturę. Właśnie top
robi.Następnie musimy przekonwertować go na notację panfixową.
x
konwertuje wejście do panfixed listy konstruktorów i całkowitymi i mogą być odczytywane jako zdaniu angielskim prawie bezpośrednio: „x
oT
to: czyT
jest krotką z konstruktoraO
i argumentówA
,B
, a następnieO
,x
zA
,O
,x
zB
,O
, innyT
”. Na koniec musimy po prostu wydrukować listę bez żadnych separatorów (tj. Za pomocąmaplist
wywoływaniawrite
każdego elementu listy).Użyłem SWI-Prolog do testowania tego, ponieważ moja wersja GNU Prolog
maplist
jeszcze nie ma (najwyraźniej została dodana do nowszej wersji), ale ogólnie powinna być dość przenośna między implementacjami Prolog.źródło