Le mele stanno cadendo


15

introduzione

C'è un tronco di melo posizionato tra -2 e 2 sull'asse x, dove alcune mele cadono attorno ad esso:

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

Ogni giorno, n mele cadono. Ogni mela mantiene la sua coordinata x mentre cade direttamente a terra.

Ma se atterra su un'altra mela, rotolerà secondo le seguenti regole fino a raggiungere il terreno o uno strato di supporto di mele:

  1. Se lo spazio in x + 1 alla sua altezza attuale è vuoto, la mela corrente va lì.
  2. Altrimenti se lo spazio in x-1 è vuoto, la mela corrente va lì.
  3. Altrimenti la mela corrente rimane dove si trova sopra quell'altra mela.

Sfida

L'input saranno le n posizioni iniziali di ciascuna mela in ordine. Puoi prenderlo come un array o come numeri separati o in qualsiasi altro modo valido, assicurati solo di spiegarlo nella tua risposta.

L'output dovrebbe essere un disegno ASCII del tronco d'albero e delle mele intorno. Non è necessario disegnare l'asse x alla sinistra della mela più a sinistra e alla destra della mela più a destra, ma è necessario disegnarlo ovunque si trovi sotto una mela. Puoi anche estendere l'albero sopra la mela più alta.

Puoi assumere tutto coordinate x siano comprese tra -100 e 100, ma non tra -2 e 2.

Questo è .. Vince la risposta più breve in byte!

Esempi

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

Produzione:

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

Ingresso: [3, 3, 3, 3, 8, 9]

Produzione:

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

Ingresso: [-5, -5, -5, -5, -5, -5, -5, -5, -5]

Produzione:

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


I tuoi esempi implicano che dovrebbe essere mostrata la minima estensione possibile nella direzione x (nessun terreno vuoto a sinistra e a destra degli alberi e delle mele). È un requisito? Inoltre, siamo autorizzati a stampare spazi finali, almeno per riempire l'output in un rettangolo?
— Martin Ender,

1
I bonus non sono molto popolari. Penso che richiedere che l'output "visibile" sia minimo (nessuna riga vuota nella parte superiore, nessuna cella a terra ai bordi vuoti) va bene, ma consentirei sicuramente di riempire l'output in un rettangolo con spazi.
— Martin Ender,

Inoltre, il tuo bonus attualmente non ha senso perché le specifiche non consentono in realtà un diverso formato di output per iniziare.
— Martin Ender,

2
Darò una ricompensa di 100 rep alla prima risposta in Marbelous. Mele che cadono calcolate dai marmi che cadono ... è semplicemente troppo appropriato.
— Quintopia,

Risposte:


1

PHP, 230 byte

Ho aggiunto le prime due nuove righe per la leggibilità.

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

Ecco la versione 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

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

Beh ... ci ho provato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.