Twoim wyzwaniem jest zminimalizowanie kodu Brainfuck zgodnie z następującymi zasadami:
- Usuń wszystko, co nie jest jednym z
+-><[].,
. - Dla każdej grupy z rzędu
+
lub-
znaków, jeśli ilość+
S i-
S jest taki sam, należy je usunąć. - Zrób to samo co powyżej, ale używając
>
i<
. - Usuń sekwencje
+-><
znaków, jeśli nic nie robią. Na przykład powinieneś usunąć+>-<->+<
. (Może to być najtrudniejszy i najtrudniejszy do wdrożenia.) Upewnij się, że nie otrzymujesz żadnych fałszywych alarmów, takich jak+>-<+>-<
, których nie należy usuwać.
Przypadki testowe:
Wkład
++++++[->++++++<]>. prints a $
[-]< resets tape
>,[>,]<[.<] reverses NUL terminated input string
++-->><< does nothing
Wydajność
++++++[->++++++<]>.[-],[>,]<[.<]
Wkład
Should disappear: ++>>+<+++<->-->-<<->-<
Should disappear: +++>-<--->+<
Should stay: +++>-<+>---<
Wydajność
+++>-<+>---<
Możesz zaakceptować wejście i wyjście, jakkolwiek chcesz - stdin / stdout, funkcja itp., Ale wejście może nie być zakodowane na stałe.
To jest golf-golf , więc wygra najkrótszy kod w liczbie znaków.
++>>++<<--
powinien generować>>++<<
, a to nie było objęte. Dodaj więcej przypadków testowych.+++>-<+>---<
? Można go skrócić, aby uniknąć niepotrzebnego ruchu wskaźnika, ale oczekiwany wynik pozostawia go bez zmian. Rozumiem na podstawie zarówno pytania, jak i odpowiedzi, że Klamka jest fajna, a specyfikacja jest luźna; musimy wyeliminować wszelkie ciągłe+-><
sekwencje no-op , jak to wyraźnie zaznaczono, a poza tym dopuszczalne jest dodatkowe minimalizowanie, jak w twoim przykładzie++>>++<<--
, i możemy również dokonywać zmian, o ile nie zmieniają one funkcjonalności kodu, np.>+<+
w+>+<
.+>-<->+<
. (Może to być najtrudniejszy i najtrudniejszy do wdrożenia.) Upewnij się, że nie otrzymujesz żadnych fałszywych trafień, takich jak+>-<+>-<
, których nie należy usuwać ”. - to trochę niejasneOdpowiedzi:
REBEL - 104
Stosowanie:
Wejście: odczytuje jedną linię ze standardowego wejścia.
Wyjście: Drukuje jeden wiersz na standardowe wyjście.
Anomalie *:
_
powoduje odczytanie i użycie kolejnej linii, a nie wyprowadzenie niczego.++++>----<
zamiast+++>-<+>---<
. Ale to w porządku, prawda? ;)>-<+
itp. zastępuje się+>-<
itp.Spojler:
* To nie jest błąd, to jest funkcja!
źródło
Brainfuck, 579 bajtów
Z formatowaniem i kilkoma komentarzami:
Wykorzystuje to to samo podejście, co rozwiązanie Keitha Randalla, minimalizując wszystkie ciągłe sekwencje
+-<>
optymalnie przez symulację. Na przykład+++>-<+>---<
staje się++++>----<
i>+<+<<+>+<->>>>
staje+<+>>+>
.Wypróbuj online. (Jeśli wartość bezwzględna symulowanej komórki zbliży się do 256, wystąpią problemy z przepełnieniem).
Ogólna struktura to
Taśma jest podzielona na 7-komórkowe węzły; na początku wewnętrznej pętli układ pamięci to
0 s 0 c 0 a b
gdzie
s
jest flagą logiczną dla komórki początkowej,c
jest bieżącym znakiem,a
jest ujemną częścią symulowanej wartości komórki (plus jedna) ib
jest dodatnią częścią symulowanej wartości komórki.Podczas drukowania zmniejszonej sekwencji układ pamięci ma postać
d n e 0 0 a b
gdzie
d
jest flagą logiczną dla kierunkua
ib
są takie jak poprzednio (ale stają się jeden / zero po wydrukowaniu)n
ie
są niezerowe dla węzła końcowego;n
jest związany z tym, ile razy węzeł był widziany, ie
jest wartością znaku, który zatrzymał pętlę wewnętrzną (plus jeden).Pierwotnie rozważałem śledzenie większej ilości informacji na węzeł: skrajnie lewy i prawy węzeł jako flagi boolowskie oraz położenie węzła w stosunku do węzła początkowego i końcowego. Ale możemy tego uniknąć, patrząc w razie potrzeby na sąsiednie komórki i wykonując skanowanie lewej i prawej strony w celu znalezienia węzła początkowego.
Podczas drukowania zminimalizowanej sekwencji i decydowania o tym, jak przesunąć symulowany wskaźnik, możemy przyjąć ogólne podejście: zacznij od oddalenia się od węzła końcowego (w dowolnym kierunku, jeśli węzły początkowy i końcowy są takie same), odwróć się w lewo i prawo węzły i zatrzymaj na podstawie liczby wyświetleń węzła końcowego: 3 razy, jeśli węzły początkowy i końcowy są takie same, w przeciwnym razie 2.
źródło
Python, 404 znaków
Ten kod doskonale optymalizuje wszystkie podciągi
+-<>
. Trochę więcej, niż prosiłeś, ale proszę bardzo.Działa poprzez symulację
+-<>
operacji na taśmiet
.s
to pozycja początkowa na taśmie ip
bieżąca pozycja. Po symulacji określa zakres[a,b]
, na którym należy operować, i wykonuje wszystkie +/- w jednym optymalnym przejściu.źródło
CoffeeScript -
403397Demo (proszę wybaczyć użycie bit.ly tutaj, cały URL złamałby przecenę)
Wersja nieskompresowana (z kodem debugowania):
źródło
>+.-<
, wytwarzając pusty ciąg zamiast pozostawiać go bez zmian.