Wyzwanie
Napisz program lub funkcję, która podała ciąg znaków, zwraca prawidłowy program Brainfuck, który po skompilowaniu i wykonaniu jako Brainfuck zwraca ten ciąg ..
Załóżmy, że wszystkie dane wejściowe są zakodowane jako ASCII.
Załóżmy, że wyprowadzony program BF wykona się w środowisku z nieskończoną taśmą.
Załóżmy, że wskaźnik zaczyna się od komórki 0, a każda komórka jest inicjowana na wartość zero.
Każdy przykład poniżej reprezentuje jedno możliwe prawidłowe wyjście dla danego wejścia. W szczególności przykłady obejmują dodatkowe znaki nowej linii i spacje, aby poprawić czytelność dla ludzi. Rozwiązania mogą dowolnie formatować wygenerowany kod BF.
Taśma jest podwójnie nieskończona.
Wszystkie komórki dostarczone przez interpreter są dokładnie 8-bitowymi komórkami. Przepełnienie i niedopełnienie zawijają się w przewidywalnej i zdrowej materii.
Przykłady
Ciąg spacji
Biorąc pod uwagę dane wejściowe , twój program / funkcja może zwrócić:
+++++ +++++
+++++ +++++
+++++ +++++
++ .
Wykrzyknik
Biorąc pod uwagę dane wejściowe !
, twój program / funkcja może zwrócić:
+++++ +++++
+++++ +++++
+++++ +++++
+++
.
Dwa listy
Biorąc pod uwagę dane wejściowe hi
, twój program / funkcja może zwrócić:
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
++++
.
+
.
To jest code-golf , więc wygrywa kod z najmniejszą liczbą bajtów. Powodzenia.
Odpowiedzi:
Galaretka , 8 bajtów
Wypróbuj online!
Przykładowy przebieg
Do wprowadzenia
hi
program ten drukuje(bez wysuwu linii), który z kolei drukuje
hi
.Jak to działa
źródło
.>
pojawia się na wyjściu?p
) jest krótszy niż dołączany do każdego (;€
). Te programy wyjściowe podwajają komórkę po wydrukowaniu i przed przełączeniem. Ponieważ nigdy nie odwiedzamy komórki, nie wpływa to na wynik.Brainfuck,
5551 bajtówWypróbuj online!
Przykładowe dane wyjściowe dla
hi
(bez kanałów):Wyjaśnienie
Porusza się po taśmie podczas pisania programu. Otoczenie
,[...,]
to standardowa pętla wejściowa. Do każdej postaci używamy czterech komórek:gdzie
x
jest komórka, do której zapisujemy dane wejściowe.Ta część wykorzystuje komórkę
a
zapisuje21
komórkęb
za pomocą standardowego mnożenia3
i7
.Teraz używamy że
21
pisać42
naa
i63
podc
poprzez pomnożenie przez2
i3
odpowiednio. Następnie<+<
przesuwa się z powrotem do komórkix
, zamieniając ją42
w43
(punkt kodowy+
). Podsumować:Teraz główna pętla wyjściowa:
Oznacza to, że podczas zmniejszania
x
drukujemy jeden za+
każdym razem.Po zakończeniu ponownie używamy
+
komórkę, dodając „3
daj”.
.Wreszcie przechodzimy do
63
, zmniejszamy do62
(>
) i wyprowadzamy również. Następna iteracja użyje tej komórki jakox
.źródło
Brainfuck,
39333231 bajtówAlgorytm, który umieszcza 45 na taśmie jest pobierany ze stałych Brainfuck Esolanga .
Ta odpowiedź zakłada, że interpreter programu wyjściowego ma zawijane, ograniczone komórki; i to
,
zeruje bieżącą komórkę (co oznacza, że program wyjściowy jest uruchamiany bez danych wejściowych). Wypróbuj online!Aby uzyskać (dłuższe) rozwiązanie, które działa bezwarunkowo, zobacz moją drugą odpowiedź .
Testowe uruchomienie
Dla danych wejściowych
Code Golf
generowane są następujące dane wyjściowe.Wypróbuj online!
Jak to działa
Zaczynamy od podania liczby całkowitej 45 (kod znaku
-
) w komórce taśmy. Poniższy kod osiąga to.Zanim wejdziemy w pętlę, taśma wygląda następująco.
Te trzy komórki - -2 , -1 i 0 - są jedynymi, których użyjemy w tym programie.
W pierwszej każdej iteracji pętli najbardziej prawą komórką jest, następnie komórka i środkowa komórka są dwukrotnie zmniejszane, pozostawiając następujący stan.
W następnych 126 iteracjach początkowy
-
zmniejsza komórkę środkową,[>]<
przeskakuje do komórki znajdującej się najbardziej na prawo i--<--
zmniejsza komórkę środkową i prawą. W rezultacie 3 odejmuje się od środkowej komórki (modulo 256 ) i 2 jest odejmowane od prawej komórki.Ponieważ 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 i 252 ÷ 3 = 84 , skrajna prawa komórka jest zerowana przed środkową, pozostawiając następujący stan.
Podobnie jak w pierwszej iteracji pętli, kolejna iteracja odejmuje teraz 3 od środkowej komórki i 2 od lewej komórki, umieszczając głowę na lewej komórce.
Kolejne iteracje, podobnie jak w iteracji 126 przed nimi, odejmij 3 od komórki skrajnie lewej i 2 od komórki skrajnie prawej.
Ponieważ 254 ÷ 3 (mod 256) = 170 i 129 ÷ 2 (mod 256) jest niezdefiniowany, odbywa się to 170 razy, pozostawiając następujący stan.
Komórka pod głową ma zero; pętla się kończy.
Teraz jesteśmy gotowi do generowania wyników.
źródło
\0
.Brainfuck,
35 1343 bajtówTa odpowiedź nie przyjmuje żadnych założeń dotyczących interpretera programu wyjściowego. Wypróbuj online!
Krótsze rozwiązanie (które działa tylko z niektórymi tłumaczami), patrz moja inna odpowiedź .
Testowe uruchomienie
Dla danych wejściowych
Code Golf
generowane są następujące dane wyjściowe.Wypróbuj online!
Jak to działa
Zaczynamy od podania liczby całkowitej 43 (kodu znakowego
+
) w drugiej komórce taśmy. Poniższy kod osiąga to.To zasadniczo wykonuje podział modułowy 2 ÷ 6 (mod 256) . Ponieważ (2 + 256) ÷ 6 = 258 ÷ 6 = 43 , wynikiem jest 43 , zgodnie z przeznaczeniem.
Teraz jesteśmy gotowi do generowania wyników.
źródło
Pyth - 11 bajtów
Wypróbuj online tutaj .
źródło
05AB1E,
1211 bajtówWyjaśniono
Wypróbuj online
Zapisano 1 bajt dzięki @Adnan
źródło
'+×
zamiastF'+}
zapisuje bajt.Java, 98 bajtów
String
są niczym niezmiennymchar[]
s z wieloma metodami narzędziowymi, więc użyjmy tablicy!Nie golfowany:
Równoważny samodzielny program o długości 138 bajtów:
Premia:
Ta 207-bajtowa aplikacja faktycznie koduje plik jako program BF, tak jak napisano w tytule.
źródło
Vitsy,
19 lat17 bajtówPamiętaj, że ta odpowiedź jest jednym z niewielu razy, których kiedykolwiek użyłem
I
iu
. :REWypróbuj online!
źródło
O , 13 bajtów
Wyjaśnienie:
źródło
K6, 16 bajtów
Stosowanie
Wyjaśnienie
źródło
Python 3, 43 bajty
Python podaje liczbę plusów odpowiadającą kodowi ASCII każdego znaku, a następnie
.>
drukuje i przechodzi do następnej komórki. Uderzenie mózgu zwiększa się do prawidłowej wartości, drukuje i przechodzi do następnej komórki.Dane wyjściowe dla
hi
(z nowymi liniami dla przejrzystości):Wyjście tego programu:
źródło
Perl, 25 bajtów
Stosowanie
Wyjaśnienie
Używa operacji zamiany wyrażenia regularnego, aby zastąpić każdy znak w każdym wierszu podanym na standardowym wejściu liczbą
+
obliczoną na podstawie wartości porządkowej tego znaku, a następnie zwraca wyniki.>
do wydruku i przechodzi do następnego znaku.Używa
-p
flagi perla do automatycznego odczytu danych wejściowych i wydrukowania wyniku, dodając 1 dodatkową do liczby bajtów.źródło
Java, 91 bajtów
Rekwizyty dla dorukayhan za pobicie mnie :)
źródło
C,
726460 bajtówWersja bez golfa:
Skompiluj i przetestuj za pomocą:
gcc -o bfcat bfcatgolf.c && cat 1.txt | ./bfcat > o.txt && beef o.txt
Wyniki
hi
- http://paste.ubuntu.com/17995958/quick brown fox jumps over the lazy dog
- http://paste.ubuntu.com/17996059/źródło
c
bitowe odwrotne jestgetchar
, zwłaszcza jeśli ponownie odwrócisz odwrócenie?c = ~getchar( )
ocenia na 0 w dniuEOF
.c = ~getchar( )
i~c++
są po prostu krótsze niż~( c = getchar( ) )
ic--
CJam, 12 bajtów
Konwertuje każdy znak na jego wartość ASCII i zwiększa bieżącą komórkę o tę liczbę razy przed wydrukowaniem. Ponieważ mamy nieskończoną taśmę, możemy po prostu przejść w prawo po przetworzeniu każdej postaci.
Wypróbuj online!
źródło
Lua,
676661 bajtówPo prostu iteruj każdy znak w argumencie i wypisz wiersz dla każdego z
n
+
s, po.>
którymn
następuje wartość tego znaku w tabeli ASCII.Używa gmatch jako @LeakyNun zalecanego w komentarzu do zapisywania 1 bajtów w stosunku do rozwiązania gsub
Stare rozwiązanie za pomocą gsub
Stary 67
Aby go uruchomić, po prostu zapisz go jako plik (
golf.lua
na przykład) i uruchom za pomocąlua golf.lua "hi"
. Ponieważhi
powinno to generowaćźródło
attempt to index a nil value
if = ...
daje to samo, ifunction f ... end
dajeunexpected symbol near ':'
lua file.lua "argument"
zaktualizuję post, aby podać instrukcje....
identyfikatorem z argv?...
zawiera wartości zarg
rozpakowanej tabeli . Co oznacza, że zawsze będzie odpowiadał,arg[1]
chyba że użyjesz go w wywołaniu funkcji jako ostatniego parametru, a następnie poniesie wydatki.n=...for n:gmatch"."do print(("+"):rep(c:byte())..".>")end
dla 48 bajtówJ, 28 bajtów
Wystarczająco proste.
3&u:
konwertuje znaki na kody char. Reszta to po prostu powtórzenie'+'
tej liczby razy, a następnie konkatenacja z.>
końcem każdej linii i;
spłaszczenie wyniku.Niektóre wyniki
źródło
Pyke, 11 bajtów
Wypróbuj tutaj!
źródło
Właściwie 13 bajtów
Wypróbuj online!
Zastosowana tutaj strategia jest taka sama, jak w wielu innych rozwiązaniach - dla każdego znaku wypisz wystarczającą liczbę
+
s, aby zwiększyć komórkę o wartości zerowej do odpowiedniej liczby porządkowej ASCII, wyślij ją za pomocą.
i przejdź do następnej komórki za pomocą>
.Wyjaśnienie:
źródło
Mysz-2002, 27 bajtów
Działa to teoretycznie i zgodnie z dokumentacją języka, ale wydaje się, że referencyjna implementacja interpretera myszy zawiera błąd, w którym ciąg znaków dołącza a
'
, więc dlaa
tych danych wyjściowychCo z kolei daje wynik
a'
. To może, ale nie musi być w porządku, więc oto 39-bajtowy, który'
nigdy nie wyświetla danych wyjściowych , a zatem jest prawdopodobnie bardziej nieprawidłowy.Co daje prawidłowy wynik w referencyjnym impl. tak długo jak nie ma
'
s :)Wyjaśniono:
źródło
Współczynnik, 58 bajtów
Działa jak:
Ponieważ Factor jest wyposażony w interpreter Brainfuck, testowanie jest proste.
bfcat.factor
bfcat-tests.factor
wynik
Tak! wszyscy mijają.
źródło
Rubin,
4038 bajtówźródło
puts
zamiastprint
, jak format wyjścia nie ma znaczenia tak długo, jak jest on ważny brainfuck i brainfuck nie dba o innych znakówSidef , 38 bajtów
Hej, tej samej długości co Ruby! tylko że Sidef nie jest Ruby: D
Przeczytaj kilka znaków, a następnie zrób to dla każdego bajtu.
źródło
GNU Bash,
10085 bajtówDzięki @cat za uratowanie mnie 15 bajtów!
Postramble
bash bfcat.sh <path to file containing string>
bash bfcat.sh <(echo -n '<string>')
Bez golfa
Referencje w wersji Ungolfed
Plik bajt po bajcie
ord
char w bashemituj znak $ n razy
źródło
read -rn1
pozbyć się spacji;
, pozbyć siędone <"$1"
9 bajtówES6,
119115 bajtówf=s=>{a='';for(i in[...s]){b=s[c='charCodeAt'](i)-(s[c](i-1)|0);a+=(b>0?'+'.repeat(b):'-'.repeat(-b))+'.'}return a}
Zaoszczędź 4 bajty dzięki @Leibrug
źródło
charCodeAt
do jakiegoś var (powiedzmyc
) i użyć w ten sposób:s[c](i)
aby skrócić o 1 bajt, a także usunąć niektóre znaki (znalazłem 3: spacja wcześniej[...s]
, zamień logiczne OR na bitowy jeden i średnik wcześniejreturn
).Sesos (niekonkurujące)
Hexdump:
Wypróbuj online!
Monter
źródło
Rubinowy, 26 bajtów
+ 1 bajt dla
p
opcji wiersza poleceń. Aby np. Pobrać kod pieprzenia mózguABC xyz
, możesz uruchomići dostać
źródło
Haskell 50 bajtów
źródło