苹果掉下来了


15

介绍

x轴上的苹果树干位于-2到2之间,一些苹果掉落在它周围:

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

每天,有n个苹果掉下来。每个苹果都保持其x坐标,直落在地。

但是,如果它落在另一个苹果的顶部,它将按照以下规则滚动,直到到达地面或苹果的支撑层:

  1. 如果当前高度的x + 1处的空间为空,则当前的苹果会去那里。
  2. 否则,如果x-1处的空间为空,则当前的苹果进入该位置。
  3. 否则,当前苹果将停留在该其他苹果之上。

挑战

输入将按顺序是每个苹果的n个起始位置。您可以将其视为数组或分隔数字,也可以采用其他任何有效方式,只需确保在答案中对其进行了解释即可。

输出应该是树干和周围苹果的ASCII绘图。您不需要在最左边的苹果的左侧和最右边的苹果的右侧绘制x轴,但是您确实需要在某些苹果下方的任何位置绘制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方向上的最小可能范围(树木和苹果的左侧和右侧没有空的地面)。这是一个要求吗?另外,是否允许我们打印尾随空格,至少将输出填充为矩形?
Martin Ender

1
奖金不是很受欢迎。我认为要求“可见”输出最小(顶部没有空行,边缘没有空单元)是可以的,但是我绝对可以将输出填充到带有空格的矩形中。
马丁·恩德

另外,由于规范实际上不允许以任何不同的输出格式开头,因此您当前无法获得任何奖金。
Martin Ender

2
对于Marbelous中的第一个答案,我将给予100 rep赏金。用掉下的弹珠算出的掉落的苹果……太合适了。
quintopia '16

Answers:


1

PHP,230字节

我为可读性添加了前两个换行符。

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

好吧...我试过了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.