りんごが落ちている


15

前書き

リンゴの木の幹がx軸の-2から2の間に配置されており、いくつかのリンゴがその周りに落ちます。

        |   |
        |   |
<-------|---|------->
       -2   2

毎日、n個のリンゴが落ちます。各リンゴは、地面に真っ直ぐ落ちると、x座標を維持します。

しかし、別のリンゴの上に着地した場合、地面またはリンゴの支持層に到達するまで、次の規則に従って転がります。

  1. 現在の高さでx + 1のスペースが空の場合、現在のリンゴはそこに行きます。
  2. そうでなければ、x-1のスペースが空の場合、現在のリンゴはそこに行きます。
  3. それ以外の場合、現在のリンゴは他のリンゴの上にあります。

チャレンジ

入力は、各リンゴのn個の開始位置が順番になります。配列として、または分離された数値として、または他の有効な方法で受け取ることができますが、答えで必ず説明してください。

出力は、木の幹と周りのりんごのASCII図面にする必要があります。あなたがされている必要はありません、それはいくつかのリンゴの下にある一番左のリンゴの左にあると右端のリンゴの右にx軸を描画するために、しかし、あなたはどこにでもそれを描画する必要性を行います。最上位のリンゴの上にツリーを拡張することもできます。

すべてのx座標は-100〜100の間であると仮定できますが、-2と2の間ではありません。

これは ...バイトの勝利で最短の答え!

入力: [-3, 5, 5, -4, -4, 5, -3]

出力:

  a|   |
aaa|   | aaa
---|---|----

入力: [3, 3, 3, 3, 8, 9]

出力:

|   |a
|   |aaa  aa
|---|-------

入力: [-5, -5, -5, -5, -5, -5, -5, -5, -5]

出力:

  a  |   |
 aaa |   |
aaaaa|   |
-----|---|


あなたの例は、x方向の最小限の範囲を表示することを意味しています(木とリンゴの左右に空の地面はありません)。それは要件ですか?また、少なくとも出力を長方形に埋め込むために、末尾のスペースを印刷することは許可されていますか?
マーティンエンダー

1
ボーナスはあまり人気がありません。「目に見える」出力を最小限にする必要があると思います(上部に空の行がなく、端に空のグラウンドセルがない)が、スペースのある長方形に出力をパディングすることは間違いなく許可します。
マーティンエンダー

また、仕様では実際には異なる出力形式を許可していないため、現在のところボーナスは意味がありません。
マーティンエンダー

2
Marbelousでの最初の回答に100の報奨金を与えます。落下するビー玉によって計算される落下りんご...それはあまりにもぴったりです。
キントピア

回答:


1

PHP、230バイト

読みやすくするために、最初の2つの改行を追加しました。

function($l){for($y=count($l);$y>=0;$f[]="$a|   |$a")$a=str_repeat($y--?$w=' ':'-',99);
foreach($l as$x){for($x+=101,$s=$y=0;!$s;$b[$x]!=$w?$b[$x+1]!=$w?$b[$x-1]!=$w?$s=1:--$x
:++$x:0)$b=$f[$y++];$f[$y-2][$x]=a;}echo join('
',$f);};

Ideone

以下は、バージョン化されていないバージョンです。

function drawApples(array $listStartX)
{
    $field = [];
    $maximalHeight = count($listStartX);
    for ($y = $maximalHeight; $y >= 0; --$y)
    {
        $line = str_repeat($y > 0 ? ' ' : '-', 98);
        $field[] = $line .'|   |'. $line;
    }

    foreach ($listStartX as $x)
    {
        $x += 100;
        for ($y = 0; true; ++$y)
        {
            if ($field[$y][$x] === ' ') {
                continue;
            }

            if ($field[$y][$x + 1] === ' ') {
                ++$x;
                continue;
            }

            if ($field[$y][$x - 1] === ' ') {
                --$x;
                continue;
            }

            $field[$y - 1][$x] = 'a';
            break;
        }
    }

    echo implode("\n", $field);
}

1

Python 2.7、282バイト

from collections import*;a=Counter();a[2]=-1;a[-2]=-1
for d in input():
 while 0<=a[d+1]<a[d]:d+=1
 while 0<=a[d-1]<a[d]:d-=1
 a[d]+=1
m=max(a.values())+1
print'\n'.join(''.join(' '*(m-a[i]-1)+'a'*a[i]+'-'if i**2!=4 else'|'*m for i in range(min(a),max(a)+1))[i::m]for i in range(m))

Ideone

まあ…試した。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.