핀홀 카메라를 통한 일식


28

이 도전은 2017 년 8 월 21 일에 일어났던 일식에서 영감을 얻은 간단한 ASCII 아트 도전입니다 0 <= n <= 4.

n=0:
   *****
 **     **
*         *
*         *
**       **
  *******

n=1:
   *****
 **  *****
*   *******
*   *******
**   ******
  *******

n=2:
   *****
 *********
***********
***********
***********
  *******

n=3:
   *****
 *****  **
*******   *
*******   *
******   **
  *******

n=4:
   *****
 **     **
*         *
*         *
**       **
  *******

규칙

  • 인덱스를 0 또는 1로 지정할 수 있습니다.
  • 사용 된 문자는 공백이며 공백 이외의 *인쇄 가능한 문자를 사용할 수 있습니다 *.
  • 후행 공백은 선택 사항입니다 (공백이있을 수도 있고 없을 수도 있음).
  • 이것은 이며, 가장 낮은 바이트 수가 승자입니다.

3
@ Mr.Xcoder 나는 OP의 재량에 달려 있지만 kolmogorov-complexity 로 입력을 얻는 태그 지정 문제에 반대 합니다.
Outgolfer Erik

15
그것은 대칭이 아니라 위에서 아래로 향하고 있습니다.
AdmBorkBork

또한, 일식은 이미 시작되었습니다.
Erik the Outgolfer

@AdmBorkBork 그래, 나는 약간의 바이트를 절약 할 수 있었다 ...
Outgolfer Erik

7
" *... 공백을 포함하여 어떤 문자를 사용할 수 있습니까? ;)
Hagen von Eitzen

답변:


13

파이썬 (2) , 161 (149) 142 135 바이트

lambda n,u=u' *':u'''   *****
 ****
**
**
****
  *******'''.translate({1:u[0<n<3],2:u[0<n<4],3:u[1<n<4]})

온라인으로 사용해보십시오!

Xcoder 씨 에게 -7 감사합니다 .


9
인쇄 할 수없는 것들의 좋은 남용.
Zacharý

Emacs에 복사하여 붙여 넣기 전까지이 답변을 완전히 이해하지 못했습니다. 훌륭한!
Silvio Mayolo

@SilvioMayolo 음, Emacs로 무엇을 했습니까?
Outgolfer Erik

나는이 페이지의 답을보고 있었고 그것이 어떻게 작동했는지 이해하지 못했습니다. Emacs는 모든 숨겨진 문자를 ^ A, ^ B, ^ C 등으로 표시합니다.
Silvio Mayolo

@SilvioMayolo 아, 그것은 인쇄 불가능한 것이 유니 코드 문자처럼 보이는 표현을 가지고 있기 때문입니다.
Outgolfer Erik

9

, 82 81 55 43 바이트

Neil 덕분에 -38 바이트!

Nν”{“⟲FEd⧴_³⟲”‖O¿﹪ν⁴«F﹪ν²G↗³↑²↖²↙³*↑¤*¿⁼ν¹‖

온라인으로 사용해보십시오! 링크는 자세한 버전입니다.

나는 그것을 위해 않았다. : P 아마 40 바이트가 나올 것입니다. 26 38 바이트 ... 충분히 가까이?



2
나는 차콜을 사용할 수 없다는 대신에 내 논리를 뛰어 넘었다. > _> 감사합니다!
완전히 인간적인

1
바깥 쪽 "원"을 인쇄하는 것이 가장 짧은 것처럼 보입니다. 또한 홀수 입력을위한 다각형을 사용하여 창의력을 발휘 했습니다. 온라인으로 사용해보십시오!
Neil

1) 젠장, 나는 내가 영리하다고 생각했다 PolygonHollow. : P 2) 좋아. 감사!
완전히 인간적인

5

계피 껌 , 70 바이트

16 진 덤프 :

