Numeri di sandpile


18

Sfida

Ti verrà dato un numero intero positivo ncome input. L'output dovrebbe essere una pila di sabbia simile a una piramide costruita sulle regole specificate di seguito:

  • Ogni numero intero "cade" verso il basso dallo stesso punto iniziale iniziale, come la sabbia che cade in una forma conica.
  • I numeri maggiori del numero direttamente sotto di esso quando colpisce la pila di sabbia cadranno a destra, se possibile.
  • I numeri inferiori al numero direttamente sotto di esso quando colpisce la pila di sabbia cadranno a sinistra, se possibile.
  • I numeri uguali al numero direttamente sotto di esso quando colpisce la pila di sabbia rimarranno al loro posto.
  • I numeri possono cadere a sinistra / destra se possono spostarsi rispettivamente verso il basso e verso sinistra / destra. Cioè, se c'è già un numero sotto e verso sinistra / destra, a seconda della direzione, il numero attualmente in calo non si sposta.
  • Un numero continuerà a cadere nella catasta di sabbia fino a quando non può essere spostato nella posizione successiva, o colpisce il pavimento.

Appunti

Il controllo di confronto iniziale si applica solo al primo numero intero rilevato, non per ogni incontro successivo mentre scorre nella pila di sabbia.

Gli spazi finali sono a posto, ma le nuove righe finali non lo sono.

Non ci sono spazi iniziali o nuove linee, tranne dove necessario per preservare la struttura della sabbia.

È possibile scrivere un programma o una funzione completi.

Si può presumere che l'input conterrà solo una combinazione [0-9].

Questo è , il codice più breve in byte sarà contrassegnato come vincitore dalle Ides di marzo

Esempi

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

555444333222111è un errore che il terzo 4cadrà a sinistra del primo 4?
Andlrc,

I numeri @ dev-null continueranno a "cadere", se vuoi, per quanto sono in grado - ricorda, il controllo maggiore / minore / uguale si applica solo al primo incontro.
CzarMatt

Risposte:


4

JavaScript (ES6), 260 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`

Modifica: salvato 25 byte realizzando che il primo carattere non è un caso speciale. Salvato 15 byte utilizzando una matrice di stringhe anziché una matrice di matrici di caratteri. 12 byte salvati in correzioni varie, incluso l'uso di un valore letterale \n(non mostrato). Ciò rende il 20% più breve! Volevo liberarmene, reversema questo costa più di quello che posso quindi risparmiare sostituendolo mapcon 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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.