사과가 떨어지고있다


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 2016 년

1
보너스는 그리 인기가 없습니다. "보이는"출력을 최소화해야한다고 생각합니다 (맨 위의 빈 행 없음, 비어있는 가장자리의 접지 셀 없음). 그러나 공백이있는 사각형에 출력을 채울 수 있습니다.
Martin Ender

또한 사양에서 실제로 다른 출력 형식으로 시작할 수 없기 때문에 보너스는 현재 의미가 없습니다 .
Martin Ender

2
Marbelous의 첫 번째 답변에 100 회 보상을드립니다. 떨어지는 사과는 떨어지는 구슬로 계산됩니다 ... 너무 적합합니다.
quintopia

답변:


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

ungolfed 버전은 다음과 같습니다.

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

파이썬 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.