沙堆整数


18

挑战

您将得到一个正整数n作为输入。输出应为基于以下指定规则的金字塔形沙堆:

  • 每个整数都从相同的初始起点“下降”,就像沙子掉落成圆锥形一样。
  • 如果能够,大于比直接在其下方的数字大的数字将落在右侧。
  • 如果可能,小于直接在其下面的数字的数字将落在左侧。
  • 当它碰到沙堆时,等于其正下方数字的数字将保留在原位。
  • 如果数字可以分别向下移动和向左/向右移动,则它们可以左右移动。也就是说,如果根据方向的不同,在左下方和左/右方向已经有一个数字,则当前下降的数字不会移动。
  • 一个数字将继续从沙堆中跌落,直到无法将其移动到下一个位置或撞到地板上为止。

笔记

初始比较检查仅适用于遇到的第一个整数,不适用于每次连续遇到的整数,因为它在沙堆中翻滚。

尾随空格可以,但尾随新行不行。

除需要保留沙堆结构的地方外,没有任何前导空间或新行。

您可以编写完整的程序或功能。

您可能会假设输入将仅包含某些组合[0-9]

这是,最短的代码(以字节为单位)将被3月Ides标记为赢家

例子

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

Answers:


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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.