Цілі числа Sandpile


18

Виклик

Вам буде введено додатне ціле число nяк вхідне. Вихід повинен бути пірамідковим пісковиком, побудованим за правилами, зазначеними нижче:

  • Кожне ціле число "падає" вниз від тієї ж початкової точки, як пісок, що потрапляє у конусну форму.
  • Числа, що перевищують число безпосередньо під ним, коли він потрапляє на пісковик, впадуть праворуч, якщо зможуть.
  • Числа менше числа безпосередньо під ним, коли він потрапляє на пісковик, впадуть ліворуч, якщо зможуть.
  • Числа, рівні кількості прямо під ним, коли він потрапляє на пісковик, залишаться на місці.
  • Числа можуть падати вліво / вправо, якщо вони можуть рухатися вниз і вліво / вправо відповідно. Тобто, якщо вже є число внизу та вліво / вправо, залежно від напрямку, число, що падає в даний час, не рухається.
  • Число буде продовжувати падати пісковиком до тих пір, поки його не вдасться перенести у наступне положення, або не вдарить об підлогу.

Примітки

Початкова перевірка порівняння застосовується лише до першого зустрічається цілого числа, а не до кожної послідовної зустрічі, коли вона падає на пісковик.

Пробіли проходять добре, але нові лінії не є.

Ні провідних просторів, ні нових ліній, крім випадків, коли це потрібно для збереження структури пісковика.

Ви можете написати повну програму або функцію.

Ви можете припустити, що введення містить лише деяку комбінацію [0-9].

Це , найкоротший код у байтах буде відзначений переможцем березня

Приклади

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це помилка, що третя 4впаде лівою до першої 4?
andlrc

@ dev-null цифри продовжуватимуть «змінюватися», якщо ви будете, поки вони зможуть - пам’ятайте, більший / менший / рівний чек стосується лише першої зустрічі.
CzarMatt

Відповіді:


4

JavaScript (ES6), 260 208 байт

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`

Редагувати: збережено 25 байт, зрозумівши, що перший символ не є особливим випадком. Збережено 15 байт за допомогою масиву рядків замість масиву масивів символів. Збережено 12 байтів у різних виправленнях, у тому числі з використанням літералу \n(не показано). Це робить це ціле на 20% коротшим! Я хотів позбутися, reverseале це коштує більше, ніж я можу потім заощадити, замінивши mapна replace.

Безголівки:

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.