W dowolnym języku programowania lub skryptowym x napisz program, który pobiera prawidłowy kod źródłowy skoku mózgowego ze standardowego wyjścia i wyjścia, do standardowego kodu źródłowego programu napisanego w języku x , który wygenerowałby dokładnie to samo, co zrobiłby ten program.
Twój program musi działać dla każdego prawidłowego programu do pieprzenia mózgu, w tym pustego pliku.
Twój wynik byłby równy liczbie bajtów kodu źródłowego oraz liczbie bajtów danych wyjściowych przy następujących danych wejściowych:
+++++ [-]
+++++ +++++ [
> +++++ ++
> ++ +++ ++++ +
> +++
<<< -
]
> ++ . H
> + . e
++ +++ ++. l
. l
+++ . o
> ++ . space
< +++++ +++ . w
----- --- . o
+++ . r
---- - - . l
----- --- . d
> + . exclamation mark
------lol; useless code :-)--------------------------[.............................................][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]<-<<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><
Na przykład dla wejścia [-]
wartość wyjściowa *p=0;
jest znacznie bardziej korzystna niżwhile(*p) *p--;
Jeśli zdarzy ci się używać znaków spoza ASCII, liczbę bajtów należy obliczyć przy użyciu kodowania UTF-8.
Najniższy wynik wygrywa. Jednak kreatywne rozwiązania, które próbują zminimalizować wyniki, będą zachęcane przez entuzjastów.
byte count of source + (byte count of output)^2
, czy to zachęciłoby ludzi do większego skupienia się na uproszczeniu wyników?Odpowiedzi:
Perl - 177 (źródło) + 172 (wyjście) = 349
Licząc shebang jako 2 bajty, po jednym dla każdej opcji. Po pierwsze, każde z ośmiu poleceń jest tłumaczone na zakres
p-w
, jednocześnie usuwając wszystkie pozostałe znaki. Łańcuch ten jest następnie kodowany i uruchamiany przy użyciu minimalnego dekodera / interpretera. Kilka rzeczy zostało zoptymalizowanych: łańcuch><
oczywiście nic nie robi, a pętla for, która następuje bezpośrednio po innej, może zostać całkowicie usunięta, ponieważ nigdy nie zostanie wprowadzona.Dane wyjściowe dla programu testowego:
Przykładowy przebieg:
Perl - 232 (źródło) + 21 (wyjście) = 253
Ten opiera się na spostrzeżeniu FIQ , że jeśli oryginalny program nie zawiera instrukcji wejściowej, wynik będzie statyczny, a zatem może zostać zredukowany do pojedynczej
print
instrukcji. Jeśli ci się podoba, pamiętaj, aby dać jego odpowiedź +1.Więc co możemy zrobić, to potokować
stdout
do zmiennej,eval
kod, który otrzymalibyśmy, i zawinąć wynik wprint
.... to jednak nie zawsze zadziała. Ilekroć kod do przetłumaczenia spowodowałby nieskończoną pętlę (np.
+[.]
), Z oczywistych powodów nie można tego zredukować do pojedynczejprint
instrukcji. Zamiast tego uruchamiamyeval
proces potomny z krótkim limitem czasu, a jeśli nie zakończy się on w tym czasie, wysyłamy przetłumaczony program jak poprzednio.Zorganizowany i skomentowany:
Dane wyjściowe dla przykładowego programu:
Dane wyjściowe dla
,[.]
:Wyjście dla
+[.]
(po 9 sekundach):źródło
wv.*?(?=w)
jest źle. Myślę, że usunie tylko kod do następnego]
, ale potrzebujesz go, aby znaleźć pasujące]
; musisz zadbać o zagnieżdżanie ...wv[^v]*(?=w)
, które są znacznie krótsze niż alternatywa.Brainfuck, 5 + 540 = 545 bajtów
5 bajtów kodu, 540 z danych wyjściowych danego pliku testowego (zakładając, że otrzymałem liczbę bezpośrednio z mojej pasty tego kodu).
Zakładając, że EOF wynosi 0.
źródło
bfi
( github.com/susam/bfi ). Wystarczy go skompilować i zainstalować, a następnie uruchomić w następujący sposób:bfi input.bf
gdzieinput.bf
należy interpretować plik pieprzony mózg.PHP, 553 + 27 = 580 bajtów
(Usunięto 553 bajtów ze wszystkimi białymi spacjami, tj. Znakami nowej linii i spacjami)
Źle podchodzę do gry w golfa w PHP, więc to podejście można mocno zoptymalizować. Chciałem przede wszystkim pokazać swoje podejście do rozwiązania w czymś innym niż BF.
Raportowanie błędów musi być wyłączone, w przeciwnym razie PHP cię nienawidzi. Sposób użycia: wyrzuć to jako stronę i uruchom za pomocą script.php? C = CODE (jeśli wynikowy skrypt wymaga danych wejściowych, uruchom go jako out.php? I = INPUT). Pamiętaj, aby URL uratować wejście!
To, co to robi, jest w zasadzie takie - jeśli skrypt BF zawiera „,”, to właściwie osadza się jako wynikowy skrypt z dołączonym $ b = 1; na górze. Jeśli NIE zawiera „,”, optymalizuje go do „echo <wyjście BF>”. Dogodnie skrypt testowy w PO NIE wymaga żadnych danych wejściowych. Addlasheshes () służy tylko do ucieczki 'i \.
źródło
C ++, 695 + 510 = 1205 bajtów
Kod:
Wynik:
Oryginalny kod:
źródło
Python - 514 + 352 = 866
Kod:
Wynik:
źródło
io
659 + 553 = 1212
Rzeczy takie jak
File standardInput readBufferOfLength(1)
zabijanie liczby bajtów, ale nie mogę tego obejść. Nie robiłem optymalizacji pod kątem powtarzających się symboli lub braku danych wejściowych w programie BF, ale będę nadal nad tym pracował, również nad tym, który korzysta z możliwości metaprogramowania io.Testowanie
Wydajność
źródło
Brainfuck , 109 + 407 = 516
Wypróbuj online!
Usuwa tylko operacje inne niż BF i nie analizuje innych optymalizacji.
źródło
Lua - 328 + 2256 = 2584
(Och, właśnie zdałem sobie sprawę, że musisz również dodać długość wyniku, słaby wynik, wygląda na to)
Zrobione z tym odpowiedź kopalni.
źródło
Lua - 319 + 21 = 340
Jest to prawdopodobnie najkrótszy kod ze wszystkich, ale nie przyjmuje danych wejściowych, więc jest trochę oszustwo. Wpadłem na pomysł innej wersji z wejściem, patrz koniec tego komentarza.
Lua - 376 + 366 = 742
Ta wersja ma udowodnić, że lua może zrobić lepiej niż 2584: D
Obie wersje dodają 30000 bajtów danych. Moja druga wersja opiera się na danych wejściowych / wyjściowych: wszystko po „.” lub „,” zostaną usunięte. Moja druga wersja nie zezwala na nieskończone pętle ([.,], [] Itd.)
Moim pomysłem jest uzyskanie:
Z twojego wkładu, z dodatkowym „, +”.
źródło