대칭 무당 벌레


22

소개:

무당 벌레에 대해 생각할 때 일반적으로 검은 반점이있는 빨간색 또는 어두운 주황색 버그를 생각합니다. 이것이 반드시 필요한 것은 아니지만, 빨강 / 주황색 점이있는 무당 벌레가있는 검은 색 이나 점이없는 무당 벌레 가 있기 때문에 , 우리는 주로이 아시아 무당 벌레와 같은 무당 벌레를 묘사합니다.

여기에 이미지 설명을 입력하십시오

주목해야 할 또 다른 점은 무당 벌레의 반점이 거의 항상 대칭이라는 것입니다. 그리고이 도전이 시작됩니다.

도전:

정수 n( >= 0)가 주어지면 다음 ASCII 아트 무당 벌레를 한 번 또는 여러 번 출력합니다. 대칭 점은 두 개 이상의 무당 벌레뿐만 아니라 두면 사이에 균등하게 나뉘어 있습니다.

기본 무당 벌레 레이아웃은 다음과 같습니다.

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   |   /
  ''-!-''

인 경우 n=0무당 벌레를 그대로 출력합니다.

경우 n0보다 큰 경우, 우리는 중 하나를 소문자로 ASCII 최신 버그의 공간을 채우 o거나 교체 |자본과 중앙에 O. 목표는 n'빈'무당 벌레를 변경하는 동시에 여전히 무당 벌레 당 대칭 출력을 생성하고 가능한 적은 무당 벌레를 출력하는 것입니다.

유효한 출력 n=1은 다음과 같습니다.

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

그러나 이것은 유효하지 않습니다.

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

유효한 출력 n=2은 다음과 같습니다.

    _V_ 
  /(@I@)\
 /   O   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   O   /
  ''-!-''

    _V_ 
  /(@I@)\
 /  o|o  \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
| o  |  o |
 \   |   /
  ''-!-''

etc. There are a lot of possible outputs.

n더 이상 단일 무당 벌레에 맞지 않는 첫 번째 는 n=24입니다. 이 경우 가능한 한 균등하게 두 개의 무당 벌레로 나눠야합니다 (선택적으로 하나의 공백 또는 하나의 줄 바꿈을 사용하여 서로 옆에 또는 서로 아래로 출력할지 여부를 선택할 수 있음). 예를 들면 다음과 같습니다.

    _V_        _V_ 
  /(@I@)\    /(@I@)\
 /o o|o o\  /o o|o o\
|o o | o o||o o | o o|
 \o o|o o/  \o o|o o/
  ''-!-''    ''-!-''

또는:

    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''
    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''

도전 규칙 :

  • n의 범위 내에 있습니다 0-1000.
  • STDOUT으로 출력하거나 문자열 또는 2D 문자 배열 / 목록 등으로 반환하도록 선택할 수 있습니다.
  • 선행 줄 바꿈 또는 불필요한 공백은 허용되지 않습니다. 후행 공백과 단일 후행 줄 바꿈이 허용됩니다.
  • 위에서 언급했듯이 두 개 이상의 무당 벌레가 필요할 때 서로 옆에 또는 서로 아래에 (또는 둘을 혼합하여) 출력할지 여부를 선택할 수 있습니다.
  • 두 개 이상의 무당 벌레가 나란히 인쇄되면 그 사이에 하나의 선택적 공백이 허용됩니다. 두 개 이상의 무당 벌레가 서로 인쇄되면 그 사이에 하나의 선택적 개행이 허용됩니다.
  • 대칭적이고 input과 동일한 한 시퀀스의 모든 단계에서 무당 벌레의 레이아웃을 선택할 수 있습니다 n.
  • 목표는 n가능한 한 많은 무당 벌레를 변경하고 변경하는 것이므로 위의 경우 하나 이상의 무당 벌레를 사용하기 시작 n=23합니다. 이 무당 벌레의 레이아웃이 동일 할 필요는 없습니다. 실제로, 이것은 두 개의 입력과 같은 n=25또는 일부 입력에 대해서는 불가능합니다 n=50.
  • 또한 때때로 두 개 이상의 무당 벌레 사이에 점을 고르게 분할 할 수 없습니다. 이 경우 가능한 한 균등하게 분할해야하며 최대 차이는 1입니다.

