Liczby całkowite Sandpile

18

Wyzwanie

nJako dane wejściowe otrzymasz dodatnią liczbę całkowitą . Dane wyjściowe powinny być jak piramidy zbudowane na zasadach określonych poniżej:

  • Każda liczba całkowita „spada” od tego samego początkowego punktu początkowego, jak piasek opadający w stożkowy kształt.
  • Liczby większe niż liczba bezpośrednio pod nim, gdy uderzy w stos piasku, spadną w prawo, jeśli to możliwe.
  • Liczby mniejsze niż liczba bezpośrednio pod nim, gdy uderzy w stos piasku, spadnie w lewo, jeśli to możliwe.
  • Liczby równe liczbie znajdującej się bezpośrednio pod nim, gdy uderzy w stos piasku, pozostaną na swoim miejscu.
  • Liczby mogą spaść w lewo / w prawo, jeśli mogą się odpowiednio przesunąć w dół i w lewo / w prawo. Oznacza to, że jeśli liczba jest już poniżej i po lewej / prawej stronie, w zależności od kierunku, aktualnie spadająca liczba nie przesuwa się.
  • Liczba będzie nadal spadać po kupce piasku, dopóki nie będzie można przesunąć jej do następnej pozycji lub uderzyć o podłogę.

Notatki

Wstępna kontrola porównania ma zastosowanie tylko do pierwszej napotkanej liczby całkowitej, a nie do każdego kolejnego spotkania, gdy spada ona po stoku piasku.

Końcowe spacje są w porządku, ale końcowe nowe wiersze nie.

Brak spacji wiodących lub nowych linii, z wyjątkiem przypadków, gdy jest to konieczne do zachowania struktury stosu piasku.

Możesz napisać pełny program lub funkcję.

Możesz założyć, że dane wejściowe będą zawierać tylko niektóre kombinacje [0-9].

To jest , najkrótszy kod w bajtach zostanie oznaczony jako zwycięzca do Ides marca

Przykłady

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
źródło
555444333222111czy to pomyłka, że ​​trzeci 4spadnie do pierwszego 4?
andlrc
@ dev-null liczby będą nadal „spadać”, jeśli tak, o ile będą w stanie - pamiętaj, że większa / mniejsza / równa kontrola dotyczy tylko pierwszego spotkania.
CzarMatt

Odpowiedzi:

4

JavaScript (ES6), 260 208 bajtów

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`

Edycja: Zapisano 25 bajtów, wiedząc, że pierwszy znak nie jest przypadkiem specjalnym. Zaoszczędzono 15 bajtów, używając tablicy ciągów zamiast tablicy tablic znaków. Zapisano 12 bajtów w różnych poprawkach, w tym za pomocą literału \n(nie pokazano). To sprawia, że ​​całość jest o 20% krótsza! Chciałem pozbyć reverse, ale to kosztuje więcej niż ja wtedy Zapisz zastępując mapz replace.

Nie golfowany:

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
źródło