Enteros de pila de arena


18

Desafío

Se le dará un entero positivo ncomo entrada. La salida debe ser una pila de arena tipo pirámide construida sobre las reglas especificadas a continuación:

  • Cada número entero "cae" hacia abajo desde el mismo punto inicial, como arena que cae en forma de conal.
  • Los números mayores que el número directamente debajo de él cuando golpea la pila de arena caerán a la derecha, si es posible.
  • Los números menores que el número directamente debajo de él cuando golpea la pila de arena caerán a la izquierda, si es posible.
  • Los números iguales al número directamente debajo de él cuando golpea la pila de arena permanecerán en su lugar.
  • Los números pueden caer hacia la izquierda / derecha si pueden moverse hacia abajo y hacia la izquierda / derecha respectivamente. Es decir, si ya hay un número debajo ya la izquierda / derecha, dependiendo de la dirección, el número que cae actualmente no se mueve.
  • Un número continuará cayendo por la pila de arena hasta que no pueda moverse a su siguiente posición o golpee el piso.

Notas

La verificación de comparación inicial solo se aplica al primer entero encontrado, no para cada encuentro sucesivo a medida que cae por la pila de arena.

Los espacios finales están bien, pero las nuevas líneas finales no.

Sin espacios iniciales o nuevas líneas, excepto donde sea necesario para preservar la estructura de la pila de arena.

Puede escribir un programa o función completa.

Puede suponer que la entrada solo contendrá alguna combinación [0-9].

Este es el , el código más corto en bytes será marcado ganador por los idus de marzo

Ejemplos

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¿Es un error que el tercero 4caiga a la izquierda del primero 4?
andlrc

@ dev-null los números continuarán 'cayendo', si lo haces, siempre que puedan, recuerda, la verificación mayor / menor / igual solo se aplica al primer encuentro.
CzarMatt

Respuestas:


4

Javascript (ES6), 260 208 bytes

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`

Editar: ahorró 25 bytes al darse cuenta de que el primer carácter no es un caso especial. Se guardaron 15 bytes utilizando una matriz de cadenas en lugar de una matriz de matrices de caracteres. Se guardaron 12 bytes en arreglos diversos, incluido el uso de un literal \n(no mostrado). ¡Eso hace que todo este 20% sea más corto! Quería deshacerme de reverseeso, pero eso cuesta más de lo que puedo ahorrar al reemplazarlo mapcon replace.

Sin golf:

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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.