Pochodna Brainfuck
Zdefiniujmy prosty język programowania podobny do Brainfuck . Ma dwukierunkową taśmę komórek, a każda komórka zawiera jeden bit. Wszystkie bity mają początkowo wartość 0. Na taśmie porusza się głowa, początkowo w pozycji 0. Program to ciąg znaków nad znakami <>01!
, wykonywany od lewej do prawej, z następującą semantyką:
<
przesuwa głowę o krok w lewo.>
przesuwa głowę o krok w prawo.0
wstawia 0 w bieżącej komórce.1
wstawia 1 do bieżącej komórki.!
odwraca bieżącą komórkę.
Nie ma pętli, więc program n znaków kończy się dokładnie po n krokach. Program jest nudny, jeśli wszystkie komórki zawierają 0 na końcu wykonywania, i ekscytujący, jeśli jest co najmniej jeden. Zauważ, że rozmiar taśmy nie jest określony, więc w zależności od implementacji może być dwukierunkowy nieskończony lub okólnik.
Przykładowy program
Rozważ program 1>>>!<<<<0>!>>>!
. Na nieskończonej taśmie wykonanie przebiega w następujący sposób:
v
00000000000000 Put 1
v
00000100000000 Move by >>>
v
00000100000000 Flip
v
00000100100000 Move by <<<<
v
00000100100000 Put 0
v
00000100100000 Move by >
v
00000100100000 Flip
v
00000000100000 Move by >>>
v
00000000100000 Flip
v
00000000000000
Na koniec wszystkie komórki mają wartość 0, więc ten program jest nudny. Teraz uruchommy ten sam program na okrągłej taśmie o długości 4.
v
0000 Put 1
v
1000 Move by >>>
v
1000 Flip
v
1001 Move by <<<< (wrapping around at the edge)
v
1001 Put 0
v
1000 Move by > (wrapping back)
v
1000 Flip
v
0000 Move by >>>
v
0000 Flip
v
0001
Tym razem jest komórka o wartości 1, więc program jest ekscytujący! Widzimy, że to, czy program jest nudny czy ekscytujący, zależy od rozmiaru taśmy.
Zadanie
Twoje dane wejściowe to niepusty ciąg znaków <>01!
reprezentujący program w powyższym języku programowania. Tablica znaków jest również dopuszczalnym formatem wejściowym. Program na pewno będzie nudny, gdy zostanie uruchomiony na nieskończonej taśmie. Twój wynik będzie listą długości taśm, na których program jest ekscytujący. Pamiętaj, że musisz przetestować program tylko na taśmach krótszych niż długość programu.
Zwycięzcą jest rozwiązanie o najniższej liczbie bajtów w każdym języku. Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
> : []
110 : []
1>0<! : [1]
0>>1>0<<>! : [1]
1>>>!<<<<0>!>>>! : [2, 4]
!<!<><<0>!>!<><1!>>0 : [2]
>>!>><>001>0<1!<<!>< : [1, 2, 3]
1!><<!<<<!!100><>>>! : [1, 3]
!!1>!>11!1>>0<1!0<!<1><!0<!<0> : [3, 4]
<><<>>!<!!<<<!0!!!><<>0>>>>!>> : [1, 2, 4]
0>>><!<1><<<0>!>>!<<!!00>!<>!0 : [3]
0000!!!!><1<><>>0<1><<><<>>!<< : []
!>!>!>!>!>1>!>0<!<!<!<0<!<0<!<!<!<1>!>0<<! : [1, 2, 5, 7]
<!!>!!><<1<>>>!0>>>0!<!>1!<1!!><<>><0<<!>><<!<<!>< : [1, 2, 4, 5]
!>1<<11<1>!>!1!>>>0!!>!><!!00<><<<0<<>0<<!<<<>>!!> : [1, 2, 3, 5, 6]
<>01!
?Odpowiedzi:
Haskell, 119 bajtów
Wypróbuj online!
Funkcja
#
jest tłumaczem pojedynczego poleceniac
. Cały programp
jest uruchamiany przezfold
włożenie#
taśmy początkowej dop
.f
wykonuje sięp
dla każdej taśmy i zachowuje te, w których suma komórek wynosi co najmniej 1.źródło
n<-[1..length p] ... 0<$[1..n]
wydaje się dość długa, musi być krótsza droga.n
jako wyniku, więc jeśli skonstruowałeś0<$[1..n]
inny sposób (powiedzmy zscanr(:)
), musisz wziąćlength
to. (Próbowałem też za pomocą1
(wymienićlength
zsum
) lubFalse
(by użyćor
do testu) zamiast0
, ale to nie wyjdzie krótszy.)n<-init$scanr(:)[]$0<$p ... n
który jest o 2 bajty krótszy, ale zwraca listę początkowych taśm zamiast ich długości, np[[0],[0,0,0]]
. Przy odrobinie wyginania reguł mógłbym zobaczyć taśmy jako liczby jednoargumentowe, więc może jest w porządku.init$
można go zastąpić umieszczeniem[0]
listy początkowej, ale wciąż nie była wystarczająco krótka. Myślę, że jednoargumentowe jest dozwolone tylko w przypadku języków bez bardziej naturalnej reprezentacji liczb .Stax ,
5654433835 bajtów CP43742 bajty po rozpakowaniu,
Uruchom i debuguj online!
-2 bajty na komentarz przez @recursive
Wyjaśnienie
Użyję wersji z prefiksem
i
(tj.i%fz(y{{|(}{|)}{B!s+}{0_]e&}4ls"><! "I@!F|a
), Aby wyjaśnić i wyjaśnię, dlaczegoi
można ją usunąćKod do uruchomienia programu:
źródło
i
czeku.0]*
można zastąpićz(
. Ponadto, jeśli zmienisz ciąg znaków na „<>!”, Wtedy0
i1
da indeks -1, więc w ten sposób twoja lista bloków potrzebuje tylko 4 bloków zamiast 5. To zadziała, ponieważ0
i1
handlery i tak są identyczne.CJam ,
57564946 bajtów-7 dzięki @MartinEnder
Wypróbuj online!
źródło
Perl 5 ,
83827977 bajtówObejmuje
+3
dla-F
Podaj instrukcje jako jedną linię na STDIN
Wypróbuj online!
źródło
Perl 5 (
-F
), 101 bajtówWypróbuj online!
źródło
Czerwony , 243 bajty
Wypróbuj online!
Prety pełne i proste wdrożenie. 1-indeksowanie Reda nie pozwala mi zmniejszyć liczby bajtów przy użyciu arytmetyki modułowej do zapętlania okrągłych taśm.
Bez golfa
źródło
Python 2 ,
139135133132131 bajtów-3 bajty dzięki Mr. Xcoder
Wypróbuj online!
źródło
Siatkówka , 121 bajtów
Wypróbuj online! Wyjaśnienie:
Utwórz tablicę taśm o każdej długości do długości programu wejściowego.
Pętla, aż program zostanie zużyty.
Jeśli następnym znakiem w programie jest 0 lub 1, zmień pierwszy znak w każdym wierszu na ten znak.
Jeśli jest
!
to, przełącz pierwszy znak w każdej linii.Jeśli jest to
>
czy<
następnie obrócić linię. (Łatwiejsze niż poruszanie głową.)Usuń instrukcję i zakończ pętlę.
Zachowaj tylko ekscytujące linie.
Policz długość każdej linii.
źródło
JavaScript (ES6),
126118 bajtówZaoszczędzono 3 bajty dzięki @ user71546
Pobiera dane wejściowe jako tablicę ciągów 1 znaków.
Wypróbuj online!
źródło
t.some(x=>x)?
na+t.join``?
zamiast tego sprawdź tablicę jako cyfry (a 0 oznacza całkowicie zerową taśmę), ale o 3 bajty mniej.APL (Dyalog Unicode) ,
796454 bajtów ( SBCS Adáma )Wypróbuj online!
-15 dzięki Adámowi (zapomniałem o monadic
⍸
).-10 dzięki ngn .
źródło
↓
). Zajrzę do niego i zaktualizuję. :)↓
, będziesz potrzebować;
, nie?MATL ,
4639 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Jak to działa
źródło
APL (Dyalog Unicode) ,
19278 bajtówWypróbuj online! (nie spłaszczony wynik)
Wypróbuj online! (spłaszczony)
Po pewnym czasie walenia głową w ścianę postanowiłem zrobić Tradfn zamiast Dfn. To jest wynik. Mądrzejsi ludzie ode mnie mogą grać w golfa.Niespodzianka, niespodzianka, ktoś mądrzejszy ode mnie nie grał w golfa. Dziękuję Adám za 114 bajtów.
Powiedział:
Funkcja zakłada
⎕IO←0
.W jaki sposób?
(W tym objaśnieniu użyto wersji „bez golfa”, aby ułatwić czytanie)
źródło
t←l⍴0
bet←l⍴i←0
i usuwając linię nad nim. Możesz także zapisać inny, zmieniająct[i|⍨≢t]←1-t[i|⍨≢t]
nat[i|⍨≢t]←~t[i|⍨≢t]
.∇
s?∇
s? Jest to funkcja ukryta.Galaretka , 41 bajtów
Wypróbuj online!
źródło
C (clang) , 171 bajtów
Wypróbuj online!
Musiałem użyć clang, ponieważ użycie
char*p,t[l=strlen(S)]
z jakiegoś powodu wyrażenia inicjującego powoduje, że GCC myśli, że chcę zadeklarowaćstrlen
zamiast go wywoływać.Całkiem proste: uruchamia program na okrągłych taśmach o malejącej długości, generując dowolną długość, która dawała 1 gdzieś na taśmie.
Próbowałem skrócić plątaninę operatorów trójskładnikowych, ale ostatecznie potrzebowałem więcej nawiasów niż było to zdrowe.
źródło
i=0,bzero(t,l)
zamiastmemset(t,i=0,l)
i*p-62?t[i]=*p^33?*p-48:t[i]^1:(i=~i+l?i+1:0)
zamiast*p==62?i=i^l-1?i+1:0:*p^33?t[i]=*p-48:(t[i]^=1)