Maçãs estão caindo


15

Introdução

Há um tronco de árvore de maçã posicionado entre -2 e 2 no eixo x, onde algumas maçãs caem ao seu redor:

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

Todos os dias, n maçãs caem. Cada maçã mantém sua coordenada x conforme cai diretamente no chão.

Mas se pousar em cima de outra maçã, rolará de acordo com as seguintes regras até chegar ao chão ou a uma camada de maçãs de suporte:

  1. Se o espaço em x + 1 na sua altura atual estiver vazio, a maçã atual vai para lá.
  2. Caso contrário, se o espaço em x-1 estiver vazio, a maçã atual vai para lá.
  3. Caso contrário, a maçã atual permanece onde está em cima da outra maçã.

Desafio

A entrada serão as n posições iniciais de cada maçã em ordem. Você pode tomá-lo como uma matriz ou como números separados ou de qualquer outra maneira válida, apenas certifique-se de explicá-lo em sua resposta.

A saída deve ser um desenho ASCII do tronco da árvore e das maçãs ao redor. Você não é obrigado a desenhar o eixo x à esquerda da maçã mais à esquerda e à direita da maçã mais à direita, mas precisa desenhá-lo em qualquer lugar em que esteja abaixo de alguma maçã. Você também pode estender a árvore acima da maçã mais alta.

Você pode assumir que todas as coordenadas x estão entre -100 e 100, mas não entre -2 e 2.

Este é o . A resposta mais curta em bytes vence!

Exemplos

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

Resultado:

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

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

Resultado:

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

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

Resultado:

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


Seus exemplos sugerem que a extensão mínima possível na direção x deve ser mostrada (nenhum terreno vazio à esquerda e à direita das árvores e maçãs). Isso é um requisito? Além disso, temos permissão para imprimir espaços à direita, pelo menos para preencher a saída em um retângulo?
Martin Ender

1
Os bônus não são muito populares. Eu acho que exigir que a saída "visível" seja mínima (sem linhas vazias na parte superior, sem células no chão nas bordas vazias) é bom, mas eu definitivamente permitiria preencher a saída em um retângulo com espaços.
Martin Ender

Além disso, seu bônus atualmente não faz sentido, porque a especificação não permite realmente nenhum formato de saída diferente .
Martin Ender

2
Vou dar uma recompensa de 100 repetições à primeira resposta em Marbelous. Maçãs caindo calculadas por bolas de gude caindo ... é muito apropriado.
quintopia 22/01

Respostas:


1

PHP, 230 bytes

Adicionei as duas primeiras linhas novas para facilitar a leitura.

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

Aqui está a versão não destruída:

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 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

Bem, eu tentei.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.