幽霊とカボチャ


15

これは、Jack-o-Lanternに刻まれたASCIIカボチャです。可愛いじゃない?

((^v^))

これがASCIIゴーストです。それがいかに不気味か見てください!

\{O.O}/

明らかに、カボチャは、腐らないように隙間を空けて地面に置かなければなりません。

しかし、幽霊はカボチャの上に立つのが好きなので、彼らはさらに不気味です。しかし、彼らは2つのカボチャの上に立たなければなりません。しかし、幽霊が下のカボチャまたは下の幽霊に均等に分割されている場合、幽霊の魔法の仕組みにより、複数の幽霊がカボチャを積み重ねて共有することができます。つまり、人間のピラミッドのような形状を形成するます。ゴーストは、下にカボチャがない限りゴーストにスタックできないことに注意してください(これが魔法の仕組みです)。

ホストの数を表す2つの非負整数、gおよびが与えられ、pgpカボチャの、上記のピラミッドスタッキングルールに従って、可能な限り最もコンパクトな左端のフォーメーションを出力します。残ったカボチャとゴースト(つまり、ピラミッドを形成していないもの)は、地面を右に進みます。

明確にするために、これらのフォーメーションは問題なく(空白の改行で区切られています)、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^))

入力

任意の便利な形式の 2つの非負整数。少なくとも1つの数値がゼロ以外になります。どちらの順序でも入力を行うことができます(つまり、カボチャを最初に使用した例)。回答に入力を入力する方法を指定してください。

出力

上記のルールに従った、幽霊とカボチャのASCIIアート表現。ゴーストとカボチャが適切に並んでいる場合、先頭または末尾の改行またはその他の空白はオプションです。

ルール

  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

7個のカボチャと6個のゴーストの正しいフォーメーションは何ですか?
ニール

@Neilルールは最もコンパクトな左端の出力を要求するため、4つのカボチャの上に6つのゴーストのピラミッドがあり、右側に3つのカボチャが追加されます。例として追加します。
AdmBorkBork

まあ、コンパクトの使用は私を混乱させました-私はすべての幽霊を同じ行に置くことができましたので、それは垂直方向によりコンパクトです!
ニール

カボチャは常に幽霊の前に提供されますか?
ガブリエルベナミー

2
私は幽霊とカボチャが人間のピラミッドを作っているのが好きです
MayorMonty

回答:


5

JavaScriptの(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うまくいくと思う。
ニール

いい説明!
AdmBorkBork

@Neilこれはより短くより信頼性があります。(私のメソッドには、g = 5051から始まる無効な値がありました。)ありがとう。
アーナルド

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;

最初にカボチャ、次にゴーストの2つの数字を受け入れます。サンプル入力:

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わかった、今修正した。しかし、それを減らすには少しゴルフをする必要があります。
ガブリエルベナミー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.