サンドパイル整数


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


7313623030872935273465247457435345345345350

    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バイトを保存しました。リテラル\n(図示せず)の使用を含む、さまざまな修正で12バイトを保存しました。これにより、この全体が20%短くなります!私はを取り除くために望んでいたreverseが、コストがより多くの私は、交換することにより保存することができますよりも、それmapreplace

ゴルフをしていない:

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.