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>
là Enter
đột quỵ, <C-?>
tương ứng với Control + ?
, và <Esc>
để Escape
rõ ràng. Mỗi trong số này được tính cho 1 byte (xem meta ). Các ngắt dòng trong giải pháp là để đọc. Chỉ <CR>
đại diện cho Enter
nét thực sự .
Đầu vào
Các tập tin đầu vào chỉ nên chứa 1 ký tự n
.
Phóng
VI nên được bắt đầu như:
vi -u NONE input
Giải thích
Có 3 phần trong giải pháp. Tôi sẽ mô tả phần 2 đầu tiên (dòng thứ 2), vì nó dễ giải thích nhất.
Vẽ mặt trời
Lệnh vẽ mặt trời là:
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
Mặt trời phải được vẽ bằng
, *
, 0
, 1
và 3
, như thế này:
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
Một đối xứng sẽ giúp giảm kích thước byte của phần này, nhưng nó không quan trọng. Tôi sẽ không giải thích đầy đủ các dòng, nhưng các mô hình *****
được sử dụng để dễ dàng tạo ra những dòng cuối cùng, và các mô hình **1110333**
đã được thực hiện như là một tài liệu tham khảo để tạo ra 3 dòng khác có chứa 0
, 1
và 3
.
Điều quan trọng là sử dụng 0
, 1
và 3
cho các phần mặt trời có thể được lấp đầy (xem phần giải thích tiếp theo). Vẽ mặt trời này mất 55 byte và có thể chơi golf với một số thủ thuật.
Lấp đầy mặt trời theo n
Để lấp đầy mặt trời một cách chính xác, các hướng dẫn cần tuân theo là:
- nếu
n = 0
, sau đó0
, 1
và 3
(tất cả các chữ số) nên được thay thế bằng
- nếu
n = 1
, sau đó 1
nên được thay thế bằng
, các chữ số khác với*
- nếu
n = 2
, sau đó0
, 1
và 3
(tất cả các chữ số) nên được thay thế bằng*
- nếu
n = 3
, sau đó 3
nên được thay thế bằng
, các chữ số khác với*
- nếu
n = 4
, sau đó 0
, 1
và 3
(tất cả các chữ số) nên được thay thế bằng
(như n = 0
)
Từ đó, chúng ta có thể suy ra rằng sự thay thế cần có là:
- thay thế một số chữ số bằng
( thay thế đầu tiên )
- thay thế tất cả các chữ số khác bằng
*
( thay thế thứ hai )
Lưu ý rằng "một số chữ số" có thể có nghĩa là "không có chữ số" ( n = 2
ví dụ). Và "tất cả các chữ số khác" cũng có thể biểu thị "không có chữ số", nếu tất cả các chữ số đã được thay thế bằng thay thế đầu tiên (n = 0
ví dụ).
Sự thay thế thứ hai có thể dễ dàng được viết bằng 11 byte :
:%s/\d/*/g<CR>
Sự thay thế đầu tiên phụ thuộc vào n
, vì vậy trước tiên chúng ta phải tính toán những chữ số nào sẽ được thay thế. Nếu các ký tự thay thế được lưu trong thanh ghi a
, lệnh thay thế cũng được viết bằng 11 byte :
:%s/<C-r>a/ /g<CR>
<C-r>a
được thay thế bởi nội dung của thanh ghi a
khi lệnh được gõ.
Để tính giá trị của a
, theo các hướng dẫn trước, thuật toán là (theo mã giả):
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"
chuỗi được sử dụng bởi vì khi n = 2
, không có chữ số nào được thay thế bằng dấu cách. Bất kỳ chuỗi nào không phải là mặt trời đều có thể được sử dụng ở đây, miễn là lần thay thế đầu tiên không có gì.
Điều này có thể được viết bằng 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
Dung dịch
Đặt tất cả các phần này theo đúng thứ tự, và bạn có giải pháp:
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