จำนวนเต็มของทราย


18

ท้าทาย

คุณจะได้รับจำนวนเต็มบวกnเป็นอินพุต ผลผลิตควรเป็นทรายคล้ายปิรามิดที่สร้างขึ้นตามกฎที่ระบุด้านล่าง:

  • จำนวนเต็มแต่ละ "ตก" ลงจากจุดเริ่มต้นเดียวกันเหมือนทรายที่ตกลงไปในรูปกรวย
  • ตัวเลขที่มากกว่าตัวเลขด้านล่างเมื่อสัมผัสกับกองทรายจะตกลงไปทางขวาหากทำได้
  • ตัวเลขที่น้อยกว่าตัวเลขที่อยู่ด้านล่างเมื่อสัมผัสกับกองทรายจะตกลงไปทางซ้ายถ้าทำได้
  • ตัวเลขเท่ากับจำนวนที่อยู่ด้านล่างเมื่อสัมผัสกับกองทรายจะอยู่ในตำแหน่ง
  • ตัวเลขสามารถลดลงไปทางซ้าย / ขวาหากพวกเขาสามารถเลื่อนลงและไปทางซ้าย / ขวาตามลำดับ นั่นคือถ้ามีตัวเลขด้านล่างและทางซ้าย / ขวาแล้วขึ้นอยู่กับทิศทางจำนวนที่ลดลงในปัจจุบันจะไม่ย้าย
  • จำนวนจะยังคงเกลือกกลิ้งกองทรายจนกระทั่งไม่สามารถเคลื่อนย้ายไปยังตำแหน่งต่อไปหรือชนพื้น

หมายเหตุ

การตรวจสอบการเปรียบเทียบเบื้องต้นจะใช้กับจำนวนเต็มที่พบเป็นครั้งแรกเท่านั้นไม่ใช่สำหรับการเผชิญหน้าแต่ละครั้งอย่างต่อเนื่องเนื่องจากจะทำให้กองทรายลง

ช่องว่างต่อท้ายไม่เป็นไร แต่การขึ้นบรรทัดใหม่ไม่ใช่

ไม่มีช่องว่างนำหน้าหรือบรรทัดใหม่ยกเว้นที่จำเป็นเพื่อรักษาโครงสร้างของทราย

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบได้

คุณอาจสันนิษฐานว่าการป้อนข้อมูลจะมีเพียงบางส่วน[0-9]เท่านั้น

นี้เป็นรหัสสั้นที่สุดเป็นไบต์จะถูกทำเครื่องหมายว่าเป็นผู้ชนะโดยIdes of March

ตัวอย่าง

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 ไบต์โดยใช้อาร์เรย์ของสตริงแทนอาร์เรย์ของ chars บันทึก 12 ไบต์ในการแก้ไขเบ็ดเตล็ดรวมถึงการใช้ตัวอักษร\n(ไม่แสดง) นั่นทำให้ทั้งหมดนี้สั้นลง 20%! ผมอยากจะกำจัดreverseแต่ที่ค่าใช้จ่ายมากขึ้นกว่าที่ฉันสามารถแล้วโดนแทนที่ด้วยmapreplace

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.