Mam nadzieję, że to zdjęcie wygląda znajomo.
Jest to jeden z duchów Pacmana w jego „wrażliwym” stanie , po tym jak Pacman zjadł pigułkę mocy.
Wyzwanie
Wyobraź sobie naszego ducha w małej ramce, używając grafiki ASCII. W normalnej skali (więcej o tym później) każdy kwadrat na powyższym obrazku powinien odpowiadać jednemu znakowi, a ramka powinna mieć jednoznakowy rozdział w górę i w dół oraz dwuznakowy rozdział po lewej i prawej stronie ducha :
####################
# #
# #### #
# ######## #
# ########## #
# ############ #
# ############ #
# ### ## ### #
# #### ## #### #
# ############## #
# ############## #
# ## ## ## ## #
# # ## ## ## # #
# ############## #
# ## ### ### ## #
# # ## ## # #
# #
####################
Ale to nie wygląda bardzo ładnie. #
może nie być najlepszym wyborem dla aktywnych pikseli. Poza tym komórki postaci nie są kwadratowe, co sprawia, że nasz przyjaciel wygląda bardziej upiornie niż on już jest.
Aby mieć większą elastyczność, obraz zmieni się zgodnie z trzema parametrami wejściowymi:
- Znak używany dla aktywnych pikseli;
- Współczynnik skali poziomej;
- Współczynnik skali pionowej.
Na przykład, z %
, 4
, 2
ouput byłoby lepiej wygląda obraz
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% %%%%
%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%
%%%% %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Zasady
Wszystkie wbudowane dozwolone.
Dane wejściowe są pobierane w dowolnym rozsądnym formacie i dowolnej kolejności. Pierwsze wejście powyżej (znak dla aktywnych pikseli) jest gwarantowanym drukowalnym znakiem ASCII (kody od 32 do 126).
Dopuszczalne są końcowe spacje po każdej linii lub końcowe nowe linie po ostatniej linii.
Code golf, najmniej bajtów wygrywa.
źródło
Odpowiedzi:
CJam,
535149 bajtówPamiętaj, że trzech znaków nie można wydrukować. Wypróbuj online!
tło
Prawa połowa nieskalowanego wyjścia jest identyczna z lewym, więc wystarczy zakodować jedno z nich. Jeśli zamienimy spacje na zera, a spacje na jedynki, otrzymamy
gdzie każdą linię można interpretować jako liczbę binarną. To daje
Najprostszym sposobem na zakodowanie tych informacji jest zastąpienie każdej liczby całkowitej znakiem Unicode w tym punkcie kodowym, ale wszystkie one wymagają kodowania dwóch bajtów za pomocą UTF-8.
XORując liczby całkowite za pomocą 544, utrzymujemy wszystkie liczby całkowite oprócz dwóch poniżej 128 i unikamy bajtów zerowych.
Wynik to
jako liczby całkowite lub
jako łańcuch znaków ucieczki.
Jak to działa
źródło
Perl,
1131051041009796Dodano +2 do
-ap
Sugestie dev-null save 9 bytes Naprawiono złą liczbę, jak zauważył Dennis
Uruchom za pomocą
echo "2 4 %" | perl -ap pacman.pl
pacman.pl
:z wyjątkiem tego, że ciąg
"\xff\x00\x03\x0f\x1f\x3f\x3f\x39\x79\x7f\x7f\x66\x59\x7f\x6e\x46\x00\xff"
powinien być zapisany w formie binarnej z pojedynczymi cudzysłowamiSpacja jako znak zastępujący staje się pustym ciągiem i prowadzi do krótkich linii. Ale i tak wszystko będzie puste
źródło
Dyalog APL, 64 bajty
To przyjmuje współczynnik skali jako lewy argument, a znak jako prawy argument, tj .:
Wyjaśnienie:
⍉(7/2)⊤⎕AV⍳'Äâ\⊥⊥∘)⍞⍞┬#⍞`⍒'
: Lewa połowa ducha, bez granicy. (Jest symetryczny.) Każdy znak ma ustawiony wysoki bit, aby zapobiec wybieraniu znaków niedrukowalnych⎕AV
, ale używane są tylko pierwsze 7 bajtów.0,⍪⍨0⍪0,0,
: dodaj ramkę odstępów po lewej, u góry i na dole1⍪⍨1⍪1,
: dodaj ramkę po lewej, u góry i na dole,∘⌽⍨
: połącz z pionowym lustrem1+
: dodaj 1, ponieważ tablice są domyślnie indeksowane 1' '⍵[
...]
: użyj tej macierzy jako indeksu w ciągu' '⍵
, więc każde 0 zostanie zamapowane na puste, a każde 1 zostanie zamapowane na⍵
.⍺,⊂
: dołącz macierz i dołącz ją do współczynników skali/
: składanie w prawo z następującą funkcją:/∘⍉
: transponuj i skaluj w poziomieźródło
MATL , 71 bajtów
Wypróbuj online!
Wyjaśnienie
Obraz jest symetryczny poziomo, więc należy zakodować tylko lewą połowę. Każdy wiersz 10-pikselowy jest kodowany binarnie jako liczba od 0 do 1023. Aktywne piksele są kodowane jako 0 zamiast 1, więc pierwszy wiersz ma liczbę 0 zamiast 1023.
Ponieważ kolejne wiersze różnią się tylko kilkoma pikselami, liczby są dalej kodowane w różny sposób. Tak więc każdy wiersz zostanie zdekodowany jako skumulowana suma wszystkich liczb aż do tego wiersza, a następnie nastąpi konwersja do wartości binarnej.
Potrzebne są wtedy liczby
0 wprowadza się w MATL-u za pomocą
O
funkcji, która pozwala uniknąć separatora z sąsiednimi liczbami. Ponadto znaki ujemne nie oznaczają dodatkowych bajtów, ponieważ służą jako separatory.Po utworzeniu tablica jest sumowana, dekodowana binarnie i dublowana poziomo. Powstała tablica 2D służy do indeksowania ciągu dwóch znaków w celu uzyskania wyniku. Ten ciąg ma postać
'% '
, w której'%'
jest znakiem wejściowym.Jak zauważył @Conor, kod działa również z dwoma znakami jako danymi wejściowymi. W tym przypadku końcowy ciąg indeksowany będzie miał postać
'%_ '
, w której wejściem jest ciąg dwóch znaków'%_'
. Spacja zostanie po prostu zignorowana, ponieważ tablica indeksowania odnosi się tylko do pierwszych dwóch znaków.źródło
C (gcc) ,
199197 bajtów-2 bajty dzięki @JonathanFrech
Wypróbuj online!
188 bajtów (niedrukowalne)
Dzięki uprzejmości @JonathanFrech.
Wypróbuj online!
Nie dzieje się nic spektakularnego. Jak zauważyli inni, duch jest wysoce symetryczny. Sam obraz ma szerokość 20 jednostek, ale oprócz górnego i dolnego rzędu trzy kolumny znajdujące się najbardziej po prawej stronie są identyczne. To pozwala nam przechowywać połowę obrazu jako znaki, zamiast konieczności używania liczb całkowitych:
Powstały ciąg został odwrócony, aby wyodrębnić kilka bajtów o posiadaniu malejącej pętli for (rozwiązując również irytujący problem z ucieczkami szesnastkowymi). Inne pętle można bez problemu odwracać dzięki symetrii.
Każda postać jest przesuwana w lewo i ma obramowanie (ze szczególną ostrożnością w pierwszym i ostatnim rzędzie). W takim razie wystarczy tylko poprawnie wyskalować łańcuch.
Wszystkie pętle for sprawiają, że mam lepszy sposób.
źródło
\xff
nie można go zastąpićÿ
( TIO )?Poważnie, 116 bajtów
Ta nowa linia jest ważna. Hexdump:
Taka sama strategia jak Dennisa CJam , ale wartości są zakodowane w postaci szesnastkowej, a nie XORed w 544, a manipulowanie łańcuchem jest znacznie trudniejsze w serialu.
Wypróbuj online!
źródło
BBC BASIC,
239236232214 bajtówPowołanie
PROCM(1,1,35)
tworzy ducha złożonego z # symboli. Argumentami dla PROCM są: skala pozioma, skala pionowa, wartość znaku ASCII.Ten program będzie działał zarówno dla Brandy Basic, jak i BASIC 2 na oryginalnym Modelu B.
źródło
Partia,
740722720 bajtówEdycja: Zapisano
1820 bajtów, usuwając niepotrzebne spacje.źródło
Stax , 45 bajtów
Uruchom i debuguj
Wyjaśnienie:
źródło
JavaScript (ES6), 167 bajtów
Na podstawie odpowiedzi @ Dennisa. Wydaje mi się, że możesz wygolić kolejny bajt, używając dosłownie FF zamiast
\f
, ale wątpię, czy mógłbym wkleić tutaj jeden bajt . Podczas wypróbowania tego możesz także użyć\u01CA
zamiastNJ
postaci.Niestety przygotowanie spacji do argumentu znaku kosztuje całe 6 bajtów.
źródło
Python 2,
838828618 bajtówZaoszczędziłem 210 bajtów, używając łańcucha zamiast tablicy, dzięki Dennisowi za tę sugestię, wiem, że mogę ulepszyć, ale na razie jest to dobra poprawa.
To najlepsze, co mogę zrobić, nie jestem zbyt dobry z grafiką w wierszu poleceń.Wziąłem małego ducha jako bazę.
Domyślnie używam ascii 219, ponieważ z tym charakterem duch wygląda całkiem niesamowicie !!!
Grał w golfa
Przymierz to repl.it
Bez golfa
Test
źródło
Python 2, 244 bajty
źródło
Python 2, 169 bajtów
Wypróbuj online!
Wyjaśnienie:
Tak jak w odpowiedzi Dennisa , każdy znak w tym ciągu reprezentuje binarną reprezentację jednej linii lewej połowy „obrazu”, XOR 544.
Dla każdego znaku w ciągu wykonaj następujące czynności:
Przekształć znak w jego całkowitą reprezentację, a następnie wykonaj binarny XOR za pomocą 544. Następnie przekształć tę liczbę całkowitą w ciąg znaków jego reprezentacji binarnej, na przykład „0xb1111111111”.
Dla każdej postaci w żądle, zaczynając od pozycji 2 (która pomija 0b na początku), wykonaj następujące czynności:
Jeśli znak == „1”, zamień go na dostarczony znak, w przeciwnym razie zastąp go spacją. Następnie skopiuj ten znak x razy. (x = 0 spowoduje powstanie pustego ciągu).
Połącz wszystkie ciągi w jeden długi ciąg oddzielony pustym ciągiem „”.
zrób ciąg b + odwrotność b, następnie utwórz tablicę zawierającą y wystąpienia tego ciągu (y = 0 spowoduje utworzenie pustej listy []), a następnie dołącz tę listę do listy z.
Na koniec wydrukuj, aby przeskanować każdy z wyprodukowanych ciągów, oddzielonych podziałami linii.
źródło