Jest to problem dotyczący Luogu OJ. Postanowiłem opublikować go tutaj, ponieważ w Luogu OJ wiele osób, w tym ja i mój przyjaciel, jest zainteresowanych tym, jak rozwiązać ten problem wśród jak najmniejszej liczby postaci.
Twoim zadaniem jest wygenerowanie następującej grafiki ASCII:
************
####....#.
#..###.....##....
###.......###### ### ###
........... #...# #...#
##*####### #.#.# #.#.#
####*******###### #.#.# #.#.#
...#***.****.*###.... #...# #...#
....**********##..... ### ###
....**** *****....
#### ####
###### ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
########################################## #----------#
#.....#......##.....#......##.....#......# #----------#
########################################## #----------#
#.#..#....#..##.#..#....#..##.#..#....#..# #----------#
########################################## ############
To jest golf golfowy, więc wygrywa najkrótszy program.
code-golf
ascii-art
kolmogorov-complexity
Wysoce radioaktywny
źródło
źródło
Odpowiedzi:
Brainfuck , 1347 bajtów
Dlaczego robię to sobie
Wypróbuj online!
Wersja „czytelna”:
źródło
T-SQL,
322 298288 bajtówUżywa kompresji G-Zip wbudowanej w SQL 2016 i później, wraz z kodowaniem Base64, zobacz ten post z poradami, aby uzyskać szczegółowe informacje .
W SSMS albo będziesz musiał wyprowadzać tekst jako majsterkowanie w ograniczeniach znaków SSMS w ustawieniach, albo po prostu skopiuj i wklej dane wyjściowe do okna kodu:
EDYCJE : Zapisano 24 bajty z lepiej skompresowanym łańcuchem dzięki @someone; zapisano 10 bajtów z niejawną konwersją przy użyciu
CONCAT
, dzięki @digscoop.źródło
H4sIAAAAAAACA6WRQYrEIBQF955CqJ0wdf/jjehM2rwOdofUQvIoHj9f65m2UMLRsYNng/4ZQU0NThjUtBFLDXwRBpWIWYfGpCaIRCy5cZswuFVX6U3bOAA73/+8nXYw2368uWwfj3r5MKzfq4W0UHhEQcUBsk0/b9yafllX9P/YpeDu7rVDTF6226WoPpy6bMUmPZ66UH4BHz4rVE8EAAA=
. Nie mogę tego przetestować, ponieważ nie mam pojęcia, jak to zrobić, ale możesz lub nie możesz pominąć=
.=
) i oszczędza 24 bajty; zgadnij, że moja procedura kodowania jest daleka od ideału.DECLARE @ XML='H4sIAAAAAAACA6WRQYrEIBQF955CqJ0wdf/jjehM2rwOdofUQvIoHj9f65m2UMLRsYNng/4ZQU0NThjUtBFLDXwRBpWIWYfGpCaIRCy5cZswuFVX6U3bOAA73/+8nXYw2368uWwfj3r5MKzfq4W0UHhEQcUBsk0/b9yafllX9P/YpeDu7rVDTF6226WoPpy6bMUmPZ66UH4BHz4rVE8EAAA='SELECT CONCAT('',DECOMPRESS(@.value('.','varbinary(max)')))
CONCAT
lewy, ale nie zmiennej XML, ponieważPHP ,
176155 bajtów-21 bajtów dzięki super skompresowanemu ciągowi Ryana Moore'a .
Ta wersja wykorzystuje surowe dane wyjściowe gzdeflate i zawiera niezadrukowane dane binarne, więc sam kod i link TIO nie mogą być tutaj zamieszczone, ale oto zrzut heksowy :
Dzięki @dzaima , oto TIO, które używa bash do utworzenia i uruchomienia tego pliku: Wypróbuj online!
To w zasadzie odwraca deflację i drukuje wynik. Zapisz go jako plik binarny, a następnie uruchom go w następujący sposób:
php mario.php
PHP ,
239216 bajtów-23 bajty dzięki super skompresowanemu ciągowi Ryana Moore'a .
Wypróbuj online!
Taki sam jak powyższa wersja, ale użyty kod wyjściowy base64_encode na wyjściu
gzdeflate
, więc kod jest czytelny i dostępny jest również link TIO. To w zasadzie odwraca base64 i defluje i drukuje wynik.źródło
Bubblegum , 138 bajtów
Wypróbuj online!
źródło
Galaretka ,
235213 bajtówWypróbuj online!
Wykorzystuje kombinację kodowania długości przebiegu i zastępowania wspólnych sekwencji długości 2 jedną cyfrą. Nie używa żadnej standardowej biblioteki kompresji, takiej jak gzip. Ogólnie ma 169 bajtów skompresowanych danych i 44 kodu.
Wyjaśnienie
Krok 1: zamień wartości w danych od 17 do 39 na wstępnie zapisane pary bajtów
Krok 2: Dekodowanie długości przebiegu i konwersja na ciąg
źródło
Lateks,
452448 bajtówUtworzony z zastąpieniem bigramu (i jednym trygramem) zamiast programowania pętli w celu zastąpienia wielu kolejnych symboli.
LaTeX, 506 bajtów
Najprawdopodobniej będzie bardziej wydajny wariant, ale udało mi się to uzyskać ręcznie (brak wbudowanych narzędzi do kompresji w LaTeX ...). Utworzyłem małą pętlę, aby zastąpić kolejne sekwencje.
Wyjście końcowe (obu kodów):
źródło
Bash + coreutils + xz,
243242240 bajtówźródło
Keg ,
22041012745 bajtówWypróbuj online!
Zaoszczędzono 267 bajtów dzięki @Sriotchilism O'Zaic
Program 1012 bajtów
Wypróbuj online!
Jest to po prostu kodowanie obrazu ascii, ale zaimplementowane w Keg
Stary program
Wypróbuj online!
Wiem, że prawdopodobnie nie wygra żadnych konkursów, ale hej, ładnie to wygląda. Dosłownie po prostu ucieka przed każdą postacią i drukuje ją. To znaczy, można grać w golfa, ale czy nie lubisz tylko programów artystycznych w ascii?
źródło
JavaScript (Node.js) ,
265264 bajtówZapisano 1 bajt dzięki @ Night2
Deflated.
Wypróbuj online!
JavaScript (Node.js) , 318 bajtów
Kolejne podstawienia ciągów.
Wypróbuj online!
JavaScript (ES7), 340 bajtów
Zgnieciony.
Wypróbuj online!
Lub tu:
Pokaż fragment kodu
źródło
C (gcc) ,
322320318316 bajtów-2 bajty dzięki pułapkowi cat.
Wypróbuj online!
źródło
Bash + coreutils,
269262261 bajtówTrochę trywialne - nic mądrego się tu nie dzieje. Nie jestem pewien, czy wolno mi używać gzip w ten sposób. Jeśli nie jestem, nie mam wątpliwości, że ktoś na mnie krzyczy.
(lepiej, jeśli usunę bezcelowe spacje / cytaty)
Dzięki @manatwork za zapisanie bajtu
Wypróbuj online!
źródło
echo
polecenie i potok, robiąc tobase64 -d<<<...|gunzip
Python3,
921 916 752 751 539 534476 bajtówA oto obowiązkowa uczciwa wersja. Użyłem skryptu, aby policzyć poszczególne znaki, powinny być identyczne:
Wypróbuj online!
Dzięki uprzejmości niesamowitych facetów w komentarzach, którzy są znacznie lepsi ode mnie!
Oto skrypt (python3) dla wszystkich innych, którzy mogą chcieć wygenerować kod i są zbyt leniwi / wydajni, aby liczyć ręcznie:
Wykorzystano lukę w Pythonie, 167 bajtówPonieważ nic nie powiedziano o standardowych lukach, zakradnę się tutaj, póki będę mógł. TIO z jakiegoś powodu nie lubi urllib, jeśli ktoś zna witrynę, na której można przechowywać skrypt, proszę mi o tym powiedzieć. Oczywiście skracacz linków mógłby zaoszczędzić trochę bajtów, ale nie chciałem dalej schodzić do tej dziury.
źródło
many people, including me and my friend, are interested about how to solve this problem within the fewest characters
, pomyślałem, że warto się śmiać; który pasuje do tematu programowania rekreacyjnego tego postu i części tej witryny.print(input())
MarioLANG ,
3287 32863285 bajtówMusiałem to zrobić dla tematu.
Wypróbuj online!
To okropne i bardzo mi przykro.Pętle mogą stać się naprawdę drogie (bajtowo mądre) w MarioLANG, jeśli nie jesteś mądry na ich temat, a także prawie straciłem wolę życia, zanim dotarłem tak daleko, więc Mario dosłownie biegnie w linii prostej, najpierw ustawienie 6 komórek pamięci na prawidłowe wartości ASCII, a następnie przełączanie między nimi w celu uzyskania danych wyjściowych we właściwej kolejności. Można to zdecydowanie pograć w golfa dalej, a jeśli naprawdę się nienawidzisz, zdecydowanie sugeruję, abyś spróbował.(Zapisano jeden bajt, usuwając ostatnią równą (postać podłogowa), ponieważ Mario trafia w ostatnią instrukcję, gdy spada nawet bez niej, a drugi, uświadamiając sobie, że mógł faktycznie trafić dwie instrukcje jesienią).
5413 bajtów
Wypróbuj online!
Jest to port odpowiedzi przypadkowego faceta za pomocą konwertera Brainfuck Dennisa na MarioLANG, który wprowadza bardzo drobne zmiany, aby zaoszczędzić kilka bajtów. Chociaż jest oczywiście znacznie dłuższy, zawiera więcej funkcji języka i lepiej pokazuje, jak działa ten język, więc pomyślałem, że go uwzględnię.
źródło
Pyth , 211 bajtów
Wypróbuj online!
Metoda kompresji: Ponieważ jest tylko 6 znaków, spacja, znak nowej linii oraz
#.-*
zamień każdy z nich na literę oda-f
. Następnie run-length koduje całość (aaaaaccc
->5a3c
itd.), A następnie kompresuje za pomocą zlib.Skompresowany ciąg to
źródło
Bash , 486 bajtów
Wypróbuj online!
Łańcuch zakodowany w trybie Run-Length $ S wygenerowany przez program inny niż golfowy: Wypróbuj online!
Następnie zmienne $ a, $ b, $ c w $ S zostały zastąpione przez kontrolę ręczną, a pojedynczy $ haczyk musiał być poprzedzony znakiem ucieczki w $ S, aby umożliwić użycie zmiennych.
źródło
Perl,
422396370366365 znakówDługość przebiegu zakodowana w 2 krokach: kolejne znaki i kolejne wzory wielu znaków.
Wypróbuj online!
źródło
PHP,
608565557 bajtówUżywa GMP,
5kJvr...
ciąg został utworzony przez użycie podstawień do konwersji oryginału na bazę56, a następnie GMP do konwersji na bazę 62.Uruchom online.
źródło
Python3, 557 bajtów
Przeprowadź kodowanie długości, a następnie ręcznie wyodrębnij kilka powtórzonych podciągów (spacje, a następnie trzy „#”, „-” otoczone blokami itp.). Zdecydowanie miejsce na ulepszenia
Python3, 789 bajtów
Zabawa z generatorami liczb losowych. Obraz jest kodowany pod względem długości, a następnie dzielony na 6-częściowe. Pierwszy fragment (wskaźniki dla symbolu do wydrukowania) jest generowany z generatora liczb pseudolosowych. Drugi to kodowanie base64 6 liczb.
źródło
print(line1,line2,...,sep='\n')
C,
114210681044 bajtówTo nie jest bardzo dobre, ale udało mi się. Zasadniczo szedłem wiersz po wierszu i w dowolnym miejscu jedna funkcja plus dwa lub więcej wywołań funkcji była krótsza niż oryginalny tekst, zastąpiłem tekst funkcją.
Pozwala to zaoszczędzić 99 bajtów na zwykłym printf.
Zaoszczędzono 69 bajtów, usuwając specyfikatory int i void oraz #include <stdio> . Zapisano kolejne 2 bajty, deklarując i jako globalny zamiast w pętli for . Zapisano kolejne 3 bajty, zmieniając printf na putchar w dwóch miejscach. Usunięto kolejne 21 bajtów ze zmianami sugerowanymi przez @Christian Gibbons: Na początku usunięto deklaracje zmiennych, zmieniono pętlę for na malejącą podczas pętli, zmieniono „\ n” na 10 w funkcji n () . Zapisano kolejne 3 bajty, zmieniając putchar (10) na puts („”) , dzięki uprzejmości tej odpowiedzi .
1143 bajtów
Wypróbuj online tutaj .
Ungolfed (ish)
źródło
s,a,h,d,m,
od początku, zostaną one domyślnie zadeklarowane jakoint
s, gdy zainicjujesz je natychmiast po tym.for(;i++>n;)
pozwoli ci uniknąći
ponownego pisania w pętli.putchar('\n')
->,putchar(10)
aby ogolić jeszcze kilka bajtów. Również wygląda Macie obce;
w swojejz
funkcji.i
całkowicie zrzucić . Zamiast for-loop, zróbwhile(n--)
x()
na górę, możesz miećc()
io()
wywołać go, aby zaoszczędzić trochę bajtów.x()
samo to może zająćint*
, ponieważ wszystkie wskaźniki mają zwykle ten sam rozmiar i drukuje za pomocą,printf(c)
aby zaoszczędzić kilka dodatkowych bajtów. Dwie funkcje można nieco skrócić:n(){p(10,1);}
ip(c,n){while(n--)x(&c);}
(zakłada mały endian). Za każdym razem, gdy wywołujesz funkcję bez argumentu, możesz użyć poprzedniego wywołania funkcji jako argumentu, na przykład:c();n();
->n(c());
.Python ,
340378 bajtówZepsułem kodowanie w oryginalnej odpowiedzi, oto ta oparta na kompresji LZW. Może kiedyś wrócę do mojej pierwotnej odpowiedzi.
Wypróbuj online!
źródło
Czysty JavaScript 419 bajtów (bez lib)
Kompresja (1 krok: policz każdy znak w kodzie szesnastkowym, np.
**********
Daje*a
, 2 krok: przekonwertuj dwa znaki jak * 1 lub # 4 na pojedynczy znak bez kodu ascii)Pokaż fragment kodu
Dekompresja
Pokaż fragment kodu
źródło
PowerShell + tar, 265 = 9 + 256 bajtów
Ten skrypt działa w systemach Windows i Linux. Skrypt wyodrębnia dane wyjściowe z archiwum tar
t
(256 bajtów).t
Powinien być umieszczony w tym samym katalogu co skrypt.Wypróbuj online!
Skrypt PowerShell do utworzenia archiwum tar
t
:źródło
Perl z filtrem: moduł sh, 672 bajty
Jest długi, ale jest również raczej nieczytelny, więc pomyślałem, że kwalifikuje się jako odpowiedź na golfa ...
Objaśnienie: filtr zamienia
S
się na" "
i liczbę nax(num) .
, więc na przykładS14
staje się" "x14
. W Perlu oznacza to „wydrukuj przestrzeń 14 razy”. Ponadto istnieje pewna ręczna kompresja sekwencji, które często występują przy użyciu zmiennych$a
-$h
.źródło
s/regex/replace/g
natywnie składnię?e
modyfikatorze wyrażeń regularnych, który jest potrzebny tutaj do wykonania operatora x po podstawieniu - ale teraz to robię: DSOGL V0.12 , 971 bajtów
Po prostu skopiowałem cały ciąg do kompresora. Uświadomiłem sobie, że struna nie była zbyt mocno skompresowana.
Wypróbuj tutaj!
źródło