Les pommes tombent

15

introduction

Il y a un tronc de pommier positionné entre -2 et 2 sur l'axe des x, où quelques pommes tombent autour de lui:

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

Tous les jours, n pommes tombent. Chaque pomme conserve sa coordonnée x lorsqu'elle tombe directement au sol.

Mais s'il atterrit sur une autre pomme, il roulera selon les règles suivantes jusqu'à ce qu'il atteigne le sol ou une couche de support de pommes:

  1. Si l'espace à x + 1 à sa hauteur actuelle est vide, la pomme actuelle y va.
  2. Sinon, si l'espace à x-1 est vide, la pomme actuelle y va.
  3. Sinon, la pomme actuelle reste là où elle est au-dessus de cette autre pomme.

Défi

L'entrée sera les n positions de départ de chaque pomme dans l'ordre. Vous pouvez le prendre comme un tableau ou comme des nombres séparés ou de toute autre manière valide, assurez-vous simplement de l'expliquer dans votre réponse.

La sortie doit être un dessin ASCII du tronc d'arbre et des pommes autour. Vous n'êtes pas obligé de dessiner l'axe des x à gauche de la pomme la plus à gauche et à droite de la pomme la plus à droite, mais vous devez le dessiner partout où il se trouve sous une pomme. Vous pouvez également étendre l'arbre au-dessus de la pomme la plus haute.

Vous pouvez supposer que toutes les coordonnées x sont comprises entre -100 et 100, mais pas entre -2 et 2.

C'est le . La réponse la plus courte en octets gagne!

Exemples

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

Production:

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

Contribution: [3, 3, 3, 3, 8, 9]

Production:

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

Contribution: [-5, -5, -5, -5, -5, -5, -5, -5, -5]

Production:

  a  |   |
 aaa |   |
aaaaa|   |
-----|---|
supprimé
la source
Souvenirs. :)
Martin Ender
Vos exemples impliquent que l'étendue minimale possible dans la direction x doit être indiquée (pas de terrain vide à gauche et à droite des arbres et des pommes). Est-ce une exigence? De plus, sommes-nous autorisés à imprimer des espaces de fin, au moins pour remplir la sortie sur un rectangle?
Martin Ender
1
Les bonus ne sont pas très populaires. Je pense qu'exiger que la sortie "visible" soit minimale (pas de lignes vides en haut, pas de cellules de fond sur les bords qui sont vides) est bien, mais je permettrait certainement de remplir la sortie dans un rectangle avec des espaces.
Martin Ender
De plus, votre bonus n'a actuellement aucun sens car la spécification ne permet pas de commencer par un format de sortie différent .
Martin Ender
2
Je donnerai une prime de 100 répétitions à la première réponse à Marbelous. Chute de pommes calculée par la chute de billes ... c'est tout simplement trop approprié.
quintopie du

Réponses:

1

PHP, 230 octets

J'ai ajouté les deux premières nouvelles lignes pour la lisibilité.

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

Voici la version non golfée:

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);
}
Trou noir
la source
1

Python 2.7, 282 octets

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

Eh bien… j'ai essayé.

301 Déménagé Définitivement
la source