따라서 n=50마지막 두 규칙을 염두에두면 유효한 출력이됩니다 (첫 번째 버그에는 16 개의 스팟이 있고 다른 두 개에는 17 개의 스팟이 있습니다).

    _V_        _V_        _V_ 
  /(@I@)\    /(@I@)\    /(@I@)\
 /oooOooo\  /   O   \  /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
 \   |   /  \oooOooo/  \o oOo o/
  ''-!-''    ''-!-''    ''-!-''

일반적인 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하지 마십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙이 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 리턴 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 링크를 추가하십시오.
  • 또한 필요한 경우 설명을 추가하십시오.

빈 무당 벌레에 대한 "가능한 한 적은 변화"란 무엇을 의미합니까? 단일 무당 벌레에 n (<24) 문자 o / O를 배치 할 때 n을 변경합니다. 또는 n-1에서 n으로의 변경을 의미합니까 (입력이 1 씩 변할 때 출력이 가능한 한 조금씩 변함)?
Heimdall

@Heimdall Ah 잘못된 문구로 인해 혼란을 드려 죄송합니다. 나는이 문제를 생각 할 때 여러 문자가 한 자리를 형성 할 수 있도록 생각을했다 때, 그러나 나는이 떨어 그냥 사용 o하고 O대신. 나는 문구를 조금 바꾸었다.
케빈 크루이 센

예를 n=50들어, 첫 번째 버그에는 16 개의 스팟이 있고 나머지 두 개에는 각각 17 개의 스팟이 있다고 생각합니다.
Jon Claus

이것은 내가 가장 좋아하는 Jimi Hendrix 앨범입니다.
복원 Monica Monica iamnotmaynard

@iamnotmaynard 어쩌면 내가 명백한 것을 놓치고 있거나 틀린 도전에 대해 언급 했습니까? 나는 Jimi Hendrix와 무당 벌레 사이의 연관성을 실제로 보지 못합니다.
Kevin Cruijssen at

답변:


5

, 84 81 바이트

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

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

Nθ

총점 수를 입력하십시오.

≔⌈∕∨θ¹¦²³η

필요한 무당 벌레의 수를 계산하십시오.

Fη«

각 무당 벌레를 반복합니다.

≔⁺÷θη‹ι﹪θηζ

이 무당 벌레에 넣을 반점 수를 계산하십시오.

V_¶I@)↘²↙|/←''-↑!

무당 벌레의 머리와 오른쪽 날개를 인쇄합니다.

↑⎇›ζ²¹OO²

스팟이 21 개 이상이면 두 개의 스폿을 인쇄하고 그렇지 않으면 뒷면을 인쇄하십시오.

§|Oζ

스폿 수가 홀수 인 경우 다른 스폿을 인쇄하고 그렇지 않으면 뒷면의 나머지를 인쇄하십시오.

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

스팟 수를 2로 나누고 3, 4, 3 스팟의 3 행으로 분배하십시오.

↙»

다음 무당 벌레의 시작으로 이동하십시오.

‖B←

뒷면을 유지하면서 캔버스를 왼쪽으로 반사하십시오.


8

파이썬 (2) , 252 (249) 238 212 211 213 209 바이트

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

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

  • Kevin Cruijssen 덕분에 9 바이트 절약
  • Mr. Xcoder 덕분에 18 바이트 절약
  • Jonathan Frech 덕분에 2 바이트 절약

나는 당신을 제거하고 대신 .replace('A','|O'[b%2])사용할 수 있다고 생각 c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"합니까?
케빈 크루이 센

230 바이트 돌려 [' o','|O'][i>9]' |oO'[i>9::2]하고 사용 |하는 대신 논리합. 또한 4 바이트 절약 for i in range(11)exec명령문으로 전환 합니다.
Mr. Xcoder

1
주석이 혼란 스럽지만 목록 이해와 루프 를 혼합하여 불필요한 변수도 제거하여 218 바이트for .
Mr. Xcoder

@ Mr.Xcoder 대단히 감사합니다 :)
TFeld

가능한 한 가장 적은 무당 벌레를 생산해야합니다. TIO에 24에서 46을 넣으면 두 개 대신 3 개의 무당 벌레가 생깁니다.
Nick Matteo

