Яблука падають


15

Вступ

На осі x розташований стовбур яблуні, розміщений від -2 до 2, де навколо нього падають деякі яблука:

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

Кожен день, п яблука падають. Кожне яблуко підтримує свою координату x, коли падає прямо на землю.

Але якщо він приземлиться поверх іншого яблука, він буде котитися за такими правилами, поки не досягне землі або опорного шару яблук:

  1. Якщо пробіл у х + 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
Я дам 100 прибутків за першу відповідь у Marbelous. Падіння яблук, обчислене падінням мармуру ... це просто занадто підходить.
Кінтопія

Відповіді:


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

Ну… я спробував.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.