Uwaga: Nie, nie jest żartem wyzwanie odwrócenia łańcucha.
Zadanie
Obsługiwana jest tylko jedna operacja: odejmowanie ( -
).
Do obsługi są również dwa atomy: zero ( 0
) i jeden ( 1
).
Tutaj notacja przedrostkowa -AB
jest równoważna notacji postfiksowej AB-
, gdzie A
i B
są wyrażeniami.
Twoim zadaniem jest (rekurencyjnie) konwersja wyrażenia w notacji przedrostkowej na jego odpowiednik w notacji postfiksowej.
Definicje
Wyrażenie w notacji przedrostkowej jest generowane przez następującą gramatykę:
S > -SS
S > 0
S > 1
Wyrażenie w notacji postfiksowej jest generowane przez następującą gramatykę:
S > SS-
S > 0
S > 1
Przykład
Prefix notation: --01-0-01
Parentheses: -(-01)(-0(-01))
Convert: (01-)(0(01-)-)-
Postfix notation: 01-001---
Zasady i wolność
- Możesz zmienić nazwę operacji i atomów na dowolny znak, o ile jest on spójny.
- Format wejściowy musi być zgodny z formatem wyjściowym (poza tym, że dane wejściowe są w notacji prefiksowej, a dane wyjściowe w notacji postfiksowej).
Testcase
Input Output
1 1
0 0
-01 01-
-10 10-
--01-0-01 01-001---
Testuje kredyty dla Dady .
Odpowiedzi:
pieprzenie mózgu , 32 bajty
Wypróbuj online!
Użyłem
@
jako operacji, ponieważ jego punkt kodowy (64) jest wygodny.U
jest również możliwe przy tej samej liczbie bajtów, przy użyciu 3 * 85 + 1 = 256 = 0.Wyjaśnienie
Taśma służy jako stos. W każdej iteracji głównej pętli wskaźnik danych rozpoczyna dwie komórki po prawej stronie stosu.
źródło
Retina ,
373029 bajtówWypróbuj online! Zaoszczędziłem 7 bajtów, zdając sobie sprawę, że warunki zawsze zaczynają się od cyfry, więc nie muszę już ograniczać dopasowania do ostatniego
-
(wcześniej był to jedyny gwarantowany, że po nim następują dwa terminy). Zaoszczędzono 1 bajt, nie umieszczając-
s we własnej linii. Na przykład-01
staje się,-0¶1
który jest następnie zastępowany przez01-
. Teraz, gdy mam--010
IE--0¶1¶0
następnie chcę zmienić wewnętrzna-0¶1
do01-
tak, że mogę wymienić-01-¶0
z01-0-
, ale faktycznie nie sprawa, która z dwóch-
s usunąć, więc mogę usunąć jeden na początku wiersza, jak łatwiej to przetestować.źródło
-0-0-00
Powinien się stać0000---
.Haskell ,
6259 bajtówWypróbuj online! Zastosowanie:
fst.f $ "--01-0-01"
.0
i1
mogą być dowolnymi znakami, które są większe niż znak-
.Edycja: -3 bajty dzięki Zgarb!
Funkcja
f
rekurencyjnie analizuje jedno wyrażenie i zwraca krotkę tego wyrażenia w notacji pofiksowej i pozostałym ciągu, zgodnie z prostą gramatyką, z której można zbudować prawidłowe wyrażenia przedrostkowe:Jeśli pierwszy znak
a
ciągu wejściowego jest większy niż-
, mamy wyrażenie atomowe i zwracamy krotkę ciągu ze znakiema
i resztę ciągu wejściowego.Jeśli znajdziemy
-
, należy przeanalizować dwa wyrażenia. Można to osiągnąć przez(a,x)<-f r
uzyskanie pierwszego wyrażenia,a
a następniex
ponowne przeanalizowanie łańcucha reszt,(b,c)<-f x
aby uzyskać drugie wyrażenieb
i ostatni łańcuch resztc
.(a,(b,c))<-f<$>f r
robi to dokładnie, ponieważ<$>
na mapach krotek funkcja dwa drugi element krotki jest krótsza o trzy bajty(a,x)<-f r,(b,c)<-f x
. Po uzyskaniu zarówno wyrażenia i łańcuch spoczynkowego, wyrażenia są łączone, a „-” oznacza przyłączoną:(a++b++"-",c)
.źródło
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)
kiedy szukałem wersji z obydwoma skrzynkami, która jest dłuższa.Haskell, 54 bajty
Funkcja
v
przyjmuje ciąg znaków i funkcję, porządkuje początkowe podwyrażenie, a następnie stosuje funkcję do pozostałej części ciągu, dopóki wszystko nie zostanie ponownie uporządkowane. Stos wywołań i argument funkcji razem śledzą, jakie wyrażenie jest analizowane. Funkcjah
odpowiada na wyzwanie i jest po prostuv
wywoływana jako pierwszy fałszywy argument.źródło
v f l=l
jeśli przesuniesz ją na drugą.v id
.last
trudniejszy o jeden bajt.Perl 5 , 57 bajtów
Używam
x
jako operatora zamiast-
(patrz poniższy link TryItOnline).Wypróbuj online!
Objaśnienia:
/x((?0)|.)((?0)|.)/
rekurencyjnie dopasowuje pełne wyrażenie: ax
na początku, a następnie wyrażenie(?0)
(jest to wywołanie rekurencyjne) lub atom (.
), a następnie kolejne wyrażenie-lub-atom.Następnie muszę zapisać drugie wyrażenie / atom (
my$n=$2;
), ponieważ w przeciwnym razie wywołania rekurencyjne zastąpią je.Funkcja jest następnie rekurencyjnie wywoływana w pierwszym wyrażeniu (
f($1)
), a następnie w drugimf($n)
, ax
znak jest dołączany na końcu (.x
).źródło
Python 3,
1171121051009876626159 bajtówDziennik zmian:
!=
na>
(-1 bajt, skopiowany z sugestii @ovs)Użyj tego w ten sposób:
źródło
return
lambda x:p(x)[0]
prawdopodobnie może zastąpić twojąf
funkcję.else
, myśli.d="-"
naprawdę oszczędza bajty?def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]
dla 59 bajtówPyth, 20 bajtów
Tworzy to funkcję,
y
która oczekuje łańcucha jako parametru.Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
Funkcja
y
przeanalizuje i skonwertuje pierwsze wyrażenie przedrostkowe na wyrażenie postfiksowe. Więc jeśli zostanie nazwany taky"10"
, jak zwróci tylko1
.źródło
Retina ,
343129 bajtówWypróbuj online!
;
są używane do wskazywania węzłów, które początkowo składają się z jednej liczby, a następnie rozwijają się do wszystkiego, co już zostało przeanalizowane.-
są przekształcane w nowe linie, dzięki czemu.+
możemy pobrać wszystko, co nie jest nierozdzielne-
.źródło
Perl 6 , 45 bajtów
Wypróbuj online!
źródło