To pytanie jest częścią serii Wyzwań urodzinowych Brain-flak zaprojektowanych z okazji pierwszych urodzin Brain-Flak. Więcej informacji na temat urodzin Brain-Flaka można znaleźć tutaj .
Dzisiaj są pierwsze urodziny Brain-Flak! Pomyślałem więc, że zorganizujemy przyjęcie urodzinowe z niespodzianką. Więc w swoim ulubionym języku drukuj
Surprise!
Happy Birthday, Brain-Flak!
(Końcowe białe znaki są dozwolone)
Jak zawsze programy powinny być rozgrywane w golfa. Ponieważ jednak programy Brain-Flak składają się z nawiasów, nie będą liczyć żadnych nawiasów w twoim źródle przeciwko tobie. (Postacie ()[]<>{}
nie liczą się do całkowitej liczby bajtów), ale muszą być wyważone, aby nie zakłócać Flakingu Mózgu.
Zasady
Oto podział zasad
Nawiasy w źródle muszą być zrównoważone. Oznacza to, że nawiasy twojego programu muszą być rozmieszczone według następującej gramatyki:
S -> SS | (S) | [S] | <S> | {S} | E
gdzie
E
jest pusty ciąg.To znaczy, że zbalansowany ciąg jest albo połączeniem dwóch zbalansowanych ciągów, nawiasów wokół zbalansowanego ciągu lub pusty ciąg.
Wynik programu to liczba bajtów spoza nawiasu.
Twoim celem powinno być zminimalizowanie wyniku w dowolnym wybranym języku.
Obowiązują standardowe zasady, więc możesz napisać albo pełny program, albo funkcję.
w przypadku remisu liczba nieprzetworzonych bajtów działa jak przerywnik remisu
Z pewnością będą rozwiązania zero-bajtowe w niektórych językach ( nawias piekła , nawias , glif , lenguage ). Spróbuj znaleźć sposoby na dobrą grę w golfa w językach, w których nie jest to trywialne zadanie.
źródło
><
uważany za zbalansowany, czy też nawiasy klamrowe muszą być w odpowiedniej kolejności (<>
)?Odpowiedzi:
Python 2 ,
39373634 bajtów-1 dzięki dzaima
-2 dzięki Erikowi Outgolfer
Wypróbuj online!
Odpowiednie postacie:
Wyjaśnienie
Ten program buduje ciąg:
Robi to, konwertując długi ciąg nawiasów na kody znaków. Po zbudowaniu łańcucha wykonuje go.
Buduje ciąg ze szkieletem:
To rozdziela ciąg
{}
i odwzorowuje każdą sekcję na kod znaku odpowiadający jego długości. Następnie możemy zbudować cały ciąg z parens za koszt zero bajtów.źródło
()
wokół,x
aby uratować 2.Haskell (przed GHC 8.4), (
10119 7767 76267540 bajtów), wynik15 1410Wypróbuj online!
Ostatni wiersz definiuje anonimową funkcję
(<>)'y'pred(:)
. Zadzwoń z,(<>)'y'pred(:)()
aby uzyskać ciąg.Edycja: Ogromne podziękowania dla @ Ørjan Johansen za sugestię przekazania funkcji pomocnika jako parametrów zamiast ich deklarowania, co pozwala zaoszczędzić cztery bajty punktacji!
Bajtami nie będącymi nawiasami są
Jak to działa?
Ciąg
"wxy"
w Haskell jest cukier syntaktyczny na liście znaków['w','x','y']
, który ponownie jest cukier syntaktyczny dla późniejszej konstrukcji z operatorem cons:
i pustej listy:'w':'x':'y':[]
. Poprzez zdefiniowanie(<<>>)=(:)
otrzymujemy ten sam ciąg pisząc'w'<<>>('x'<<>>('y'<<>>[]))
.Ponieważ znaki są uporządkowane, możemy obliczyć poprzednika każdego znaku za pomocą funkcji o nazwie
pred
. Tylko przy użyciu char'y'
ipred
, łańcuch stajepred(pred 'y')<<>>(pred 'y'<<>>('y'<<>>[]))
. Definiując(<>)=pred
i(<><>)='y'
możemy reprezentować ciąg przy użyciu tylko zrównoważonych nawiasów:(<>)((<>)(<><>))<<>>((<>)(<><>)<<>>((<><>)<<>>[]))
Jednak ostatecznie nie chcemy ciągu, ale funkcję zwracającą ciąg, więc
(<<>>) x xs ()=x:xs
zamiast tego definiujemy naszego operatora minus. (Oczywiście przy użyciux
ixs
zastępowanych identyfikatorami wykorzystującymi wyłącznie zrównoważone nawiasy kwadratowe:)(<<>>)(<>)(<><>)()=(<>):(<><>)
. Tą drogą,((<>)((<>)(<><>))<<>>((<>)(<><>)<<>>((<><>)<<>>[])())())
jest funkcją typu,
() -> String
a dołączenie końcowego()
daje oryginalny ciąg znaków:((<>)((<>)(<><>))<<>>((<>)(<><>)<<>>((<><>)<<>>[])())())()
Za pomocą tej metody osiągnąć roztwór o średniej 15. Jednakże, można kondensować z trzech zgłoszeń w jednym, uznając funkcję, która trwa cztery parametry:
'z'
,pred
,(:)
a()
dla połączeń.Poniższa funkcja
encode
koduje ciąg znaków o mniejszych lub równych znakach'y'
w ten sposób: (Dlaczegoy
? Ponieważ jest to największy znak,"Surprise!\nHappy Birthday, Brain-Flak!"
a zatem daje najkrótszą reprezentację. Jeszcze raz dziękuję Ørjanowi Johansenowi za zwrócenie na to uwagi.)Wypróbuj online!
źródło
'z'
tak naprawdę nie występuje w ciągu bramkowym, myślę, że możesz zmniejszyć przerywacz remisu w liczbie bajtów, używając'y'
zamiast tego.(<<<>>>)(<><>)(<>)(<<>>)()=...;(<<<>>>)'y'pred(:)
Siatkówka , 59–24 = 35 bajtów
Wypróbuj online! Dla porównania nudne rozwiązanie zajmuje 38 bajtów.
źródło
Galaretka ,
76 bajtówWewnątrz
“”
musisz umieścić dane wyjściowe tego programu Jelly:-1 bajt dzięki Jonathanowi Allanowi (dozwolone końcowe znaki nowej linii)
Istnieje 53127666317289661939246122975355844970973062889031671423309402549417051416384149 80886139013 (nazywamy to
n
)()
s pomiędzy“”
.Objaśnienie :
źródło
Lenguage , 0 bajtów
Zaledwie 10024793746353848520175158940670214213802394805963081469362831141755126591573942436182287015467334956253918417576118983828148929806934751198148656645940502264502520032312455157880058174845907554602116807351044784410936407102892289953027884533102082518964744402664917253792543505897552998982122997648280947470217067174451441654554437678556775097996646071948 bajtów ze zbilansowanych nawiasów.
Program Python 3 do generowania mojej ulubionej wersji, biorąc pod uwagę wystarczającą ilość czasu i pamięci:
źródło
Haskell , (
1200613485 bajtów), wynik1817EDYTOWAĆ:
toEnum
wersja działa bez rozszerzeń, przenosząctoEnum
do głównej funkcji, kosztem$
.Użyj jako
putStrLn$(<<>>)()
.Wypróbuj online!
gdzie
...
jest ciąg wyniku następującego wyrażenia:Jedynymi niezrównoważonymi postaciami są
Poniższy wariant (13484 bajtów) ma wynik 16, z tym wyjątkiem, że wymaga
ExtendedDefaultRules
rozszerzenia GHC , a więc domyślnie działa tylko w GHCi. (Chyba że lubisz mnóstwo ostrzeżeń, też chcesz-fdefer-type-errors
i-Wno-deferred-type-errors
z jakiegoś powodu.)Wypróbuj online!
Jak to działa
<>
są legalnymi postaciami operatorów. Co więcej, jeśli zostaną umieszczone w nawiasach, mogą być użyte dla dowolnej wartości, a nie tylko funkcji dwuparlamentarnej.(<<>>)
w drugim wierszu jest funkcja główna, pobiera pojedynczy argument fikcyjny()
i zwraca ostatni ciąg.<>
pobiera dwie listy i dodaje długość drugiej do pierwszej (w drugiej wersji również najpierw konwertuje długość na znak). Operatory są domyślnie skojarzone, więc łańcuchy łatwo.[]
pomocą<>
.()<>[]
znaków zrównoważonych - a następnie (w głównej wersji) mapujetoEnum
na wynikową listę.źródło
Japt ,
1914131098 bajtówgdzie ciąg na początku to:
Całkowita liczba bajtów to „tylko”
669433943354, więc możesz spróbować online!Wyjaśnienie
Rzeczywista zastosowana metoda jest wyjaśniona w innych odpowiedziach: Podziel
<>
, mapuj każdy bieg parenówchr(len(x))
, połącz ponownie na pustym łańcuchu. Tutaj gra jest w golfa.Przed „golfem” może wyglądać oryginalny kod
co jest dość dosłownym opisem:
"...".split("<>").map(Z => Z.length.toChar()).join("")
Teraz musimy zminimalizować znaki bez nawiasów. W jaki sposób? Cóż, najpierw możemy zagrać w golfa:To z grubsza reprezentuje
"...".split("<>").map(Z => Z.length).map(Z => Z.toChar()).join()
.Teraz możemy nadużywać mylącego sposobu, w jaki Japt traktuje nawiasy.
(
oznacza przejście w górę o jeden poziom, jak w większości języków, ale)
oznacza przejście w dół o dwa poziomy (spacja idzie w dół o jeden poziom), co oznacza, że możemy zoptymalizować kod, aby:Ten kod działa tak samo jak powyżej, ale używa dwóch mniej znaków bez nawiasów.
Dodatkowo, jeśli operator jest pierwszym wejściem do funkcji, zostaje przekształcony w ciąg znaków, dzięki czemu funkcja może zdecydować, co z nim zrobić. Oznacza to, że możemy uniknąć cudzysłowów, jeśli po prostu skrócimy każdy ciąg nawiasów o 1 bajt i podzielimy się nim
>
(z pewnym sprytnym rozwiązaniem, aby skasować wynikowy>)
kod):To oszczędza nam kolejne dwa bajty, ponieważ wyjęliśmy dwa znaki cudzysłowu.
źródło
Haskell , (
1965 313118073 bajtów), wynik31 2319Wypróbuj online! Użycie: Ostatni wiersz jest funkcją anonimową. Powiąż to np.
f
I zadzwońf()
.Jest 19 bajtów spoza nawiasu
plus końcowy znak nowej linii.
Ocena 23 wersji (3131 bajtów):
Wypróbuj online! 23 bajty inne niż nawiasy kwadratowe to
Ocena 31 wersji (1965 bajtów):
Wypróbuj online!
Po usunięciu wszystkich nawiasów tych 31 bajtów pozostaje:
Jak to działa?
['\n'..'~']
zwraca listę wszystkich znaków od nowej linii, do~
której należą wszystkie znaki ASCII do wydruku.(<<>>)
to identyfikator wybrany tak, aby miał zero bajtów zgodnie z podaną regułą punktacji.(<<>>)=['\n'..'~']++(<<>>)
w ten sposób daje nieskończone powtórzenie listy znaków.W drugim wierszu
zip"> ... "(<<>>)
zamyka się długi ciąg nawiasów ciągiem nieskończonym, uzyskując listę krotek ze znakiem nawiasu w pierwszym składniku i pewnym znakiem ASCII w drugim. Dla każdej krotki na tej liście sprawdzamy, czy pasuje do wzorca('{'{-}-},(<>))
, czyli czy ma{
nawias jako pierwszy składnik.{- ... -}
jest komentarzem wbudowanym w Haskell, podobnie'{'{-}-}
jak zrównoważona wersja'{'
. Jeśli dopasowanie zakończy się powodzeniem, drugim składnikiem krotki jest wiązanie z identyfikatorem(<>)
i dodawane do kompilacji ciągu za pomocą zrozumienia listy. WreszcieputStr
drukuje ciąg.putStr[(<>)|('{'{-}-},(<>))<-zip"> ... "(<<>>)]
Bezpośredni wydruk ciągu wynosi 46 bajtów:
źródło
HTML, 37 bajtów
źródło
<br>
tagu:Surprise!<br>Happy Birthday, Brain-Flak!
<br>
jest o jeden bajt dłużej, ponieważ<p>
próbuję go przed opublikowaniem. Wygląda trochę ładniej. Nie używam tagu zamykającego<p>
.05AB1E , 24 bajty
Wykorzystuje kodowanie 05AB1E . Wypróbuj online!
źródło
Pyth,
4⃠3⃠2 bajtyPrzekreślone 4 nie jest zwykłym 4, jeśli używasz magii
zalgoUnicodePodziękowania dla Romana Gräfa i Neila za uratowanie 1 bajtu.
Kod jest
Cl(()()()
…()()())
tam, gdzie nawias zewnętrzny zawiera41505989310382548390036033574496753883572705382055993299460470741732071419050117038172961
połączone kopie pliku()
. (Wymiana stosów nie pozwoliła mi opublikować pełnego kodu).Tworzy krotkę (
(
…)
) pustych krotek (()
), pobiera length (l
) i konwertuje ją na łańcuch podstawowy 256 (C
).źródło
h
dodawania kolejnej pary wsporników?h
dwie pozycje na prawo i nadal działa idealnie ;-)Japt , 6687 bajtów, wynik 5
Wypróbuj online!
Jest to podobne do mojej innej odpowiedzi Japt , ale używa zagnieżdżonych tablic zamiast łańcucha. Zaletą tablic zagnieżdżonych (poza tym, że ich zdefiniowanie nie zajmuje żadnych bajtów) jest to, że są one wstępnie zorganizowane, więc nie musisz robić żadnego fantazyjnego podziału na
<>
magię ani dekodować z ogromnej podstawowa liczba 256 lub coś w tym rodzaju. Rzeczywista logika jest sprawiedliwa.map(X => X.length).map(X => String.fromCharCode(X)).join("")
.źródło
Chip , 553 + 3 = 556 bajtów, wynik 127 + 3 = 130
+3 dla arg
-w
. Wypróbuj online!Bajtami nie będącymi nawiasami są
Niesłożone / niezbalansowane:
Jak widać, oryginalny kod używa tylko nawiasów po prawej stronie, więc wszystkie nawiasy po lewej stronie służą wyłącznie do równoważenia. W trakcie wymyślania tego rozwiązania znalazłem w Chipie znacznie gęstszą reprezentację ciągów znaków, którą miałem dla moich wcześniejszych odpowiedzi, np. Witaj świecie , więc też je zaktualizowałem.
Jak to działa:
Bit zwisający z lewej strony wytwarza impuls 1-cyklowy, aby rozpocząć. Impuls ten przemieszcza się wzdłuż
Z
częstotliwości 1 w cyklu, co zapewnia czas. Kiedy każdyZ
jest zasilany, odpowiadająca mu kolumna generuje kod ascii znaku o tym indeksie, który następnie jest przesyłany przez elementya
przezg
(jeden na bit bajtu wyjściowego, z wyjątkiem bitu wysokiego,h
który zawsze wynosi 0). Po zakończeniut
kończy wykonywanie.Kodowanie ascii jest proste:
)
oznacza 1 ix
oznacza 0. Jednak 5 dolnych wierszy jest przeważniex
, więc odwracam te bity w końcowym rozwiązaniu, skutecznie zamieniając dwa symbole.Czy to najlepszy możliwy wynik?
Wątpię. Przy absolutnym minimum, myślę, że potrzebujemy: 1 do każdego , ponieważ są to aktywne bity wyjściowe, 1 lub podobny do dostarczenia sygnału startowego, 1 do zakończenia wykonywania, 36 s lub s, aby
a
przekroczyć limit czasu każdej litery, i polecenie arg . Wszystko to daje wynik 48.g
*
t
Z
z
-w
Powyżej tego teoretycznego minimum moje rozwiązanie ma 7 nowych linii, sekundę
*
, dodatkowąZ
i 73x
s.źródło
C, 9265 bajtów, wynik 37
Zobacz, jak działa online .
C, 8589934626 bajtów, wynik 34
Gdzie
STRING
jest ten sam duży literał łańcucha, jak w powyższym przykładzie, z tym wyjątkiem, że ma dwie różnice w samym środku łańcucha, w którym znajduje się podłańcuch<>
. Tuż przed nim<
są 4294962688 dodatkowych[
znaków, a tuż po nich>
są 4294962688 dodatkowych]
znaków.Program będzie działał przy następujących założeniach:
INT_MAX to 2 ^ 31-1, a INT_MIN to -2 ^ 31.
Kompilowany z zachowaniem zawijania dla arytmetyki ze znakiem. (-fwrapv)
Funkcja strspn może przetwarzać 4294962689 znaków jednocześnie.
Kompilator jest w stanie skompilować literał łańcuchowy złożony z 8589934592 znaków.
Te założenia są możliwe w nowoczesnych architekturach 64-bitowych, w których typ int to 4 bajty, a typ size_t to 8 bajtów. Funkcja strspn zwraca typ size_t, a ten sam typ jest powiązany z wewnętrznym ograniczeniem maksymalnego rozmiaru obiektu. Wpisz size_t, który jest 8 bajtami, spełniłby dwa ostatnie założenia.
Różnica w tej wersji polega na tym, że zmienna i nie musi być resetowana do zera, ponieważ zawija się do 0 po wydrukowaniu ostatniego znaku.
źródło
Haskell , 9735 bajtów, wynik 9
Wypróbuj online!
9 bajtów oceniających to
Działa to w aktualnych wersjach Haskell (GHC 8.4 lub nowszy), gdzie
(<>)
jestPrelude
. Dziękuję Ørjanowi Johansenowi za zwrócenie uwagi, że to łamie moje poprzednie rozwiązanie, ale pozwala zaoszczędzić kolejny bajt punktacji.Wyjaśnienie
Jak
(<>)
na dwóch list jest taki sam jak(++)
możemy reprezentować ciąg"abc"
jak"a"<>"b"<>"c"
zamiast. Ciągi to listy znaków, więc['a']<>['b']<>['c']
oznaczają ten sam ciąg. Teraz, podobnie jak w poprzedniej odpowiedzi, tylko chcemy pojedynczy znak literalny, więc trzymać się on najwyższy'c'
i reprezentują inni jak poprzednicy z nim:[pred(pred 'c')]<>[pred 'c']<>['c']
. Wreszcie, zastępując'c'
z(<><>)
którego jest poprawnym identyfikatorem ipred
z(<<>>)
, otrzymujemy kodowanie napisu"abc"
tylko, że składa się z wyważonej nawiasie:[(<<>>)((<<>>)(<><>))]<>[(<<>>)(<><>)]<>[(<><>)]
.Poniższa funkcja koduje dowolny ciąg w ten sposób:
Wypróbuj online!
źródło
(<<>>)
jest używany tak wiele razy, myślę, że zaoszczędzi wiele bajtów, jeśli zamienisz jego nazwę na nazwę<>
(przekazując ten drugi parametr jako dodatkowy parametr).C # Interactive, 45 bajtów
Wiem, to trochę nudne, ale jeśli jest wykonywane w interaktywnym C #, daje pożądane wyniki - i właściwie wątpię, czy istnieje mniejszy sposób na rozwiązanie tego w C #.
Istnieje jednak bardziej stabilny sposób:
Ale to jest 145 bajtów.
Z podziałem linii wygląda to tak:
To interpretuje nawiasy jako wartości boolowskie, a następnie jako ciąg.
Właściwie nie jestem zaawansowanym golfistą, więc wszelkie sugestie są mile widziane!
źródło
.Select(s =>
celu zastosowania sięS -> <S>
, można go zmienić.Select(/*<*/s =>
C# Interactive
, również myślę, że jest interpretowany w języku C # interaktywnym,CJam , 6683 bajty, wynik 3
Skróciłem tutaj kod, aby nie zaśmiecać strony zbyt mocno. Możesz zobaczyć pełny kod w linku TIO. Jedynymi znakami, które nie są nawiasami, są
,c%
.Wypróbuj online!
Wyjaśnienie
Program rozpoczyna się od wypchnięcia tablicy pustych tablic. Każda podgrupa zawiera pewną liczbę pustych tablic odpowiadających wartości ASCII znaku w żądanym ciągu. Następnie dla każdej podtablicy (
{...}%
) pobiera długość tablicy (,
) i rzutuje tę długość na znak (c
).Powstały ciąg jest domyślnie drukowany.
źródło
C,
6964 bajtówWypróbuj online
Jak to zrobiłem
*
z{}
,>
z<>
, i<
z[]
tak oni nie liczą, więc teraz ta liczba kodu wynosi 1, ze względu na charakter wyjściowejS
.<>
, odejmuje[]
, drukuje bieżącą sumę{}
i kończy na końcu łańcucha\0
.C, 49 bajtów Wypróbuj online
źródło
p
zaoszczędzić niektórych bajtów?Lua 5.3, 108097107033101 bajtów, wynik
2827Tutaj
REPLACE
zastępuje się ciągiem wolnych znaków o długości 108097107033034. Ciąg koduje dane, umieszczając je{}
w pewnych kluczowych pozycjach. Pierwszygsub
zastąpi ciąg indeksami{}
s (poprzez pustą grupę przechwytywania()
). Drugigsub
dzieli ten wynikowy ciąg na 3-cyfrowe bloki i zastępuje każdy blok jego reprezentacją ASCII.Zauważ, że składnia nieprzetworzonych łańcuchów w Lua jest (w zasadzie)
[[string contents]]
, co jest dość przydatne w zmniejszaniu wyniku.Ciąg (nieskalowany), który generuję, to
print"Surprise!\nHappy Birthday, Brain-Flak!"
. Zastąpienie każdego znaku 3-cyfrowym dziesiętnym kodem ASCII daje112114105110116034083117114112114105115101033092110072097112112121032066105114116104100097121044032066114097105110045070108097107033034
. Kod, którego używam, może generować tylko sekwencje rosnących liczb naturalnych (co najmniej 2 osobno), które nie zaczynają się od zer początkowych. Tak więc liczba ta zostaje podzielona na11, 2114, 105110, 1160340, 83117114, 112114105, 1151010330, 9211007209, 71121121210, 320661051141, 1610410009712, 10440320661140, 97105110045070, 108097107033034
. (Ta ostatnia liczba jest dokładnie długościąREPLACE
wartości, ponieważ ostatnie dopasowanie wzoru da indeks końcowego}
, zauważając, że wskaźniki Lua zaczynają się od 1. Jeśli ostatnia liczba była nieparzysta, wówczas wzór i łańcuch miałyby nieznacznie zmodyfikować, choć nie jest to trudne).Nie wygenerowałem i nie uruchomiłem tego programu, ponieważ jest zbyt duży (chociaż teoretycznie mógłby działać na komputerze 64-bitowym, nie zmieściłby się na moim dysku twardym).
Jako dowód koncepcji, oto mały program, który drukuje na
3
tej samej zasadzie:To generuje ciąg kodu
p"3"
poprzez liczbę112034051034
poprzez podział11, 203, 405, 1034
.źródło
Pip , 6681 bajtów, wynik 3
(z dużą ilością nawiasów i zredagowanymi nawiasami kwadratowymi). Wypróbuj online!
Tworzymy listę list, z których każda zawiera
()
(zero) pewną liczbę razy.#*
odwzorowuje operator długości, w wyniku czego powstaje lista liczb.C
bierze każdą liczbę jako kod ASCII i konwertuje ją na znak. Wynikowa lista znaków jest następnie automatycznie łączona i drukowana.Wszystkiego najlepszego z okazji urodzin, Brain-Flak!
źródło
Mathematica, 40 bajtów
Funkcja anonimowa. Nie pobiera danych wejściowych i zwraca ciąg wyjściowy.
źródło
Galaretka ,
1921 bajtówNie ma tu nic mądrego, tylko kompresja słownika + tekstu oraz końcowy znak nowej linii, aby usunąć niedopasowane
<
.Aby uzyskać prawdziwie golfowe podejście, zobacz tę odpowiedź Erik the Outgolfer.
Wypróbuj online!
źródło
PHP, 42 bajty
Wypróbuj online!
-5 Bajtów nudne rozwiązanie
PHP, 60 bajtów
Wypróbuj online!
źródło
<?=""?>
Ułożone , wynik 23
Gdzie
...
jest pominięty ciąg. (Można to wygenerować za pomocą tego .)Wypróbuj online!
Tak, nie tak kreatywny. Pobiera liczbę wszystkich
<>
s i konwertuje je na kody znaków.źródło
Perl 5 , 3304 bajty, 16 punktów
Wypróbuj online!
Wykorzystuje kodowanie długości przebiegu w rozwiązaniu Python @ HeebyJeebyMan.
źródło
Java, 140 bajtów
Wypróbuj online
źródło
C, 52 bajty, wynik 46
Wersja naiwna. Oto zoptymalizowana wersja .
źródło
Węgiel drzewny , 37 bajtów
Wypróbuj online!
Po prostu drukuje ciąg.
źródło