Biorąc pod uwagę 2 fragmenty kodu pieprzenia mózgu A
i B
wypisz trochę kodu pieprzenia mózgu, C
który zachowuje się tak samo, jak uruchamianie B
z wejściem A
wyniku s. Zauważ, że C
musi działać dla wszystkich danych wejściowych, które pasują do następujących założeń, tak jakby je podano A
.
Możesz założyć:
- Skończone dane wejściowe.
- zatrzymują się zarówno A, jak i B.
- EOF jest konsekwentnie 0 lub konsekwentnie -1.
- Konsekwentnie zezwól lub nie zezwól komórkom na opuszczenie
- Nieograniczona taśma (w przeciwnym razie wymaganie może być niemożliwe)
- Konsekwentnie 8-bitowe zawijanie lub nieograniczona liczba całkowita
- Żaden strumień (wejściowy lub wyjściowy dla A lub B) nie zawiera bajtu reprezentującego EOF
- Kod A i B mogą zawierać znaki, które prawdopodobnie występują w twoim C, i
+-[]<>,.
Np. (EOF = 0)
A = ,[..,]
B = ,[...,]
C = ,[......,]
A = >,[>,]<[.<]
B = ,[...,]
C = >>>>,[[-<+<+<+>>>]>>>,]<<<<[.<]
A = >,[>,]<[.<]
B = ,[...,]
C = >,[>,]<[...<]
A = ,.
B = ,.
C = ,>,[,]<.
A = ,.
B = ,.
C = ,.
są ważnymi testami
Najkrótszy kod w każdym języku wygrywa. Zwycięzca w Brainfuck zostanie przyjęty.
Shortest code in each language win
iShortest Brainfuck solution will be accepted
są dwoma różnymi kryteriami wygranej.4.Consistently allow or disallow cells to left
. Odpowiedź wiodąca wymaga, aby komórki po lewej stronie w odpowiedzi działały, ale nie zezwalaj, aby A, B i C nie poruszały się po pierwszym bajcie. Moje diody odpowiedzi przesuwają się w lewo w odpowiedzi A, B i C. Jeśli reguły mojego programu i C mogą różnić się od A i B, to z pewnością mogę znacznie skrócić moją odpowiedź.>
s na początku mojej odpowiedzi, aby dostosować ją do bardziej restrykcyjnego smaku (ale w golfa powinniśmy również rozważyć alternatywy). Wydaje mi się również jasne, że A, B i C muszą mieć ten sam smak.Odpowiedzi:
pieprzenie mózgu, 526 bajtów
Sformatowany:
W odniesieniu do A, B i C: EOF = 0, komórki pozostawione od początku są niedozwolone, 8-bitowe zawijanie komórek.
Oczekuje A, a
?
następnie B.Wypróbuj online
(Ta odpowiedź może być zgodna z tłumaczem, który nie pozwala
y/<>/></
odejść od początku kosztem jednego bajta przez transliterację i przygotowanie a>
.)Podstawową ideą jest użycie szeregu zamian ciągów w celu symulacji taśm A i B za pomocą węzłów 2-komórkowych, ze szczególnym uwzględnieniem zamiany
.
w A i,
B, tak aby pośredni strumień danych był przechowywany w bloku komórki po lewej stronie symulowanej taśmy. Schemat zamiany łańcucha to:Wstaw
>>
przed AZarówno A i B, wymienić
>
z>[-]+>
oraz<
z<<
W A, wymienić
.
z>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</
Wstaw
>[>>]+>
po A i przed BW B, wymienić
,
z,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*
źródło
,[>,]<[.<]?,[...,]
12345
zwraca dane wejściowe111
, nawet z wystarczającą ilością>
wcześniej?,[>,]<[.<]
nie jest ważny, ale>,[>,]<[.<]
jest.)>
w razie potrzeby łatwo jest przejść do D.pieprzenie mózgu , 1287 bajtów
Wypróbuj online!
Oto jest! Kod pieprzenia mózgu, który składa się z dwóch kodów pieprzenia mózgu. Użyć "!" aby oddzielić dwa fragmenty kodu wejściowego. Dla Przykładowy fragment A:
>,[>,]<[.<]
,, fragment B:,[...,]
. Wejście do mojego programu:>,[>,]<[.<]!,[...,]
. Nie zakończy się, jeśli nie będzie „!” jest znaleziony.To robi się zasadniczo tak samo jak moja wersja VBA. Generowany kod jest taki sam, jak w wersji VBA (pamiętaj, że przykłady w poście VBA zostały stworzone przed ostatnią zmianą fragmentów „skurwysynu”).
Wyjaśnienie
To jest mój kod źródłowy:
źródło
>[,>]<[.<]!,[...,]
, więc fragment A nic nie wyświetla. Oczywiście musi to być>,[>,]<[.<]!,[...,]
przykład roboczy.VBA,
512489479 bajtówWyjaśnienie
Kod VBA zmienia kod pieprzenia mózgu w taki sposób, że dane wyjściowe fragmentu A zostaną zapisane na liście, a dane wejściowe fragmentu B zostaną odczytane z tej listy.
Najpierw inicjuje niektóre zmienne
Następnie odczytuje fragment A i zastępuje każdy
<
przez<<<[+]-<<
każdy>
przez>>>>>>>[+]-<<
i każdy.
przez procedurę przechowującegonastępnie usuwa pamięć fragmentu A i wprowadza zmiany do listy przechowywanej, dzięki czemu można go odczytać jako dane wejściowe fragmentu B:
Następnie zostanie odczytany fragment B, każdy
<
zostanie zastąpiony przez<<<<<
, każdy>
zostanie zastąpiony przez>>>>>
i każdy,
zostanie zastąpiony procedurą odczytu listy:Kod źródłowy Brainfuck
To jest moje źródło fragmentów kodu, które mają przerobić mózg. Wyjaśnię to szczegółowo później.
Dane wyjściowe dla przypadku testowego 1:
f ",[..,]",",[...,]"
Wypróbuj online!
Dane wyjściowe dla przypadku testowego 2:
f ">,[>,]<[.<]",",[...,]"
Wypróbuj online!
Dane wyjściowe dla przypadku testowego 3:
f ",.",",."
Wypróbuj online!
Złożony przypadek testowy: Fragment A: Zbuduj trójkąt alfabetu
>+++++[<+++++>-]<+[>>[>[.>]]>++++++++++.--[<++++++++>-]<[+.<]<-]>>,>[.>]++++++++++.[<[.<]>,>[.>]<]
Wypróbuj online!Snippet B: Sortuj dane wejściowe w porządku rosnącym
>>,[>>,]<<[[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<]
Wypróbuj online!Wynik:
Wypróbuj online!
źródło
Brainfuck , 785 bajtów
Wypróbuj online!
Zdecydowałem się na podział A z BI
/
.Wyjaśnienie:
Rzeczywisty kod, który generuje ten jest tylko do odczytu pętla z flagą na A / B i przełącznikiem, który redukuje wejście do poszukiwania
>
,<
,/
,,
, i.
, a inaczej po prostu wyjścia do wejścia. W rzeczywistości jest to po prostu transpiler, w którym transpilowany kod żyje w strukturze danych, dzięki czemu nie koliduje z przechowywanymi danymi od A lub siebie nawzajem. Po/
prostu przenosi aktywną komórkę do pierwszej nieużywanej komórki. Pierwotnie go wyczyściłem, ale dzięki temu program i wyjście są większe.Wynik programu ma następujący model pamięci:
c
Jest kruszonką.cz
jest zawsze0
Wskazuje, gdzie w moich emulowanych danych BF jest wskaźnik. Aktywna wartość wynosi -1, podczas gdy wszystkie odwiedzane komórki będą miały1
. W operacjach takich jakaprint
ibread
niektórec
mają specjalne znaczenie.Wydruk kodu A pomija wszystkie komórki 1 bajt, aby zostawić miejsce na jeszcze jeden bajt wejściowy, czyli kopie z kopią zapasową w kolejnych bajtach kruszą się, aby je skopiować.
Odczyt kodu B pobiera dane wejściowe z wejścia. Bycie destrukcyjnym jest w porządku, a kiedy „czytasz” ostatni bajt, dostajesz 0 jako EOF niezależnie od implementacji.
Zacząłem jako kod Extended BrainFuck, dzięki czemu wynik EBF. Większość debugowania przeprowadzono na plikach wynikowych, a następnie zaktualizowano źródło, które je wygenerowało. Potem po prostu uruchamiam operacje niezależnie, aby uzyskać wyjście BF, ale zauważyłem odpowiedź Doriana, która mnie pobiła, więc kontynuowałem grę w źródło EBF dla mniejszych wyników BF. Oryginalne źródło jest dość czytelne i proste w porównaniu do innych rzeczy, które z nim zrobiłem:
źródło
[->+]
w programie C powoduje awarię takich danych wejściowych->->,./,.
i można to naprawić za pomocą[->>+]
(upewnienie się, że wskaźnik zaczyna się na komórce z pożądaną parzystością). Bo[-<+]
myślę, że możesz zmienić schemat nawigacji, aby polegać na tym, że wszystkie wyniki A są niezerowe?->->,.
a B jest,.
, czy Twój preferowany tłumacz wytwarza takie samo C jak TIO i czy C działa zgodnie z oczekiwaniami na twoim tłumaczu? Ponieważ zawodzi w TIO . (Napisałem to w odpowiedzi na komentarz, który został teraz usunięty.)-1
danych użytkownika, ale rzeczywiście zrobiłem to w wierszu „przejdź do aktywnej komórki, wyzeruj to”. Zaktualizowałem swoją odpowiedź, a następnie dodałem bajt: -O, ale przynajmniej działa. BTW. Jeśli nie używam skanowania-1
do podczas pobierania danych wejściowych w B, będę musiał przenieść aktywny bajt z kopią>[-<+]<
a zatem dodam więcej znaków niż zapisuję, zastępując+[-<+]-
je[<]
. Jeśli nie skopiujesz, nie będziesz w stanie wiedzieć, czy bajt, który podałeś, został zakończony i skopiujesz wszystkie bajty.[-<+]
faktycznie dotyczyła również eliminowania błędów (w przeciwieństwie do zapisywania bajtów) dla danych wejściowych, takich jak-./,>++++++[<++++++>-]<.
, które powinny być drukowane,#
a nie%
. :) Ale widzę też okazje do oszczędzania bajtów. Powodzenia! Spróbuję zoptymalizować moje podwójnie nieskończone rozwiązanie do taśm, chociaż zobaczenie, co zrobiłeś, sprawia, że myślę, że może taśma z prawą nieskończonością jest bardziej golfowa.sed, 165 bajtów
W przypadku smaków o EOF = 0, komórki pozostawione od początku są niedozwolone, 8-bitowe owijanie komórek.
Oczekuje programu A w pierwszej linii i B w drugiej linii.
Wypróbuj online
Wykorzystuje 2-komórkowe węzły do symulacji taśm A i B, przy czym dane wyjściowe A zajmują ciągłe komórki po lewej stronie lewego skrajnego węzła.
Alternatywne rozwiązanie 173 bajtów:
Wypróbuj online
Pierwotnie mój projekt był oparty na podwójnie nieskończonej taśmie, która wymagała znacznie więcej pracy, aby przejść w lewo (przenoszenie danych przy przechodzeniu poza poprzednio napotkaną lewą komórkę) i przejście z A do B (czyszczenie danych zamiast tylko przejścia obok prawej skrajnej komórki wcześniej napotkane).
Dzięki Sylwester i Dorian za sztuczki i pomysły.
źródło
,[..,]
i B programu,[...,]
.s/x/>>/g
na samym końcu, ale bardziej interesują mnie ulepszenia, które na razie skrócą dane wyjściowe.