0000000: 6c33 5053 5050 d002 012e 20a5 0002 4026  l3PSPP.... ...@&
0000010: 9001 0568 6c20 07a6 0648 4080 b521 8a19  ...hl ...H@..!..
0000020: 30a6 1644 1093 0de3 a098 6184 6206 422d  0..D......a.b.B-
0000030: 6136 c20c 6374 3380 3cb8 5aa0 1436 36ba  a6..ct3.<.Z..66.
0000040: 5f4c 280f 0f00                           _L(...

온라인으로 사용해보십시오!

이 언어를 사용하는 방법을 찾기 위해 너무 오래 기다렸습니다 . :피

시나몬 껌은 풍선 껌이지만 풍선 껌보다 "실제"언어에 가깝습니다.

첫 번째 바이트 ( l)는 모드를 사전 모드로 설정합니다. 나머지 바이트는 다음 문자열 압축입니다.

0&   *****
 **     **
*         *
*         *
**       **
  *******;1&   *****
 **  *****
*   *******
*   *******
**   ******
  *******;2&   *****
 *********
***********
***********
***********
  *******;3&   *****
 *****  **
*******   *
*******   *
******   **
  *******;4&   *****
 **     **
*         *
*         *
**       **
  *******

이것은 본질적으로 각 텍스트가 숫자로 지정된 조회 테이블을 만듭니다. 그런 다음 프로그램은 입력을 받아 해당 텍스트를 출력합니다.


argument%4또는 argument&3바이트를 저장?
Titus

5

자바 스크립트 (ES6) 103 102 바이트

f=
n=>`   *****
 **66733**${s=`
*666777333*`}${s}
**6667333**
  *******`.replace(/\d/g,c=>" *"[c*2>>n&1])
<input type=number min=0 max=4 oninput=o.textContent=f(this.value)><pre id=o>

편집 : @ darrylyeo 덕분에 1 바이트가 절약되었습니다.


1
*666777333*\n변수 에 저장 하여 -2 바이트
darrylyeo

@darrylyeo 1 바이트 만 절약 할 수 있기 때문에 뭔가 잘못하고 있어야합니다 ...
Neil

내 잘못은 실제로 1 바이트 만 절약합니다.
darrylyeo

4

SOGL V0.12 , 40 39 바이트

"⁽Ρūa╔Ƨ ‘╥▓.4%?52"¹ο1¹‘╬¡╬5.H?:±}.2=?╬8

여기 사용해보십시오!


그것이 도움이된다면, 후행 공백은 선택 사항입니다 (공백이 있거나 없을 수 있음). -SOGL을 모르지만 바이트를 절약 할 수 있음
Mr. Xcoder

@ Mr.Xcoder 어디에서나 ASCII 아트를 다룰 때 SOGL이 후행 공백을 추가하므로 반대의 일을합니다 .p
dzaima

4

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, 13,이 같은 :

   *****
 **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>aa명령을 입력하면 레지스터 내용으로 바뀝니다 .

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

3

PHP, 114 + 1 바이트

+1 바이트 -R. 변화하는 힌트에 대해 @Neil에게 감사드립니다.

for(;$c="   *****
 **66733**
*666777333*
*666777333*
**6667333**
  *******"[$i++];)echo+$c?" *"[$c*2>>$argn&1]:$c;

*0 색인에 밑줄을 사용합니다 . 파이프로 실행 -nR하거나 온라인으로 사용해보십시오 .

PHP 5.5 이상 필요 :
오래된 PHP는 리터럴 문자열 인덱싱 (구문 분석 오류)을 이해하지 못합니다.
PHP 7.1은 숫자가 아닌 값에 대해 불평합니다 (교체 +$c로 대체 $c>0).


1
" _"[$c*2>>$argn&1]필요한 경우 음의 시프트 매개 변수를 피 한다고 생각 합니다.
Neil



2

자바 (8) 225 213 211 바이트

n->{String a=n<2|n>3?"   ":"***",b=n<1|n>2?"   ":"***",c=n%4<1?" ":"*",d=a+(n%4<1?"   ":"***")+b;return"   *****\n **"+(n<2|n>3?"  ":"**")+c+(n<1|n>2?"  ":"**")+"**\n*"+d+"*\n*"+d+"*\n**"+a+c+b+"**\n  *******";}

여기에서 시도하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.