VI, 108 bajtów
D:let@a=@"%2?@":@"%4?"X":"\\d"<CR>
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
:%s/<C-r>a/ /g<CR>
:%s/\d/*/g<CR>
<CR>jest Enterudar mózgu, <C-?>odpowiada Control + ?, i <Esc>do Escapeoczywiście. Każdy z nich liczy się dla 1 bajtu (patrz meta ). Podziały linii w rozwiązaniu służą do czytelności. <CR>Reprezentuje tylko prawdziwe Enteruderzenia.
Wkład
Plik wejściowy powinien zawierać tylko 1 znak reprezentujący n.
Uruchomić
VI należy rozpocząć tak:
vi -u NONE input
Objaśnienia
Rozwiązanie zawiera 3 części. Opiszę pierwszą część 2. (2. wiersz), ponieważ jest najłatwiejsza do wyjaśnienia.
Rysowanie słońca
Polecenie narysowania słońca to:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
Słońce musi być sporządzony z , *, 0, 1i 3, podobnie jak to:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
Symetria pomogłaby zmniejszyć rozmiar tej części w bajtach, ale nie jest to takie ważne. Nie wyjaśnię pełnej linii, ale wzorzec *****służy do łatwego wygenerowania ostatniego wiersza, a wzorzec **1110333**został przyjęty jako odniesienie do wygenerowania 3 innych wierszy zawierających 0, 1i 3.
Ważne jest, aby używać 0, 1a 3dla części słonecznych, które mogą być wypełnione (patrz następny wyjaśnień). Narysowanie tego słońca zajmuje 55 bajtów i prawdopodobnie można go zagrać w golfa za pomocą niektórych sztuczek.
Wypełnianie słońca zgodnie z n
Aby prawidłowo wypełnić słońce, postępuj zgodnie z instrukcjami:
- jeśli
n = 0, to 0, 1i 3(wszystkie cyfry) powinny być zastąpione
- jeśli
n = 1, to 1należy zastąpić innymi cyframi*
- jeśli
n = 2, to 0, 1i 3(wszystkie cyfry) powinny być zastąpione*
- jeśli
n = 3, to 3należy zastąpić innymi cyframi*
- jeśli
n = 4, to 0, 1i 3(wszystkie cyfry) należy zastąpić (jak n = 0)
Z tego możemy wywnioskować, że wymagane podstawienia to:
- zamień niektóre cyfry na
( pierwsza zamiana )
- zamień wszystkie pozostałe cyfry na
*( druga zamiana )
Zauważ, że „niektóre cyfry” mogą oznaczać „brak cyfr” ( n = 2na przykład). „Wszystkie pozostałe cyfry” mogą również oznaczać „brak cyfr”, jeśli wszystkie cyfry zostały już zastąpione pierwszym zastąpieniem ( n = 0na przykład).
Drugiej zmiany mogą być łatwo napisany w 11 bajtów :
:%s/\d/*/g<CR>
Najpierw podstawienie zależy n, więc najpierw musimy obliczyć, jakie cyfry zostaną zastąpione. Jeśli zastąpione znaki są przechowywane w rejestrze a, polecenie podstawienia zapisywane jest również w 11 bajtach :
:%s/<C-r>a/ /g<CR>
<C-r>ajest zastępowany treścią rejestru apo wpisaniu polecenia.
Aby obliczyć wartość a, postępując zgodnie z poprzednimi instrukcjami, algorytm jest (w pseudokodzie):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"ciąg jest używany, ponieważ kiedy n = 2żadne cyfry nie są zastępowane spacjami. Można tu użyć dowolnego łańcucha, który nie jest słońcem, pod warunkiem, że pierwsze podstawienie nic nie robi.
Można to zapisać w 31 bajtach :
D # yank and delete the first character of the file (n) to register "" (yank by default) : n = @"
:let@a= # define register "a content
@"%2 # if (n % 2 != 0)
? # then
@" # n
: # else
@"%4 # if (n % 4 != 0)
? # then
"X" # "X"
: # else
"\\d" # "\\d"
<CR> # calculate "a
Rozwiązanie
Umieść wszystkie te części we właściwej kolejności, a otrzymasz rozwiązanie:
D:let@a=@"%2?@":@"%4?"X":"\\d"<CR> # calculate the digits to replace with spaces
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp # draw the sun with spaces, stars, 0, 1 and 3
:%s/<C-r>a/ /g<CR> # replace the pattern stored in register "a with spaces
:%s/\d/*/g<CR> # replace the remaining digits with stars