Jednym z najłatwiejszych kodów napisanych przez język programowania jest program wypisujący ciąg znaków (np. „Witaj, świecie!”). Jednak s o m e e e o t e r i c języki programowania takie jak brainfuck , nawet ta najprostsza kod jest dość irytujące pisać.
Twoim zadaniem jest napisanie programu (nie musisz pisać w pieprzony mózg), który wypisze (minimalnej długości) program Brainfuck drukujący podany tekst.
Wkład
Sekwencja znaków (między 1
i 255
) jest podana w dowolnym formacie (zmienna, argument, stdin, plik, ...).
Wydajność
Dane wyjściowe to prawidłowy (bez niepasujących [
i ]
) kod pieprzony mózg (zakładamy niepodpisaną 8-bitową komórkę zawijającą i nieograniczoną liczbę komórek po lewej i prawej stronie) drukującą dokładnie ciąg podany jako dane wejściowe.
Na przykład jednym z możliwych danych wejściowych A
jest ++++++++[<++++++++>-]<+.
.
>2m
Uruchomienie programu nie powinno zająć dużo czasu ( ).
Uruchomienie programu BF nie powinno zająć dużo czasu ( >10s
).
Punktacja
(Uwaga: obecna metoda punktacji może ulec zmianie, ponieważ obliczenie nie jest łatwe ...)
Długość samego programu (generującego kod BF) nie ma znaczenia. Jednak kodowanie na stałe kodów BF w kodzie programu jest nieprawidłowe. Tylko dopuszczalny zakres (ex kod BF drukowania pojedynczego znaku. 0x01
: +.
) Kodów BF mogą być zakodowane.
Wynik jest sumą długości kodów BF drukujących te ciągi.
- Ciąg
Hello, world!
dołączany z pojedynczym0x0A
(\n
) (tj. Programem „Witaj, świecie!”) - Pojedynczy znak od
0x01
~0xFF
- Suma długości tych 255 kodów BF jest mnożona
1/16
, zaokrąglana i dodawana do wyniku.
- Suma długości tych 255 kodów BF jest mnożona
- Lista pierwszych 16 ciągów, wygenerowanych przez podzielenie losowej sekwencji bajtów wygenerowanych 11-11-11 przez
0x00
usunięcie wszystkich ciągów o zerowej długości. - Lenna.png , usuwając wszystkie
0x00
s. - Tekst piosenki 99 butelek piwa , począwszy od
99 bottles~
nowych linii0x0A
, akapity są oddzielone dwoma0x0A
s, a na końcu nie ma znaku nowej linii. - Inne ciągi, które możesz podać.
Twój program może obejmować obliczanie wyniku samego siebie.
Oczywiście zwycięży kod o najniższym wyniku.
Lenna.png
zdominuje wynik, ponieważ jest to zdecydowanie największy wkład. Może znormalizować trochę według rozmiaru?Odpowiedzi:
W Javie oblicza krótki fragment kodu BF, który może konwertować dowolną liczbę na dowolną inną. Każdy bajt wyjściowy jest generowany przez przekształcenie ostatniego bajtu wyjściowego lub świeżego 0 na taśmie.
Fragmenty są generowane na trzy sposoby. Najpierw przez proste powtórzenia
+
i-
(np.++++
Konwertuje 7 na 11), łącząc znane fragmenty (np. Jeśli A konwertuje 5 na 50, a B konwertuje 50 na 37, a następnie AB konwertuje 5 do 37) i proste mnożenia (np.[--->+++++<]
Mnoży bieżącą liczbę przez 5/3). Proste mnożenie wykorzystuje przewijanie do generowania niezwykłych wyników (np.--[------->++<]>
Generuje 36 z 0, gdzie pętla wykonuje się 146 razy, w sumie 4 zawijanie malejące i 1 rosnące zawijanie).Jestem zbyt leniwy, aby obliczyć mój wynik, ale wykorzystuje on około 12,3 operacji BF na bajt
Lenna.png
.źródło
Cóż, oto najgorsze możliwe rozwiązanie, chociaż dość ładne w samym Brainfuck:
Wynik jest prawdopodobnie najgorszy, jaki możemy zobaczyć, bez celowego pogorszenia.
Praca nad obliczeniem faktycznego wyniku.
źródło
+
i a.
[-]
aby wyczyścić komórkę między każdą postacią.Python 3.x
Cóż, nie zamierzam wygrywać żadnych nagród za najkrótszy kod wyjściowy, ale może program wygeneruje kod ...
„Witaj, świecie! \ N”:
źródło
print("".join(["+"*ord(i)+".[-]"for i in input()]))
.[-]
z.>
Nie jestem pewien, czy to dobrze, ale dobrze się pisałem. (W Clojure ...)
Prawdopodobnie są bardziej wydajne i bardziej eleganckie rozwiązania, ale to podąża za moim myśleniem nieco liniowo, więc było to najłatwiejsze.
źródło
Wynik:
478748641439404086426 (bez losowo generowanych danych)(4085639 z tego pochodzi z Lenna.png. To 99,98%)
Nie dostaję części z przypadkowymi danymi. Czy nie potrzebuję konta, za które muszę zapłacić, aby uzyskać dane?
Dość naiwny. Oto wygenerowany kod dla „1Aa” (49, 65, 97) z małą dokumentacją:
Kod Java jest trochę brzydki, ale działa. Wygenerowany wskaźnik instrukcji na bajt wejściowy jest prawdopodobnie lepszy, im wyższa jest średnia wartość bajtu.
Jeśli chcesz go uruchomić, musisz umieścić Lenna.png w tym samym katalogu, co plik .class. Drukuje partyturę na konsolę i zapisuje wygenerowany kod BF w pliku o nazwie „output.txt”.
Wprowadzę drobne poprawki, ale prawdopodobnie niewiele.Gotowy.źródło
BrainF ** k
Jestem całkiem złym programistą BF, więc ta odpowiedź jest prawdopodobnie dość nieefektywna. Nie jestem pewien co do wyniku, ale powinien on działać nieco lepiej niż istniejąca odpowiedź na przeciętnym tekście. Zamiast zerować komórkę po każdym znaku, ten „dostosuje” się do nowego znaku z odejmowaniem, jeśli poprzedni podany znak jest większy.
(Uwaga: jest to kod, który napisałem dawno temu i zmieniłem przeznaczenie na potrzeby tego konkursu. Mam szczerą nadzieję, że poprawnie wykonałem konwersję, ale jeśli nie powiedzie się to w przypadku jakiegokolwiek wejścia, daj mi znać.)
Wersja pokazująca stan taśmy w całym kodzie:
Wygenerowany kod dla
Hello, World!
:To moja pierwsza odpowiedź na CG.SE! Jeśli coś spieprzyłem, daj mi znać!
źródło
> <>
Napisałem to w odpowiedzi na pytanie oznaczone jako duplikat, i chociaż nie jest to najlepszy golf (przynajmniej w przypadku tego konkretnego pytania), pomyślałem, że byłoby to marnotrawstwem, jeśli nie podzielę się tym cała jego obrzydliwie bełkotliwa chwała. Naprawdę jestem zaskoczony, że nawet działa. Przyjmę wszelkie sugestie, aby zagrać w golfa, ponieważ był to mój główny cel w jego tworzeniu.
Na marginesie, w drugim wierszu na początku
.21
można zastąpić trzy początkowe znaki,v
a następnie dwa spacje, jeśli to ułatwi czytanie. Nie lubię spacji w moich programach> <>, ponieważ oznacza to, że zmarnowane miejsce (dosłownie). Jest to także pozostałość jednego z wielu prototypów.Sposób, w jaki działa, jest naprawdę prosty i, szczerze mówiąc, trudno byłoby mi znaleźć sposób na implementację innego algorytmu. Drukuje jednak wiele „+” trzeba wydrukować dla pierwszego znaku, a następnie drukuje więcej „+” lub „-” w razie potrzeby dla każdego dodatkowego znaku, oddzielając każdą sekcję kropkami. W moim programie fajne jest to, że modyfikuje własny kod źródłowy, tak aby drukował „+” lub „-” (zastępuje „+” w wierszu 3 odpowiednim znakiem po ustaleniu, czy bieżący znak jest większy niż lub mniej niż poprzedni).
Dane wyjściowe dla
Hello, World!
:Mógłbym zdobyć to w sposób, w jaki miał być punktowany, ale jestem prawie pewien, że stracę i nie do końca wiem, jak czytać coś takiego jak lenna.png w> <>.
Jeśli ta odpowiedź cię interesuje i chciałbyś wyjaśnienia, z całą pewnością zapytaj, ale na razie zostawię je bez jednego tylko ze względu na to, jak kręte i kruche jest.
EDYCJA 1: Minęło trochę czasu, ale byłem w stanie zagrać w golfa z 2 bajtów z prawie całkowitym przeglądem sposobu, w jaki program decyduje, czy wydrukować plus czy minus. Jest to nieco rozczarowujący powrót do dużego remontu, ale przynajmniej działa.
źródło
moje rozwiązanie JavaScript jest szybkie i brudne :)
wyjście dla
Hello World\n
Źródło:
źródło
Zbudowałem coś w Javie. Nie obliczył wyniku. Teksty zawierające 3 lub mniej znaków są kodowane przez pomnożenie na literę, np. „A” =
++++++++[>++++++++<-]>+.
. Teksty zawierające więcej niż 3 znaki są kodowane za pomocą obliczonej listy podzielonej na 3 obszary. Pierwszy obszar to x razy 49, następnie plus x razy 7 i wreszcie plus x. Na przykład „A” to 1 * 49 + 2 * 7 + 2Dostarczony ciąg „### INSERT TEXT HERE ###” staje się
--->-->-->-->-->->->->->->->-->->->->->-->->->->->-->-->-->-->+[-[>+++++++<-]<+++]>---->++>++>++>+>>+>+>->+>++>+>++>->++>++>+>>->+>->+>++>++>++>+[-[>+++++++<-]<++++]>---->--->--->--->+>>-->+++>+++>++>--->+>--->+++>+>--->+>->+++>++>+++>+>--->--->--->+[-<++++]>[.>]
"Witaj świecie!" staje się
--->->>>>>-->-->->>>>>-->+[-[>+++++++<-]<+++]>---->>--->-->-->-->+++>+>++>-->->-->--->+>+[-[>+++++++<-]<++++]>---->->>>>+++>->+>>+++>->>->++>+[-<++++]>[.>]
źródło
Python 3
Zasadniczo jest to tylko nieco ulepszona wersja odpowiedzi zmiennych lodowych. (-1 bajt z Kreatora pszenicy, -5 z FatalError, -2 z jez)
źródło
:
. Prawdopodobnie można to również zrobić w formie listy, aby zaoszczędzić bajty.print("".join(["+"*ord(i)+".[-]"for i in input()]))
join()
wyrażenie generatora zamiast zrozumienia listy:print("".join("+"*ord(i)+".[-]"for i in input()))
print("".join("+"*ord(i)+".>"for i in input()))
(to również zmniejsza wynik, ponieważ tracisz 2 bajty na wyjściu)