Oto prosty bałwan artystyczny ASCII :
_===_
(.,.)
( : )
( : )
Zróbmy mu przyjaciół. Będzie to ogólny wzorzec dla naszych śnieżnych artystów ASCII:
HHHHH
HHHHH
X(LNR)Y
X(TTT)Y
(BBB)
Wiodące miejsca i nawiasy są zawsze takie same dla wszystkich snowpeople. Różne litery reprezentują sekcje wzoru, które można indywidualnie zmieniać. Każda sekcja ma dokładnie cztery ustawienia wstępne dla tego, jakie znaki ASCII mogą ją wypełnić. Mieszając i dopasowując te ustawienia wstępne dla wszystkich ośmiu sekcji, możemy stworzyć różnych snowpeople.
Wszystkie ustawienia wstępne
(Zauważ, że spacje są umieszczane w przeciwnym razie puste linie, więc kształt przekroju jest zawsze poprawny.)
H jest dla Hat
Słomiany kapelusz
_===_
Meksykański kapelusz
___ .....
Fez
_ /_\
-
___ (_*_)
N oznacza nos / usta
Normalna
,
Kropka
.
Linia
_
Żaden
L oznacza lewe oko
Kropka
.
Większa kropka
o
Największa kropka
O
Zamknięte
-
R oznacza prawe oko
(Ta sama lista co dla lewego oka.)
X oznacza lewe ramię
Normalne ramię
<
Ramię w górę
\
Ramię w dół
/
Żaden
Y oznacza prawą rękę
Normalne ramię
>
Ramię w górę
/
Ramię w dół
\
Żaden
T jest dla tułowia
guziki
:
Kamizelka
] [
Wewnętrzne ramiona
> <
Żaden
B oznacza bazę
guziki
:
Stopy
" "
Mieszkanie
___
Żaden
Wyzwanie
Napisz program, który pobierze ośmioznakowy ciąg znaków (w formacie stdin lub wiersza poleceń) w formacie HNLRXYTB
, w którym każda litera jest cyfrą od 1 do 4, która wskazuje, które ustawienie wstępne należy zastosować dla odpowiedniej sekcji snowperson. Wydrukuj cały snowperson na stdout.
Na przykład dane wejściowe 11114411
to bałwan na górze strony. (Po pierwsze 1
: ma słomkowy kapelusz, po drugie 1
: ma normalny nos itp.)
Kolejny przykład, snowperson dla danych wejściowych 33232124
:
_
/_\
\(o_O)
(] [)>
( )
Detale
Dowolne ilości i kombinacje spacji wiodących / końcowych i nowych / wiodących znaków nowej linii są dozwolone, dopóki ...
- snowperson ma odpowiednio ustawione wszystkie sekcje względem siebie, oraz
- nigdy nie ma więcej niż 64 znaków białych znaków (ogólny wzór to tylko 7 × 5, więc prawdopodobnie nie przekroczysz tego limitu).
Nie trzeba drukować wierszy / kolumn wzoru, jeśli zawierają one tylko białe znaki. np. pusta linia słomkowego kapelusza nie jest wymagana.
Musisz użyć kolejności części, jak podano powyżej.
Zamiast programu możesz napisać funkcję, która przyjmuje ciąg cyfr jako argument. Dane wyjściowe powinny być wydrukowane normalnie lub zwrócone jako ciąg.
- Jeśli chcesz, możesz traktować dane wejściowe jako liczbę całkowitą zamiast ciągu.
Punktacja
Najkrótszy kod w bajtach wygrywa.
Pytanie dodatkowe: Który z 65536 różnych snowparian jest twoim ulubionym?
Odpowiedzi:
CJam,
135134132130126125 bajtówAby utworzyć plik na komputerze, wykonaj
xxd -r > snowman.cjam
, wklej odwracalny zrzut heksowy z góry, naciśnij Enteri na końcu Ctrl+ D.Alternatywnie możesz wypróbować kod online za pomocą interpretera CJam .
Premia
Moim ulubionym bałwanem jest Olaf:
Zima to dobry czas, aby zostać i przytulić się, ale zostaw mnie latem, a ja będę ... szczęśliwym bałwanem!
Pomysł
Ciąg szesnastkowy
koduje możliwe wybory dla wszystkich części bałwana, w tym stałych. Nazwijmy ten ciąg P .
Aby go zdekodować, konwertujemy P (tutaj traktowane jako tablicę liczb całkowitych) z podstawy 256 na podstawę 20 i zastępujemy każdą z wynikowych liczb całkowitych odpowiednim znakiem ciągu M :
Wynikiem jest ciąg T :
Pierwsza linia koduje wszystkie wybory kapelusza, ostatnia wszystkie stałe części ciała. Pozostałe linie zawierają 28 zmiennych części ciała.
Dzielimy T przy liniach i dzielimy łańcuchy wynikowej tablicy na cztery części o równej długości. Następnie odczytujemy dane wejściowe ze STDIN, wciskamy tablicę cyfr w bazie 10 i wybieramy odpowiednie elementy podzielonych ciągów. Korzystamy z faktu, że tablice owijają się w CJam, więc element o indeksie 4 tablicy o długości 4 jest tak naprawdę pierwszym elementem. Ostatni podzielony ciąg nie odpowiada żadnym wejściom, więc zostanie wybrany całkowicie.
Obsługujemy kapelusz, przesuwając pierwszy element poza wynikową tablicę. Indeks w M pierwszego znaku, odczytany jako podstawowa liczba 4, pokazuje liczbę spacji i znaków podkreślenia w pierwszym wierszu czapki. Drukujemy te znaki, przesuw linii, spację i resztę przesuniętego łańcucha. Następnie wciskamy dodatkowe podawanie linii na spodzie stosu.
W przypadku części ciała łączymy ciąg odpowiadający im wszystkim. Nazwijmy ten ciąg S . W celu zmontowania części ciała wykonujemy transliteracje: wziąć każdy znak łańcucha M , obliczyć jego indeks rodzaju (M) i zastąpienie go przez odpowiedni charakteru S . Korzystamy z faktu, że operator transliteracji automatycznie dopełnia S, aby dopasować długość sortowania (M) , powtarzając ostatni znak S tyle razy, ile to konieczne.
Na koniec dzielimy powstały ciąg na podciągi o długości 7 i umieszczamy linię między każdą parą podciągów.
Kod
Załóżmy, że zmienne
M
iP
zawierają ciągi M i P .źródło
JavaScript ES6,
210208202 bajtówTo anonimowa funkcja; używasz go wykonując
([function code])('42232124')
. Najbardziej irytującą częścią tego były ramiona, które zajmują 2 linie, więc musiałem dołączyć kod zarówno dla góry, jak i dołu.Poniższy fragment stosu zawiera niepopoznany kod, skomentowany niezgodnie z ES6. Możesz go użyć do łatwego przetestowania kodu i wypróbowania różnych kombinacji. Edycja: Mam za dużo zabawy z tym. Dodałem kilka nowych funkcji, w tym sposób generowania losowego bałwana.
Dzięki Yair Rand za oszczędność sześciu bajtów.
źródło
1 1
->11
) i dodając||' '
na końcu.CJam, 164 bajty
Generuje bałwana od lewej do prawej, od góry do dołu. Eliminuje to konieczność wykonywania jakichkolwiek operacji łączenia lub zmiany pozycji sznurka, ponieważ zostawiam każdy kawałek bałwana na stosie. A następnie, z powodu automatycznego zrzutu stosu na końcu programów:
♫ CJam chce zbudować bałwana! ♫
Wypróbuj online.
Premia
Myśleć poza szablonowo!
32443333
daje oblubienicy człowieka ze śniegu. Musisz trochę to zobaczyć, ale są ramiona wewnętrzne, fez + ramiona skierowane w dół = welon, a głowa faktycznie znajduje się w fezie / welonie. Ogólnie dużą postacią jest zwiewna sukienka, a „oczy” i „nos” to fałdy w sukience.Inne „oko” są nieco ryzykowne ...
źródło
Python,
276289 bajtówTen kod ma 8 dodatkowych bajtów (
\
* 4) dla czytelności.Buduje bałwana krok po kroku.
Premia
F("44444432")
daje „śpiącego rosyjskiego niedźwiedzia”:źródło
Python 2,
354280241261 bajtówDzwonienie
s('33232124')
daje:Ale moimi ulubionymi są
44242123
i41341144
:źródło
s('33232124')
fez nie rysuje. W wielu przypadkach brakuje dolnej połowy czapki. Ponadto0
nie jest jedną z opcji.CJam,
150145 bajtówBaza przekonwertować wszystkie rzeczy!
SE interpretuje niedrukowalne, więc tutaj jest kopia na Pastebin. Upewnij się, że skopiowałeś część „RAW Paste Data”, a nie część obok numerów linii. Możesz wypróbować online , ale bezpośredni link może nie działać w niektórych przeglądarkach.
Wyjaśnienie
"b8li'U9gN;|"125:Kb8bp
Część generuje tablicęktóry odwzorowuje każdą cyfrę wejścia na miejsce, w którym używana jest cyfra. Wszystkim, co jest wspólne dla wszystkich danych wejściowych (np. Spacje wiodące i
()
), arbitralnie przypisywane jest 0, z wyjątkiem pierwszego, któremu przypisano 1, aby konwersja bazowa mogła działać.l:~f=
następnie konwertuje każdą cyfrę na liczbę całkowitą i odpowiednio mapuje, np. dla14441133
otrzymania"G.HMtNY7VM=BM@$^$dX8a665V"KbFb"=_./ <[(*-oO,\":"f=
daje ciągpo którym możemy powielać, wymienić
/<[(
się\>])
i dołącz do dać długi łańcuch. Następnie dzielimy ciąg na grupy po 4 i mapujemy według innej tablicy"r pL|P3{cR`@L1iT"Kb21b
, uzyskując w ten sposób tablicę ciągów o długości 4 opisujących wszystkie możliwe opcje w każdej komórce (np. Czy_=./
są wszystkie możliwe opcje dla drugiego znaku w drugim wierszu, zaczynając od Rosyjski kapelusz).Na koniec mapujemy odpowiednio opcje na dane wejściowe
.=
, dzielimy na rzędy o długości 77/
i riffle w niektórych nowych wierszachN*
.Testy przebiegają
źródło
TI-BASIC, 397 bajtów
Ważne: jeśli chcesz to przetestować, pobierz go stąd i wyślij ten plik do kalkulatora. Czy nie próbować skopiować poniższy kod do edytora programu TI-CONNECT CE lub SourceCoder 3 lub czegoś do tworzenia i wysyłania go do kalkulatora; w przypadku TI-Connect powie, że ma nieprawidłowy token. SC3 używa ukośnika odwrotnego jako ogranicznika komentarza (
//
rozpoczyna komentarz w SC3;/\/
jednak eksportuje jako//
), więc nie eksportuje broni i czapki i tak poprawnie, powodując, że program wyświetla zarówno nieprawidłowe części ciała, jak i rzuca BŁĄD: DOMENA co jakiś czas. Zabawne rzeczy!Ważne # 2: Jestem zbyt leniwy, aby w tej chwili naprawić pobieranie, więc kiedy przesyłasz go do swojego programu, zmień
7
trzeci wiersz z dołu naX+6
. Poniższy kod został naprawiony, jeśli chcesz porównać.Premia: Szczególnie lubię
12341214
.Niektóre uwagi:
[2ND] → [0]CATALOG → [3]θ → scroll down, it's between ﹢ (small plus) and · (interpunct)
) zamiast kropki , aby oczy nie pokrywały się z przecinkiem, ponieważ wygląda to dziwnie jak diabli.źródło
length(Ans
powinno byćlength(Str9
; po drugie, czy próbowałeś połączyć Str3 do Str6 w jeden ciąg?C,
280 272264 bajtówW tym momencie tylko częściowo grał w golfa, ale jest to zabawne wyzwanie.
(Z dodatkowymi \ n dla czytelności.) Spodziewam się, że
define
powinienem odejść z dalszym golfem.Bardziej czytelna wersja to
źródło
C, 212 bajtów
Czytelna wersja:
Wziąłem ten pomysł z odpowiedzi Reto Koradi . Wprowadziłem kilka fajnych ulepszeń, które mogą uzasadnić opublikowanie osobnej odpowiedzi:
\"
(-3)t[i++]
przez*t++
(-4)while
przezfor
; usunięty{}
(-4)\0
(-9)t[...],t+=4
aby(...)[t+=4]
wyeliminować operator przecinka (-1)Skąd te wszystkie kłopoty? Aby podzielić się moim ulubionym, śnieżnym duchem:
źródło
d
main
JavaScript, 489 (bez nowego wiersza i kart)
Biegnij z
node snowman.js 33232124
źródło
parseInt
połączenia, ponieważ odejmowanie automatycznie próbuje rzutować operandy na liczby. Możesz także pozbyć sięfunction
zawijania i po prostu prowadzići=process.argv[2]
, chyba że używasz go do rekurencji lub zakresu zmiennych. Dodatkowo możesz sięs
całkowicie pozbyć i po prostu zrobićconsole.log([ ... ].join('\n'))
.,
znaków, ale pozwala usunąć więcej niż 50. W końcu,q=j[4]-1
zamiastq=j[4]==1
(a następnie odwracając użycieq
i!q
) , użyłaby jednej bardzo drobnej optymalizacji . Spowoduje to, żeq
będzie0
(wartość falsey), kiedyj[4]
jest1
, a poza tym prawdziwie niezerowa wartość. Jest to dokładne przeciwieństwo bieżących wartości prawda / fałsz, więc po prostu przełączaszq
i!q
.Pyth, 203 bajty
Lol. Wypróbuj online: Pyth Compiler / Executor
Wyjaśnienie
Najpierw definiuję funkcję pomocnika
g
, która pobiera listę i znak jako dane wejściowe, konwertuje znak na jego wartość ASCII i przyjmuje odpowiedni element (modułowe zawijanie).Inne rzeczy to po prostu drukowanie linia po linii. Na przykład pierwszy wiersz to:
Btw. Eksperymentowałem trochę z tym
.F"{:^7}"
, co wyśrodkowuje strunę. Korzystając z niego, mogę zapisać kilka spacji w kodzie, ale nie zapisuje on żadnych bajtów na końcu.źródło
R,
436437 bajtówOto moja pierwsza próba gry w golfa z użyciem kodu , która nie jest najkrótsza, ale nadal sprawia przyjemność. Przynajmniej pokonuję JavaScript (na razie) ...
Testowanie:
I rzeczywiście z trudem
X
iY
jest multilined ale z materiałem pomiędzy, skończyło się oddzielając linię (X
,S
) i (Y
,U
).function
i konwersja z ciągu na liczbę całkowitą jest również bardzo szczegółowa.Edytuj 436 => 437
Musiałem naprawić brakujące puste miejsce zauważone przez @OganM
Mógłbym zredukować do 428, zastępując podziały linii między zmiennymi
;
, ale kod „jednowierszowy” wygląda tak źle i nieczytelny, że nie będę aż tak chciwy.źródło
Haskell,
361306289 bajtówStosowanie:
Jak to działa: indeksuj każdy element listy
[hat options, left upper arm options, left eye options, ..., base options]
odpowiednim numerem wejściowym i konkatenuj go w jedną listę. Podzieliłem lewą i prawą rękę na górną i dolną część, aby móc budować bałwana linia po linii.Moim ulubionym jest klasyk
11112211
.Edycja: przełączono z listy ciągów na ciągi dla części (kapelusz, oko, ...). Potrzebuje drugiego parametru - długości podciągu do wzięcia.
Edycja II: wyodrębniono typowe podciągi
źródło
C,
233230 bajtówZ nowymi liniami i białymi znakami dla lepszej czytelności:
Całość to dość brutalna siła. Używa tabeli, która zawiera jeden wpis dla każdego z 35 (5 wierszy o długości 7) znaków. Każdy wpis w tabeli to:
,
(
,)
. Długość wpisu w tabeli wynosi 1 znak.Następnie kod zapętla 35 znaków i sprawdza wartość w tabeli.
źródło
R 414 bajtów
Nieznacznie zmodyfikowana wersja wersji Molx
Po prostu połączyłem osobne zmienne w jedną. Shawing trochę miejsca, które zostało wykorzystane do
X=c(
rutyny.źródło
CJam,
200191 bajtówZ pewnością można w to dużo grać w golfa. (Szczególnie, jeśli go koduję). Ale tutaj jest na początek:
Wejście przechodzi w STDIN. Na przykład dane wejściowe
23232223
dają:Wypróbuj online tutaj
źródło
Haskell, 333 bajty
Moje pierwsze zgłoszenie! Buduje bałwana od góry do dołu, od lewej do prawej. Podzielę ramiona na dwie funkcje dla każdego ramienia, część przy głowie i część przy ciele.
Funkcja s pobiera listę liczb całkowitych i konkatenuje dane wyjściowe funkcji, które tworzą części ciała, biorąc pod uwagę poprawne podlisty danych wejściowych.
To zależy od funkcji
który zwraca n-ty element podanej listy. Pozwala to na listę czapek w, a także rzeczy takich jak
wszystkie te funkcje wykorzystują redukcję beta, więc ich argument jest przekazywany jako indeks funkcji y.
Wynik:
źródło
Python 3,
349336254251 bajtówTyle za zrobienie mojej pracy magisterskiej.
Oto zawartość pliku snowman.py :
I w ten sposób wyczuwam mojego ulubionego bałwana:
Wyjaśnienie
źródło
[int(i)]
ifor
. Podobnie możesz usunąć spację w linii 7 pomiędzyf(int(i))
ifor
. Ponadto w swoimprint()
oświadczeniu nie musisz drukować końcowej przestrzeni - nie jest to część bałwana. Na koniec zmieńprint()
połączenie na jedną linięprint("{}\n{}({}{}{}){}\n{}({}){}\n ({})".format(*c))
. Każdy z nich powinien zaoszczędzić 1 bajt, oszczędzając w sumie 4 bajty :)n
, możesz zdefiniować atrybut funkcjif
. Możesz więc zamienić linie 5-6 na:def f(m):f.n+=1;return l[4*m+int(b[f.n])-1]
<nowa linia>f.n=-1
. Zmniejsza to 3 kolejne bajty.PowerShell , 199 bajtów
Inspirowany Reto Koradi i anatolygiem .
Wypróbuj online!
Uwaga: Linia 3 ma 2 miejsca na szlaki, linia 4 ma miejsce na szlaki.
Moim ulubionym jest
44444444
„śpiący rosyjski strażnik”:źródło
JavaScript (ES6), 247
Nie tak dobra reklama @ NinjaBearMonkey :(
Test we fragmencie (w przeglądarce Firefox)
źródło
05AB1E ,
137135128122 bajtów-6 bajtów dzięki @Grimy .
Wypróbuj online lub sprawdź kilka innych przypadków testowych .
Wyjaśnienie:
Najpierw tworzymy ciąg szablonu:
Który wygląda tak:
Następnie zapętlam cyfry wejścia:
I wykonaj następujące czynności:
Wciśnij (0-indeksowany) indeks
N
listy:Wciśnij wszystkie możliwe części jako listę list postaci:
Użyj indeksu pętli,
N
aby uzyskać listę znaków części, z którą obecnie pracujemy:Następnie podziel listę znaków na cztery równe części i użyj cyfry wejściowej
y
(która jest indeksowana 1), aby się do niej zindeksować. (UWAGA: Ponieważ 05AB1E ma indeksowanie 0, ale wejście ma indeksowanie 1, logiczne byłoby zmniejszenie cyfry o 1 przed indeksowaniem. Jednak ponieważ 05AB1E ma automatyczne zawijanie (tzn. Spowoduje indeksowanie3
listy ), po prostu raz obróciłem części, więc części z numerem 4 w opisie wyzwania znajdują się na początku listy).[1,3,5]
1
A następnie zamień indeksowany przez 0 indeks pętli, którą najpierw wypchnęliśmy, po kolei znakami części:
Ostatecznie wynik jest dorozumiany.
Zobacz moją wskazówkę 05AB1E (sekcja Jak kompresować duże liczby całkowite? I Jak kompresować listy liczb całkowitych? ), Aby zrozumieć, jak działają części kompresji.
Co do mojego ulubionego, to wciąż ten sam „śnieżny królik” jak 1,5 roku temu, kiedy opublikowałem moje rozwiązanie Java :
źródło
0
między oczami. :)Java 8,
548545432401399 bajtówWypróbuj tutaj.
Wyjaśnienie:
Mój ulubiony:
Nie wiem dlaczego, ale wygląda to trochę uroczo. Jak królik z rosyjskim kapeluszem zamiast uszu.
źródło
F #, 369 bajtów
Wypróbuj online!
Ponieważ
g
używa akcesorium tablicowego, muszę jawnie określić typ w definicji funkcji jakostring
, i dlatego definicja funkcji ma(g:string)
.Poza tym zwykle jest to tablica, do której
strings
dostęp uzyskuje indeks. Czapka, lewe i prawe ramiona, które biegną osobnymi liniami, są podzielone na oddzielne górne i dolne tablice.i
Funkcja zmiany numeru w argumentg
do indeksu tablicy. I literab
zastępuje ciągi jednowymiarowe w tablicach.Świetne wyzwanie! Moim ulubionym bałwanem jest prawdopodobnie
242244113
:obserwuję Cię
źródło
PHP, 378 bajtów
Wypróbuj online!
Lubię mądrego Pana Owl
31333342
źródło
Python 2.7, 257 bajtów (myślę)
gdzie „i” to dane wejściowe jako ciąg znaków (np. „13243213”)
źródło
i
dlainput()
w sumie 262 bajtówDart , 307 bajtów
Wypróbuj online!
źródło
Zsh, 247 bajtów
spróbuj online !!
ulubiony bałwan:
źródło