Las manzanas se están cayendo

15

Introducción

Hay un tronco de manzano ubicado entre -2 y 2 en el eje x, donde algunas manzanas caen a su alrededor:

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

Todos los días, n manzanas caen. Cada manzana mantiene su coordenada x cuando cae directamente al suelo.

Pero si cae sobre otra manzana, rodará de acuerdo con las siguientes reglas hasta que llegue al suelo o una capa de manzanas de soporte:

  1. Si el espacio en x + 1 en su altura actual está vacío, la manzana actual va allí.
  2. De lo contrario, si el espacio en x-1 está vacío, la manzana actual va allí.
  3. De lo contrario, la manzana actual permanece donde está encima de esa otra manzana.

Desafío

La entrada serán las n posiciones iniciales de cada manzana en orden. Puede tomarlo como una matriz o como números separados o de cualquier otra manera válida, solo asegúrese de explicarlo en su respuesta.

El resultado debe ser un dibujo ASCII del tronco del árbol y las manzanas alrededor. No es necesario que dibuje el eje x a la izquierda de la manzana más a la izquierda y a la derecha de la manzana más a la derecha, pero debe dibujarlo en cualquier lugar debajo de alguna manzana. También puede extender el árbol sobre la manzana más alta.

Puede suponer que todas las coordenadas x están entre -100 y 100, pero no entre -2 y 2.

Este es el . ¡La respuesta más corta en bytes gana!

Ejemplos

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

Salida:

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

Entrada: [3, 3, 3, 3, 8, 9]

Salida:

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

Entrada: [-5, -5, -5, -5, -5, -5, -5, -5, -5]

Salida:

  a  |   |
 aaa |   |
aaaaa|   |
-----|---|
remoto
fuente
Buenos recuerdos. :)
Martin Ender
Sus ejemplos implican que se debe mostrar la extensión mínima posible en la dirección x (sin suelo vacío a la izquierda y derecha de los árboles y las manzanas). ¿Es eso un requisito? Además, ¿podemos imprimir espacios finales, al menos para rellenar la salida a un rectángulo?
Martin Ender
1
Los bonos no son muy populares. Creo que requerir que la salida "visible" sea mínima (sin filas vacías en la parte superior, sin celdas de tierra en los bordes que están vacías) está bien, pero definitivamente permitiría rellenar la salida a un rectángulo con espacios.
Martin Ender
Además, su bonificación actualmente no tiene sentido porque la especificación en realidad no permite comenzar con ningún formato de salida diferente .
Martin Ender
2
Daré una recompensa de 100 repeticiones por la primera respuesta en Marbelous. La caída de manzanas calculada por la caída de las canicas ... es demasiado apropiado.
quintopia

Respuestas:

1

PHP, 230 bytes

He agregado las dos primeras líneas nuevas para la lectura.

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

Aquí está la versión sin golf:

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);
}
Agujero negro
fuente
1

Python 2.7, 282 bytes

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

Bueno, yo traté.

301 Movido Permanentemente
fuente