유령과 호박


15

Jack-o-Lantern에 새겨진 ASCII 호박이 있습니다. 귀엽지 않습니까?

((^v^))

다음은 ASCII 유령입니다. 얼마나 짜증나는지보세요!

\{O.O}/

분명히, 호박은 땅에 있어야하며, 썩지 않도록 그들 사이에 공간이 있어야합니다.

그러나 유령은 호박 위에 서기를 좋아하기 때문에 심지어는 spookier 입니다. 그러나 그들은 두 개의 호박 위에 서 있어야합니다 . 그렇지 않으면 유령 무게로 인해 호박이 부서 질 것입니다. 그러나, 그들의 유령의 방법에 의한 마법의 작품, 여러 귀신 스택 수 주 호박, 유령이 낮은 호박 또는 낮은 귀신에 고르게하거나 분할 것을 제공했다. 다시 말해, 인간 피라미드 와 같은 모양을 만드는 것 입니다. 아래에 호박이 없으면 유령이 유령 위에 쌓일 수 없습니다 (마법이 작동하는 방식).

두 개의 음수가 아닌 정수를 감안할 때, gp의 수를 나타내는, g호스트와 p규칙을 쌓아 위의 피라미드 다음 umpkins, 출력 가장 컴팩트 가장 왼쪽의 형성을 가능. 남은 호박과 유령 (즉, 피라미드를 형성하지 않는 호박)은 오른쪽 땅에갑니다.

명확하게하기 위해, 이러한 구성은 OK (공백 줄 바꾸기로 분리)이며 예제 I / O로 사용됩니다.

0p 1g
\{O.O}/

1p 0g
((^v^))

1p 1g
((^v^)) \{O.O}/

2p 1g
    \{O.O}/
((^v^)) ((^v^))

2p 2g
    \{O.O}/
((^v^)) ((^v^)) \{O.O}/

3p 1g
    \{O.O}/
((^v^)) ((^v^)) ((^v^))

3p 2g
    \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^))

3p 3g
        \{O.O}/
    \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^))

0p 4g
\{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/

3p 0g
((^v^)) ((^v^)) ((^v^))

7p 6g
            \{O.O}/
        \{O.O}/ \{O.O}/
    \{O.O}/ \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^))

이 형성은 좋지 않다

\{O.O}/
((^v^))

    \{O.O}/
((^v^))

((^v^)) ((^v^)) \{O.O}/

    \{O.O}/
    \{O.O}/
((^v^)) ((^v^))

            \{O.O}/
\{O.O}/ ((^v^)) ((^v^))

    ((^v^))
((^v^)) ((^v^))

      \{O.O}/
((^v^)) ((^v^))

입력

편리한 형식의 음이 아닌 정수 두 개 . 숫자 중 하나 이상이 0이 아닙니다. 어떤 순서로든 입력을받을 수 있습니다 (예 : 호박을 먼저 사용한 예에서)-답을 입력하는 방법을 지정하십시오.

산출

위의 규칙에 따라 유령과 호박의 ASCII 예술 표현. 유령과 호박이 적절하게 정렬되어 있다면 선행 / 후행 줄 바꿈 또는 기타 공백은 선택 사항입니다.

규칙

  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

7 개의 호박과 6 개의 유령에 대한 올바른 구성은 무엇입니까?
Neil

@Neil이 규칙은 가장 컴팩트 한 가장 왼쪽 출력을 요구하기 때문에 4 개의 호박 위에 6 개의 유령 피라미드가 있고 오른쪽에 3 개의 호박이 추가됩니다. 예제로 추가하겠습니다.
AdmBorkBork

글쎄, 당신이 소형을 사용하면 혼란 스럽습니다. 모든 유령을 같은 줄에 넣을 수 있으므로 세로로 더 작습니다!
Neil

유령보다 항상 호박이 제공됩니까?
Gabriel Benamy 2009 년

2
나는 유령과 호박은 만드는 것을 좋아하는 인간 피라미드
MayorMonty

답변:


5

자바 스크립트 (ES7) 166 164 159 바이트

Neil 덕분에 5 바이트 절약

f=(p,g,j=(g*2)**.5+.5|0,G=j>p-1?p?p-1:0:j,P=`
`,i=~j?g-G*++G/2:G,n=i>0?i>g?g:i:0)=>p|g?f(0,g-n,-1,G-1,P+'    ')+P+'((^v^)) '.repeat(p)+'\\{O.O}/ '.repeat(n):''

형식화 및 의견

