Äpfel fallen runter

15

Einführung

Auf der x-Achse befindet sich ein Apfelbaumstamm zwischen -2 und 2, um den herum einige Äpfel herunterfallen:

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

Jeden Tag fallen n Äpfel herunter. Jeder Apfel behält seine x-Koordinate bei, wenn er direkt auf den Boden fällt.

Wenn es jedoch auf einem anderen Apfel landet, rollt es nach den folgenden Regeln, bis es den Boden oder eine tragende Schicht von Äpfeln erreicht:

  1. Wenn das Feld bei x + 1 in der aktuellen Höhe leer ist, wird der aktuelle Apfel dorthin verschoben.
  2. Ist das Feld bei x-1 leer, geht der aktuelle Apfel dorthin.
  3. Ansonsten bleibt der aktuelle Apfel dort, wo er auf dem anderen Apfel liegt.

Herausforderung

Die Eingabe erfolgt in der Reihenfolge der n Startpositionen jedes Apfels. Sie können es als Array oder als getrennte Zahlen oder auf eine andere gültige Art und Weise verwenden. Erklären Sie es einfach in Ihrer Antwort.

Die Ausgabe sollte eine ASCII-Zeichnung des Baumstamms und der Äpfel sein. Sie müssen die x-Achse nicht links vom Apfel ganz links und rechts vom Apfel ganz rechts zeichnen, sondern müssen sie an einer beliebigen Stelle unterhalb eines Apfels zeichnen. Sie können den Baum auch über den höchsten Apfel hinaus verlängern.

Sie können davon ausgehen, dass alle x-Koordinaten zwischen -100 und 100 liegen, jedoch nicht zwischen -2 und 2.

Das ist . Die kürzeste Antwort in Bytes gewinnt!

Beispiele

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

Ausgabe:

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

Eingang: [3, 3, 3, 3, 8, 9]

Ausgabe:

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

Eingang: [-5, -5, -5, -5, -5, -5, -5, -5, -5]

Ausgabe:

  a  |   |
 aaa |   |
aaaaa|   |
-----|---|
entfernt
quelle
Schöne Erinnerungen. :)
Martin Ender
Ihre Beispiele implizieren, dass die minimal mögliche Ausdehnung in x-Richtung gezeigt werden sollte (kein leerer Boden links und rechts von den Bäumen und Äpfeln). Ist das eine Voraussetzung? Dürfen wir auch nachgestellte Leerzeichen drucken, um die Ausgabe zumindest auf ein Rechteck abzufüllen?
Martin Ender
1
Boni sind nicht sehr beliebt. Ich denke, die "sichtbare" Ausgabe muss minimal sein (keine leeren Zeilen oben, keine Bodenzellen an den Kanten, die leer sind), aber ich würde definitiv zulassen, dass die Ausgabe in ein Rechteck mit Leerzeichen aufgefüllt wird.
Martin Ender
Außerdem ergibt Ihr Bonus derzeit keinen Sinn, da die Spezifikation zunächst kein anderes Ausgabeformat zulässt .
Martin Ender
2
Ich werde die erste Antwort in Marbelous mit 100 Wiederholungen belohnen. Fallende Äpfel berechnet durch fallende Murmeln ... es ist einfach zu passend.
Quintopia

Antworten:

1

PHP, 230 Bytes

Ich habe die ersten beiden Zeilen zur besseren Lesbarkeit hinzugefügt.

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

Hier ist die ungolfed Version:

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);
}
Schwarzes Loch
quelle
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

Naja ich habe es versucht.

409_Konflikt
quelle