VI, 108 바이트
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>
는 IS Enter
뇌졸중 <C-?>
에 해당 Control + ?
하고, <Esc>
에 Escape
분명히. 이들 각각은 1 바이트로 계산됩니다 ( meta 참조 ). 솔루션의 줄 바꿈은 가독성을위한 것입니다. <CR>
실제 Enter
스트로크 만 나타냅니다 .
입력
입력 파일은을 나타내는 1 자만 포함해야합니다 n
.
쏘다
VI는 다음과 같이 시작해야합니다.
vi -u NONE input
설명
솔루션에는 3 개의 파트가 있습니다. 설명하기가 가장 쉽기 때문에 두 번째 부분 (두 번째 줄)을 먼저 설명하겠습니다.
태양 그리기
태양을 그리는 명령은 다음과 같습니다.
3i <Esc>5a*<Esc>Yphr*$a*<Esc>O**1110333**<Esc>YPi <Esc>3lx3lx"0px4lyl2p$xYp
태양이와 함께 그려야합니다
, *
, 0
, 1
와 3
,이 같은 :
*****
**11033**
*111000333*
*111000333*
**1110333**
*******
대칭은이 부분의 바이트 크기를 줄이는 데 도움이되었지만 그렇게 중요하지는 않습니다. 나는 전체 라인을 설명하지 않지만 패턴은 *****
쉽게 마지막 행을 생성하는 데 사용되며, 패턴이 **1110333**
포함 된 3 개 다른 라인을 생성하는 기준으로 촬영되었습니다 0
, 1
하고 3
.
사용하는 것이 중요합니다 0
, 1
그리고 3
채워질 수 일 부품 (다음 설명을 참조). 이 태양을 그리는 데 55 바이트 가 걸립니다 아마도 몇 가지 트릭으로 골프를 칠 수 있습니다.
에 따라 태양을 채우는 n
태양을 올바르게 채우려면 다음 지침을 따르십시오.
- 만약
n = 0
, 다음 0
, 1
그리고 3
(모든 숫자)를 교체해야합니다
- 인 경우
n = 1
, 1
로 교체해야하며
다른 숫자는*
- 만약
n = 2
, 다음 0
, 1
그리고 3
(모든 숫자)를 교체해야합니다*
- 인 경우
n = 3
, 3
로 교체해야하며
다른 숫자는*
- 경우
n = 4
, 다음 0
, 1
그리고 3
(모든 숫자)를 교체해야합니다
(같은 n = 0
)
이를 통해 필요한 대체는 다음과 같습니다.
- 일부 숫자를
( 첫 번째 대체 )로 바꿉니다.
- 다른 모든 숫자를
*
( 두 번째 대체 )로 바꿉니다.
"일부 숫자"는 "숫자 없음"을 의미 할 수 있습니다 ( n = 2
예 :). 모든 숫자가 이미 첫 번째 대체 문자로 대체 된 경우 "다른 모든 숫자"는 "숫자 없음"을 나타낼 수도 있습니다 n = 0
.
두 번째 대체 는 11 바이트 로 쉽게 작성할 수 있습니다 .
:%s/\d/*/g<CR>
첫 번째 치환 은에 따라 달라 지므로 먼저 대체n
할 자릿수를 계산해야합니다. 대체 된 문자가 register에 저장된 경우 대체 a
명령도 11 바이트로 작성 됩니다 .
:%s/<C-r>a/ /g<CR>
<C-r>a
a
명령을 입력하면 레지스터 내용으로 바뀝니다 .
a
이전 명령어에 따라 의 값을 계산하려면 알고리즘은 (의사 코드)입니다.
n := read()
if (n % 2 != 0)
then
a := n
else
if(n % 4 != 0)
then
a := "X"
else
a := "\d"
"X"
문자열은 때 n = 2
자리수가 공백으로 대체되지 않기 때문에 사용됩니다 . 첫 번째 대체가 아무것도하지 않는 한 태양이 아닌 모든 문자열을 여기에서 사용할 수 있습니다.
이것은 31 바이트 로 쓸 수 있습니다 :
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
해결책
이 모든 부품을 올바른 순서로 넣으면 해결책이 있습니다.
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