f = (                                    // given:
  p,                                     // - p = number of pumpkins
  g,                                     // - g = number of ghosts
  j = (g * 2) ** .5 + .5 | 0,            // - j = ceil(triangular root of g)
  G = j > p - 1 ? p ? p - 1 : 0 : j,     // - G = max(0, min(p - 1, j))
  P = '\n',                              // - P = padding string (+ line-break)
  i = ~j ?                               // - i =
    g - G * ++G / 2                      //   first iteration: g - G * (G + 1) / 2
  : G,                                   //   next iterations: G
  n = i > 0 ? i > g ? g : i : 0          // - n = max(0, min(i, g)) = number of
) =>                                     //   ghosts to print at this iteration
p | g ?                                  // if there's still something to print:
  f(                                     //   do a recursive call with:
    0,                                   //   - no pumpkin anymore
    g - n,                               //   - the updated number of ghosts
    -1,                                  //   - j = -1 (so that ~j == 0)
    G - 1,                               //   - one less ghost on the pyramid row
    P + '    '                           //   - updated padding string
  ) +                                    //   
  P +                                    //   append padding string
  '((^v^)) '.repeat(p) +                 //   append pumpkins
  '\\{O.O}/ '.repeat(n)                  //   append ghosts
: ''                                     // else: stop

기초 수학

까다로운 부분은 G유령 피라미드 의 최적 너비를 찾는 것 입니다.

이러한 g피라미드 의 유령 수 는 다음과 같습니다.

g = 1 + 2 + 3 + ... + G = G(G + 1) / 2

역으로 g유령을 포함하는 피라미드의 너비 는 결과 이차 방정식의 실제 근본입니다.

G² + G - 2g = 0

Δ = 1² - 4(-2g)
Δ = 8g + 1

G = (-1 ± √Δ) / 2

다음과 같은 실제 근 ( 삼각근 이라고도 함 )으로 연결됩니다.

G = (√(8g + 1) - 1) / 2

그러나 피라미드의 너비도 호박의 수에 의해 제한됩니다. 우리는 호박 p-1위에 유령을 가질 수 없습니다 p. 따라서 코드에서 사용되는 최종 공식은 다음과 같습니다.

j = ⌈(√(8g + 1) - 1) / 2⌉
G = max(0, min(p - 1, j))

ES6 버전 173 171 166 바이트

f=(p,g,j=Math.pow(g*2,.5)+.5|0,G=j>p-1?p?p-1:0:j,P=`
`,i=~j?g-G*++G/2:G,n=i>0?i>g?g:i:0)=>p|g?f(0,g-n,-1,G-1,P+'    ')+P+'((^v^)) '.repeat(p)+'\\{O.O}/ '.repeat(n):''

테스트 사례 (ES6)


1
나는 j=(g+g)**.5+.5|0작동해야 한다고 생각 합니다.
Neil

좋은 설명!
AdmBorkBork

@Neil이 짧은 하고 더 신뢰할. (내 방법에는 g = 5051에서 시작하여 일부 유효하지 않은 값이 있습니다.) 감사합니다.
Arnauld

3

Perl, 246 바이트 (개행은 코드의 일부가 아니며 읽기 쉽도록 제공됨)

($c,$d)=<>=~/(\d+)/g;
$p="((^v^)) ";$g="\\{O.O}/ ";
for($f[0]=$c;$d>0;$d--){$f[$b+1]+1<$f[$b]?$f[++$b]++:$f[$b]++;$f[0]+=$d,$d=0 if$b==$c-1;$f[$b]==1?$b=0:1}
$h[0]=($p x$c).$g x($f[0]-$c);$h[$_].=$"x(4*$_).$g x$f[$_]for(1..$#f);
say join$/,reverse@h;

두 개의 숫자를 허용합니다 (호박 우선, 귀신). 샘플 입력 :

5 20

샘플 출력 :

                \{O.O}/ 
            \{O.O}/ \{O.O}/ 
        \{O.O}/ \{O.O}/ \{O.O}/ 
    \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ 
((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ 

아, 내 말을 내가 의도 한 것과 조금 다르게 읽었 어. 유령은 호박이 있으면 유령 위에 쌓일 수 있고, 그렇지 않으면 올바른 단일 파일로 가야합니다. 그렇기 때문에 0p 4g테스트 케이스에는 모든 유령이 쌓이지 않고 한 줄로 표시됩니다.
AdmBorkBork

@TimmyD 좋아, 이제 고쳤다. 그래도 그것을 줄이려면 약간의 골프를해야합니다.
Gabriel Benamy 2009 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.