VI, 108 byte
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>adalah Enterstroke, <C-?>dapat disamakan dengan Control + ?, dan <Esc>untuk Escapejelas. Masing-masing dihitung untuk 1 byte (lihat meta ). Jeda baris dalam solusinya adalah agar mudah dibaca. Hanya <CR>mewakili Enterpukulan nyata .
Memasukkan
File input harus berisi hanya 1 karakter, mewakili n.
Meluncurkan
VI harus dimulai seperti:
vi -u NONE input
Penjelasan
Ada 3 bagian dalam solusi. Saya akan menjelaskan bagian ke-2 dulu (baris ke-2), karena ini adalah yang paling mudah untuk dijelaskan.
Menggambar matahari
Perintah untuk menggambar matahari adalah:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
Matahari harus ditarik dengan , *, 0, 1dan 3, seperti ini:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
Simetri akan membantu mengurangi ukuran byte bagian ini, tetapi itu tidak terlalu penting. Saya tidak akan menjelaskan baris lengkap, tetapi polanya *****digunakan untuk dengan mudah menghasilkan baris terakhir, dan polanya **1110333**telah diambil sebagai referensi untuk menghasilkan 3 baris lain yang berisi 0, 1dan 3.
Penting untuk digunakan 0, 1dan 3untuk bagian matahari yang bisa diisi (lihat penjelasan selanjutnya). Menggambar matahari ini membutuhkan 55 byte , dan mungkin bisa bermain golf dengan beberapa trik.
Mengisi matahari sesuai dengan n
Untuk mengisi matahari dengan benar, petunjuk yang harus diikuti adalah:
- jika
n = 0, lalu 0, 1dan 3(semua digit) harus diganti dengan
- jika
n = 1, maka 1harus diganti dengan , digit lainnya dengan*
- jika
n = 2, lalu 0, 1dan 3(semua digit) harus diganti dengan*
- jika
n = 3, maka 3harus diganti dengan , digit lainnya dengan*
- jika
n = 4, lalu 0, 1dan 3(semua digit) harus diganti dengan (seperti n = 0)
Dari itu, kita dapat menyimpulkan bahwa substitusi yang diperlukan adalah:
- ganti beberapa digit dengan
( substitusi pertama )
- ganti semua digit lainnya dengan
*( substitusi kedua )
Perhatikan bahwa "beberapa digit" dapat berarti "tanpa digit" ( n = 2misalnya). Dan "semua digit lainnya" juga dapat mewakili "tanpa digit", jika semua digit telah diganti oleh substitusi pertama ( n = 0misalnya).
The substitusi kedua dapat dengan mudah ditulis dalam 11 bytes :
:%s/\d/*/g<CR>
The substitusi pertama tergantung pada n, jadi pertama kita harus menghitung apa yang akan digit diganti. Jika karakter yang diganti disimpan dalam register a, perintah substitusi ditulis dalam juga 11 byte :
:%s/<C-r>a/ /g<CR>
<C-r>adiganti dengan isi register aketika perintah diketik.
Untuk menghitung nilai a, mengikuti instruksi sebelumnya, algoritmanya adalah (dalam pseudo-code):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"string digunakan karena ketika n = 2, tidak ada digit yang diganti oleh spasi. String apa pun yang bukan matahari bisa digunakan di sini, selama pergantian pertama tidak menghasilkan apa-apa.
Ini dapat ditulis dalam 31 byte :
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
Larutan
Masukkan semua bagian ini dalam urutan yang benar, dan Anda memiliki solusinya:
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