Песочница целые числа


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.

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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.