7

자바 스크립트 (ES6), 183 186 바이트

무당 벌레 사이에 반점을 나누기 위해 TFeld의 답변 과 동일한 공식을 사용합니다 .

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

데모


6

베 펀지, 292 279 바이트

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

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

설명

무당 벌레의 ASCII 아트는 15 개의 오프셋 문자 인 Befunge 단일 문자열로 인코딩되어 처음 15 개의 인쇄 가능한 문자를 특수 목적으로 예약 할 수 있습니다. 이 특수 문자 중 처음 두 문자는 줄 바꿈과 문자를 나타내며 |둘 다 인쇄 할 수 없습니다. 세 번째는 "문자열 이기 때문에 사용할 수 없기 때문에 사용되지 않습니다. 다음 2 개는 중앙의 큰 지점을 나타냅니다. 나머지 열 개는 날개 위의 반점입니다.

이 특수 문자는 룩업 테이블을 통해 최종 양식으로 변환되며 첫 번째 행의 첫 부분에 작성됩니다.

설명하기 쉽게하기 위해 다음은 다양한 구성 요소가 강조된 코드입니다.

실행 경로가 강조 표시된 소스 코드

*|조회 테이블에서 줄 바꿈과 문자를 초기화하는 것으로 시작합니다 .
*다음으로 stdin에서 반점 수를 읽고 필요한 무당 벌레 수를 계산합니다.
*그런 다음 일련의 버그에 대한 외부 루프를 시작하여 다음 무당 벌레가 렌더링 될 지점 수를 계산할 수 있습니다.
*각 무당 벌레에 대해 큰 중심점을 표시해야하는지 (if spots%2 == 1) 계산 하고 적절한 값을 찾아보기 테이블에 씁니다.
*마찬가지로, 우리는 다른 대형 스팟 쌍을 표시해야하는지 여부를 계산하고 (if spots/2 > 10) 다시 조회 테이블을 업데이트합니다. 또한 각 날개에 필요한 나머지 지점을 계산합니다.
*룩업 테이블 초기화의 마지막 부분은 표시해야 할 작은 지점을 계산하는 루프입니다. 기본적으로 알고리즘은 (spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10다음과 같습니다.이면 스팟을 표시해야합니다.
*다음으로 무당 벌레의 인코딩 된 문자열 표현을 스택으로 푸시합니다. 이것은 본질적으로 단순한 문자열이지만 소스의 사각형을 형성하기 위해 코드의 간격으로 압축하려고 시도함에 따라 약간 복잡했습니다.
*이제 출력 루프를 시작하여 문자를 하나씩 처리하고 이전에 구성된 조회 테이블을 통해 특수한 경우 (점, 줄 바꿈 등)를 변환 할 준비가되었습니다.
*마지막으로 필요한 무당 벌레를 모두 표시했는지 확인합니다. 그렇지 않으면 외부 루프의 시작 부분으로 돌아갑니다.


좋아, 나는 당신의 무당 벌레가 1-23에서 각 단계에 대해 가지고있는 패턴을 정말로 좋아합니다. 다른 답변 들과는 상당히 다릅니다. 나에게서 +1 설명을 추가해 주시겠습니까 (추가로 골프를 마친 후)?
케빈 크루이 ssen

1
나는 당신이 패턴을 좋아해서 기쁘다. 실제로 가능한 한 많은 단계에서 잘 보이는 알고리즘을 찾기 위해 다른 조합을 시도하는 데 많은 시간을 보냈습니다. 또한 내 대답에 약간의 설명을 추가했습니다.
James Holderness

3

루비 , 203 (193) 190 바이트

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

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

  • Jordan 덕분에 10 바이트 절약

{|m|m.로 대체 가능 {$&.; b=(n-1)/23+1로 대체 가능 b=1+~-n/23; 및 x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}교체 할 수 있습니다 x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}.
Jordan

처음 8 줄 %q{XY}대신 에을 사용하여 다른 바이트를 절약 'X'+"Y"하고 d=n>0?n/(b=1+~-n/23):b=0대신으로 몇 바이트를 더 저장할 수 있습니다 n>0?d=n/(b=(n-1)/23+1):d=b=0.
Jordan

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