Số nguyên Sandpile


18

Thử thách

Bạn sẽ được cung cấp một số nguyên dương nlàm đầu vào. Đầu ra phải là một hố cát giống như kim tự tháp được xây dựng theo các quy tắc được chỉ định dưới đây:

  • Mỗi số nguyên "rơi" xuống từ cùng một điểm bắt đầu ban đầu, giống như cát rơi vào hình nón.
  • Các số lớn hơn số trực tiếp bên dưới nó khi nó chạm vào hố cát sẽ rơi sang bên phải, nếu có thể.
  • Các số nhỏ hơn số trực tiếp bên dưới nó khi nó chạm vào hố cát sẽ rơi sang bên trái, nếu có thể.
  • Các số bằng với số trực tiếp bên dưới nó khi nó chạm vào hố cát sẽ giữ nguyên vị trí.
  • Các con số có thể rơi sang trái / phải nếu chúng có thể di chuyển xuống và sang trái / phải tương ứng. Đó là, nếu đã có một số bên dưới và bên trái / bên phải, tùy thuộc vào hướng, số hiện đang giảm không di chuyển.
  • Một con số sẽ tiếp tục rơi xuống hố cát cho đến khi nó không thể di chuyển sang vị trí tiếp theo hoặc chạm sàn.

Ghi chú

Kiểm tra so sánh ban đầu chỉ áp dụng cho số nguyên gặp phải đầu tiên, không áp dụng cho mỗi lần gặp gỡ liên tiếp khi nó rơi xuống hố cát.

Không gian lưu trữ là được nhưng dòng mới thì không.

Không có không gian hàng đầu hoặc đường mới trừ khi cần thiết để bảo tồn cấu trúc của hố cát.

Bạn có thể viết một chương trình hoặc chức năng đầy đủ.

Bạn có thể cho rằng đầu vào sẽ chỉ chứa một số kết hợp [0-9].

Đây là , mã ngắn nhất tính theo byte sẽ được đánh dấu là người chiến thắng bởi Ides of March

Ví dụ

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Đó có phải là một sai lầm mà người thứ ba 4sẽ rơi sang người đầu tiên 4?
andlrc

Các số @ dev-null sẽ tiếp tục 'sụt giảm', nếu bạn muốn, miễn là chúng có thể - hãy nhớ, kiểm tra lớn hơn / ít hơn / bằng nhau chỉ áp dụng cho lần gặp đầu tiên.
CzarMatt

Câu trả lời:


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`

Chỉnh sửa: Đã lưu 25 byte bằng cách nhận ra rằng ký tự đầu tiên không phải là trường hợp đặc biệt. Đã lưu 15 byte bằng cách sử dụng một mảng các chuỗi thay vì một mảng các ký tự. Đã lưu 12 byte trong các bản sửa lỗi linh tinh, bao gồm cả việc sử dụng một chữ \n(không hiển thị). Điều đó làm cho toàn bộ điều này ngắn hơn 20%! Tôi muốn thoát khỏi reversenhưng chi phí nhiều hơn tôi có thể tiết kiệm bằng cách thay thế mapbằng replace.

Ung dung:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.