소개:
무당 벌레에 대해 생각할 때 일반적으로 검은 반점이있는 빨간색 또는 어두운 주황색 버그를 생각합니다. 이것이 반드시 필요한 것은 아니지만, 빨강 / 주황색 점이있는 무당 벌레가있는 검은 색 이나 점이없는 무당 벌레 가 있기 때문에 , 우리는 주로이 아시아 무당 벌레와 같은 무당 벌레를 묘사합니다.
주목해야 할 또 다른 점은 무당 벌레의 반점이 거의 항상 대칭이라는 것입니다. 그리고이 도전이 시작됩니다.
도전:
정수 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/
''-!-'' ''-!-'' ''-!-''
일반적인 규칙:
o하고 O대신. 나는 문구를 조금 바꾸었다.
n=50들어, 첫 번째 버그에는 16 개의 스팟이 있고 나머지 두 개에는 각각 17 개의 스팟이 있다고 생각합니다.



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