Apel jatuh

15

pengantar

Ada batang pohon Apple diposisikan antara -2 hingga 2 pada sumbu x, di mana beberapa apel jatuh di sekitarnya:

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

Setiap hari, n apel jatuh. Setiap apel mempertahankan koordinat xnya ketika jatuh langsung ke tanah.

Tetapi jika ia mendarat di atas apel lain, ia akan menggelinding sesuai dengan aturan berikut sampai mencapai tanah atau lapisan pendukung apel:

  1. Jika ruang di x +1 pada ketinggian saat ini kosong, apel saat ini pergi ke sana.
  2. Lain jika ruang di x-1 kosong apel saat ini pergi ke sana.
  3. Kalau tidak, apel saat ini tetap berada di atas apel lainnya.

Tantangan

Input akan menjadi n mulai posisi masing-masing apel dalam rangka. Anda bisa menganggapnya sebagai array atau sebagai angka yang terpisah atau dengan cara lain yang valid, pastikan Anda menjelaskannya dalam jawaban Anda.

Outputnya harus berupa gambar ASCII dari batang pohon dan apel di sekitarnya. Anda tidak diharuskan untuk menggambar sumbu x di sebelah kiri apel paling kiri dan di sebelah kanan apel paling kanan, tetapi Anda harus menggambar di mana saja di bawah apel itu. Anda juga dapat memperpanjang pohon di atas apel tertinggi.

Anda dapat mengasumsikan semua koordinat x antara -100 dan 100, tetapi tidak antara -2 dan 2.

Ini adalah .. Jawaban terpendek dalam byte menang!

Contohnya

Memasukkan: [-3, 5, 5, -4, -4, 5, -3]

Keluaran:

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

Memasukkan: [3, 3, 3, 3, 8, 9]

Keluaran:

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

Memasukkan: [-5, -5, -5, -5, -5, -5, -5, -5, -5]

Keluaran:

  a  |   |
 aaa |   |
aaaaa|   |
-----|---|
dihapus
sumber
Kenangan indah. :)
Martin Ender
Contoh Anda menyiratkan bahwa batas minimal yang mungkin dalam arah x harus ditunjukkan (tidak ada tanah kosong di kiri dan kanan pohon dan apel). Apakah itu persyaratan? Juga, apakah kita diizinkan untuk mencetak spasi tambahan, setidaknya untuk membungkus output ke persegi panjang?
Martin Ender
1
Bonus tidak terlalu populer. Saya pikir membutuhkan output "terlihat" menjadi minimal (tidak ada baris kosong di bagian atas, tidak ada sel tanah di tepi yang kosong) baik-baik saja, tapi saya pasti akan mengizinkan bantalan output ke persegi panjang dengan spasi.
Martin Ender
Juga, bonus Anda saat ini tidak masuk akal karena spek tidak benar-benar mengizinkan format output yang berbeda untuk memulai.
Martin Ender
2
Saya akan memberikan hadiah 100 rep untuk jawaban pertama di Marbelous. Apel yang jatuh dihitung dengan kelereng yang jatuh ... terlalu pas.
kuintopia

Jawaban:

1

PHP, 230 byte

Saya telah menambahkan dua baris baru pertama untuk readibility.

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

Ini adalah versi yang tidak dikoleksi:

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);
}
Lubang hitam
sumber
1

Python 2.7, 282 byte

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

Yah ... saya mencoba.

301_Moved_Permanently
sumber