Bilangan bulat sandpile

18

Tantangan

Anda akan diberikan bilangan bulat positif nsebagai input. Keluaran harus berupa tumpukan pasir seperti piramida yang dibangun berdasarkan aturan yang ditentukan di bawah ini:

  • Setiap bilangan bulat "jatuh" ke bawah dari titik awal awal yang sama, seperti pasir yang jatuh ke bentuk kerucut.
  • Angka lebih besar dari angka tepat di bawahnya ketika menyentuh tumpukan pasir akan jatuh ke kanan, jika bisa.
  • Angka kurang dari angka tepat di bawahnya ketika menyentuh tumpukan pasir akan jatuh ke kiri, jika bisa.
  • Angka sama dengan angka tepat di bawahnya ketika menyentuh tumpukan pasir akan tetap di tempatnya.
  • Angka dapat jatuh ke kiri / kanan jika masing-masing dapat bergerak ke bawah dan ke kiri / kanan. Yaitu, jika sudah ada angka di bawah dan ke kiri / kanan, tergantung pada arahnya, angka yang sedang jatuh tidak bergerak.
  • Sejumlah akan terus jatuh ke bawah tumpukan pasir sampai tidak dapat dipindahkan ke posisi berikutnya, atau menyentuh lantai.

Catatan

Pemeriksaan perbandingan awal hanya berlaku untuk bilangan bulat yang ditemui pertama kali, tidak untuk setiap pertemuan berturut-turut karena jatuh ke bawah tumpukan pasir.

Mengejar spasi tidak apa-apa tapi membuntuti garis baru tidak.

Tidak ada ruang terkemuka atau garis baru kecuali jika diperlukan untuk melestarikan struktur tumpukan pasir.

Anda dapat menulis program atau fungsi lengkap.

Anda mungkin menganggap input hanya akan berisi beberapa kombinasi [0-9].

Ini adalah , kode terpendek dalam byte akan ditandai sebagai pemenang oleh Ides of March

Contohnya

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
sumber
555444333222111Apakah itu kesalahan bahwa yang ketiga 4akan jatuh ke tangan yang pertama 4?
andlrc
@ dev-null angka akan terus 'jatuh', jika Anda mau, selama mereka bisa - ingat, semakin besar / kurang / sama dengan cek hanya berlaku untuk pertemuan pertama.
CzarMatt

Jawaban:

4

JavaScript (ES6), 260 208 byte

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`

Sunting: Disimpan 25 byte dengan menyadari bahwa karakter pertama bukanlah huruf khusus. Disimpan 15 byte dengan menggunakan array string, bukan array array chars. Menyimpan 12 byte dalam perbaikan lainnya, termasuk menggunakan literal \n(tidak ditampilkan). Itu membuat keseluruhan ini 20% lebih pendek! Saya ingin menyingkirkan reversetetapi biaya lebih dari saya bisa kemudian simpan dengan mengganti mapdengan replace.

Tidak Disatukan:

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
sumber