Elma düşüyor


15

Giriş

X ekseninde -2 ila 2 arasında konumlandırılmış bir elma ağacı gövdesi vardır, burada bazı elmalar etrafında düşer:

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

Her gün n elma düşer. Her elma, x koordinatını doğrudan yere düştüğü gibi korur .

Ancak başka bir elmanın üstüne gelirse, yere veya destekleyici bir elma katmanına ulaşıncaya kadar aşağıdaki kurallara göre yuvarlanır:

  1. Geçerli yüksekliğinde x + 1'deki boşluk boşsa, geçerli elma oraya gider.
  2. Başka x-1'deki alan boşsa mevcut elma oraya gider.
  3. Aksi takdirde, mevcut elma diğer elmanın üstünde olduğu yerde kalır.

Meydan okuma

Giriş n olacak sırasıyla her elmanın başlangıç ​​konumu . Bir dizi veya ayrı sayılar olarak ya da geçerli başka bir yolla alabilirsiniz, cevabınızda açıkladığınızdan emin olun.

Çıktı, ağaç gövdesinin ve etrafındaki elmaların ASCII çizimi olmalıdır. Sen edilir gerekli değildir soldaki elma solundaki ve en sağdaki elma sağındaki x ekseni çizmek, ancak bazı elma altında olduğu yerde çizmek ihtiyacını yok. Ağacı en yüksek elmanın üzerine de uzatabilirsiniz.

Tüm x koordinatlarını varsayabilirsiniz -100 ile 100 arasında olduğunu, ancak -2 ile 2 arasında olmadığını .

Bu .. Bayt cinsinden en kısa cevap kazanır!

Örnekler

Giriş: [-3, 5, 5, -4, -4, 5, -3]

Çıktı:

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

Giriş: [3, 3, 3, 3, 8, 9]

Çıktı:

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

Giriş: [-5, -5, -5, -5, -5, -5, -5, -5, -5]

Çıktı:

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


Örnekleriniz, x yönünde mümkün olan minimum boyutun gösterilmesi gerektiğini göstermektedir (ağaçların ve elmanın solunda ve sağında boş zemin yoktur). Bu bir gereklilik mi? Ayrıca, en azından çıktıyı bir dikdörtgene yerleştirmek için arka boşlukları yazdırmamıza izin veriliyor mu?
Martin Ender

1
Bonuslar çok popüler değil. "Görünür" çıktı en az (üstte boş satır yok, boş kenarlarda hiçbir toprak hücreleri) gerektiren gerektirir düşünüyorum, ama kesinlikle boşluk ile bir dikdörtgen çıktı doldurmak izin verir.
Martin Ender

Ayrıca, bonus şu anda bir anlam ifade etmiyor çünkü spec aslında farklı bir çıktı formatının başlamasına izin vermiyor .
Martin Ender

2
Marbelous'un ilk cevabına 100 tekrar ödül vereceğim. Düşen mermerler tarafından hesaplanan düşen elmalar ... çok uygun.
quintopia

Yanıtlar:


1

PHP, 230 bayt

Okumak için ilk iki yeni satırı ekledim.

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

İşte ungolfed sürümü:

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 bayt

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

Şey ... denedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.