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 Enter
stroke, <C-?>
dapat disamakan dengan Control + ?
, dan <Esc>
untuk Escape
jelas. Masing-masing dihitung untuk 1 byte (lihat meta ). Jeda baris dalam solusinya adalah agar mudah dibaca. Hanya <CR>
mewakili Enter
pukulan 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
, 1
dan 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
, 1
dan 3
.
Penting untuk digunakan 0
, 1
dan 3
untuk 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
, 1
dan 3
(semua digit) harus diganti dengan
- jika
n = 1
, maka 1
harus diganti dengan
, digit lainnya dengan*
- jika
n = 2
, lalu 0
, 1
dan 3
(semua digit) harus diganti dengan*
- jika
n = 3
, maka 3
harus diganti dengan
, digit lainnya dengan*
- jika
n = 4
, lalu 0
, 1
dan 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 = 2
misalnya). Dan "semua digit lainnya" juga dapat mewakili "tanpa digit", jika semua digit telah diganti oleh substitusi pertama ( n = 0
misalnya).
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>a
diganti dengan isi register a
ketika 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