Sandpile-Ganzzahlen

18

Herausforderung

Sie erhalten eine positive Ganzzahl nals Eingabe. Die Ausgabe sollte ein pyramidenartiger Sandhaufen sein, der nach den folgenden Regeln erstellt wurde:

  • Jede ganze Zahl "fällt" vom gleichen Anfangspunkt nach unten, wie Sand, der in eine konische Form fällt.
  • Zahlen, die größer sind als die Zahl direkt darunter, wenn sie auf den Sandhaufen treffen, werden, falls möglich, nach rechts fallen.
  • Zahlen, die kleiner als die Zahl direkt darunter sind, wenn sie auf den Sandhaufen treffen, werden, falls möglich, nach links fallen.
  • Zahlen, die der Zahl direkt darunter entsprechen, wenn sie auf den Sandhaufen treffen, bleiben an Ort und Stelle.
  • Zahlen können nach links / rechts fallen, wenn sie sich nach unten bzw. nach links / rechts bewegen. Das heißt, wenn sich unten und links / rechts je nach Richtung bereits eine Zahl befindet, bewegt sich die aktuell fallende Zahl nicht.
  • Eine Zahl fällt so lange auf den Sandhaufen, bis sie nicht mehr in die nächste Position bewegt werden kann oder auf den Boden fällt.

Anmerkungen

Die anfängliche Vergleichsprüfung gilt nur für die erste angetroffene Ganzzahl, nicht für jede nachfolgende Begegnung, wenn sie den Sandhaufen hinunterfällt.

Nachgestellte Leerzeichen sind in Ordnung, nachgestellte neue Zeilen jedoch nicht.

Keine führenden Leerzeichen oder neuen Linien, außer wenn dies zur Erhaltung der Struktur des Sandhaufens erforderlich ist.

Sie können ein vollständiges Programm oder eine Funktion schreiben.

Sie können davon ausgehen, dass die Eingabe nur eine bestimmte Kombination enthält [0-9].

Dies ist , der kürzeste Code in Bytes wird von den Ides of March als Gewinner markiert

Beispiele

1

1


12345

35
124


54321

 13
245


555444333222111

    2
    2
    2
  135
 1345
13445


111222333444555

4
4
4
135
1235
12235


7313623030872935273465247457435345345350

    3
    3
    3
    3
    34
    355
    3644
   239475
  201277445
020373685575
CzarMatt
quelle
555444333222111Ist das ein Fehler, dass der Dritte 4dem Ersten überlassen bleibt 4?
andlrc
@ dev-null-Zahlen "fallen" weiter, wenn Sie dies tun, solange sie in der Lage sind - denken Sie daran, dass die Prüfung "Größer / Kleiner / Gleich" nur für die erste Begegnung gilt.
CzarMatt

Antworten:

4

JavaScript (ES6), 260 bis 208 Byte

s=>[...s].map(c=>a[g(n,(c>(l=a[n].slice(-1)))-(c<l))]+=c,n=s.length,a=Array(n+n).fill(''),g=(i,d)=>a[i].length>a[i+d].length?g(i+d,d):n)&&[...a[n]].map((_,i)=>a.map(c=>c?c[i]||' ':c).join``).reverse().join`\n`

Bearbeiten: 25 Bytes gespart, indem erkannt wurde, dass das erste Zeichen kein Sonderfall ist. Speichert 15 Bytes, indem ein Array von Zeichenfolgen anstelle eines Arrays von Zeichen verwendet wird. 12 Byte in verschiedenen Fixes gespeichert, einschließlich Literal \n(nicht gezeigt). Das macht das Ganze 20% kürzer! Ich wollte , um loszuwerden , reverseaber das kostet mehr als ich dann sparen durch den Ersatz mapmit replace.

Ungolfed:

function sandpile(str) {
    var arr = new Array(str.length * 2); // max width of sandpile is approx. 2√n but this is close enough
    for (i = 0; i < arr.length; i++) arr[i] = '';
    for (i = 0; i < str.length; i++) {
        var digit = str[i];
        var pos = str.length; // start dropping here
        if (digit < str[pos][str[pos].length - 1]) {
            while (str[pos - 1].length < str[pos].length) pos--;
        } else if (digit > str[pos][str[pos].length - 1]) {
            while (str[pos + 1].length < str[pos].length) pos++;
        }
        str[pos] += digit; // drop the digit
    }
    var len = arr[str.length].length; // final height
    // remove the unused columns, and then pad the columns with spaces for the transpose
    for (i = 0; i < arr.length; ) {
        if (!arr[i]) arr.splice(i, 1);
        else arr[i++] += ' '.repeat(len);
    }
    ans = '';
    for (i = len; i-- > 0; ) {
        for (j = 0; j < arr.length; j++) ans += arr[j][i];
        ans += '\n';
    }
    return ans;
}
Neil
quelle