Chữ số đào một hầm ngục


10

Chỉnh sửa: Tôi sẽ trao phần thưởng 100 danh tiếng cho người giải đầu tiên của câu đố tiền thưởng vào cuối câu hỏi!

Tôi sẽ thêm tiền thưởng vào câu hỏi chỉ khi câu trả lời xuất hiện vì tiền thưởng này không có thời hạn.

Đưa ra một danh sách không giảm các số nguyên dương một chữ số, bạn nên xác định dungeon sẽ đào sâu bao nhiêu chữ số.

███  ███  A dungeon with 5 blocks removed and a depth of 3.
███  ███
███ ████
████████

Trước khi bắt đầu đào đất là cấp.

Mỗi chữ số có thể loại bỏ chính xác một khối đất từ ​​bên dưới chính nó nhưng nó phải đến vị trí đó từ bên ngoài ngục tối và sau khi loại bỏ, khối phải rời khỏi ngục tối. Trong khi làm như vậy, một chữ số không thể giảm hoặc tăng hơn giá trị số của nó ở bất kỳ bước ngang nào.

Các chữ số sử dụng chiến lược sau đây để đào:

  • Chữ số có giá trị nhỏ nhất đào trước và sau đó máy đào tiếp theo luôn là giá trị nhỏ nhất tiếp theo từ các chữ số còn lại.
  • Chữ số đầu tiên có thể đào tại bất kỳ vị trí nào. (Tất cả mặt bằng là như nhau.)
  • Các chữ số sau luôn đào ở cột ngoài cùng đã bắt đầu nơi chúng có thể đi ra. Nếu không có cột nào như vậy tồn tại, họ bắt đầu đào một cột mới ở phía bên phải của cột ngoài cùng bên phải.

Ví dụ, các chữ số 1 1 1 2 3 3sẽ đào hầm ngục sau (trực quan hóa từng bước với các số đánh dấu loại chữ số nào đào ra vị trí đó):

███1████    ███11███    ███11███    ███11███    ███11███    ███11███
████████    ████████    ███1████    ███1████    ███1████    ███13███
████████    ████████    ████████    ███2████    ███2████    ███2████
████████    ████████    ████████    ████████    ███3████    ███3████
████████    ████████    ████████    ████████    ████████    ████████

Giải thích cho ví dụ:

  • Cái thứ hai 1không thể trèo ra khỏi cột duy nhất có sẵn nếu nó sẽ đào sâu nó đến 2-deep để nó đào ngay vào nó.
  • Cái thứ ba 1có thể đào trong cột ngoài cùng bên trái tạo cột 2-deep vì nó có thể di chuyển ra 1cột -deep và sau đó đến mặt đất.
  • Tiếp theo 23cả hai có thể đào trong cột ngoài cùng bên trái.
  • Cái cuối cùng 3không thể đào trong cột ngoài cùng bên trái nhưng có thể trong cột tiếp theo.

Đầu vào

  • Một danh sách không giảm các số nguyên một chữ số dương có ít nhất một phần tử.

Đầu ra

  • Một số nguyên dương duy nhất, độ sâu của ngục tối được xây dựng.

Ví dụ

Đầu vào => Đầu ra (với độ sâu của các cột của ngục tối từ trái sang phải như lời giải thích không phải là một phần của đầu ra)

[3]  =>  1
(column depths are [1])

[1, 1, 1, 2, 3, 3]  =>  4
(column depths are [4, 2])

[1, 1, 1, 1, 1, 1, 1, 1]  =>  3
(column depths are [3, 2, 2, 1])

[1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5]  =>  11
(column depths are [11, 6, 2])

[1, 1, 1, 1, 1, 2, 2, 9, 9, 9]  =>  7
(column depths are [7, 2, 1])

[2, 2, 2, 2, 2, 5, 5, 5, 7, 7, 9]  =>  9
(column depths are [9, 2])

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]  =>  10
(column depths are [10, 5])

[1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9]  =>  13
(column depths are [13, 5])

[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]  =>  13
(column depths are [13, 5])

[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9]  =>  21
(column depths are [21, 12, 3])

Đây là môn đánh gôn nên bài dự thi ngắn nhất sẽ thắng.

Phần thưởng câu đố

Bạn có thể chứng minh (hoặc từ chối) rằng chiến lược được mô tả trong phần "Các chữ số sử dụng chiến lược sau đây để đào" luôn đưa ra hầm ngục sâu nhất có thể cho các chữ số đã cho không?

Câu trả lời:


5

Bình thường, 21 byte

huXf>+H@GhT@GT0G1Qm0Q

Dùng thử trực tuyến: Trình diễn đơn hoặc Test Suite

Giải trình:

                  m0Q   generate a list of zeros of length len(input)
                        This will simulate the current depths
 u               Qm0Q   reduce G, starting with G=[0,...,0], for H in input():
   f          0             find the first number T >= 0, which satisfies:
    >+H@GhT@GT                  H + G[T+1] > G[T]
  X            G1           increase the depth at this position by one
                            update G with this result
h                       print the first element in this list

2

Java, 199

import java.util.*;a->{List<Integer>l=new ArrayList();l.add(0);int x,y,z=0;s:for(int i:a){for(x=0;x<z;x++)if((y=l.get(x))-l.get(x+1)<i){l.set(x,l.get(x)+1);continue s;}l.add(z++,1);}return l.get(0);}

Phiên bản mở rộng, có thể chạy được

import java.util.*;
class DIGits {
    public static void main(String[] args) {
        java.util.function.Function<int[], Integer> f =
                a->{
                    List<Integer> l = new ArrayList();
                    l.add(0);
                    int x, y, z = 0;
                    s:
                    for (int i : a) {
                        for (x = 0; x < z; x++) {
                            if ((y = l.get(x)) - l.get(x + 1) < i) {
                                l.set(x, l.get(x) + 1);
                                continue s;
                            }
                        }
                        l.add(z++, 1);
                    }
                    return l.get(0);
                };
        System.out.println(f.apply(new int[]{1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9}));
    }
}
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.