Digit Menggali Dungeon

10

Sunting: Saya akan memberikan hadiah 100-reputasi untuk pemecah pertama dari teka-teki bonus di akhir pertanyaan!

Saya akan menambahkan hadiah ke pertanyaan hanya ketika jawabannya muncul karena hadiah ini tidak memiliki batas waktu.

Diberi daftar bilangan bulat positif satu digit yang tidak berkurang, Anda harus menentukan seberapa dalam penjara bawah tanah akan digali.

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

Sebelum dimulainya penggalian, tanahnya datar.

Setiap digit dapat menghapus tepat satu blok tanah dari bawahnya sendiri tetapi harus mencapai posisi itu dari luar ruang bawah tanah dan setelah itu dihapus blok harus meninggalkan ruang bawah tanah. Saat melakukannya, angka tidak dapat turun atau naik lebih dari nilai numeriknya pada langkah horizontal apa pun.

Digit menggunakan strategi berikut untuk menggali:

  • Digit dengan nilai terkecil menggali pertama dan setelah itu penggali berikutnya selalu merupakan nilai terkecil berikutnya dari sisa digit lainnya.
  • Digit pertama dapat digali di posisi mana pun. (Semua tanah adalah sama.)
  • Digit berikut selalu menggali di kolom paling kiri yang sudah mulai di mana mereka bisa pergi dan keluar. Jika tidak ada kolom seperti itu mereka mulai menggali kolom baru di sisi kanan yang paling kanan.

Misalnya digit 1 1 1 2 3 3akan menggali penjara bawah tanah berikut (visualisasi langkah demi langkah dengan angka yang menandai jenis digit mana yang menggali posisi itu):

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

Penjelasan untuk contoh:

  • Yang kedua 1tidak bisa memanjat keluar dari satu-satunya kolom yang tersedia jika itu akan memperdalamnya untuk 2-deep sehingga menggali tepat untuk itu.
  • Yang ketiga 1dapat menggali di kolom paling kiri membuat kolom 2-deep karena dapat pindah ke 1kolom -deep dan kemudian ke permukaan tanah.
  • Berikutnya 2dan 3keduanya dapat menggali di kolom paling kiri.
  • Yang terakhir 3tidak bisa menggali di kolom paling kiri tetapi bisa di yang berikutnya.

Memasukkan

  • Daftar bilangan bulat satu digit positif yang tidak berkurang dengan setidaknya satu elemen.

Keluaran

  • Integer positif tunggal, kedalaman ruang bawah tanah yang dibangun.

Contohnya

Input => Output (dengan kedalaman kolom dungeon dari kiri ke kanan sebagai penjelasan yang bukan bagian dari output)

[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])

Ini adalah kode-golf sehingga entri terpendek menang.

Teka-teki bonus

Bisakah Anda membuktikan (atau menyangkal) bahwa strategi yang dijelaskan dalam bagian "Digit menggunakan strategi berikut untuk menggali" selalu memberikan ruang bawah tanah terdalam untuk digit yang diberikan?

randomra
sumber

Jawaban:

5

Pyth, 21 byte

huXf>+H@GhT@GT0G1Qm0Q

Cobalah online: Demonstrasi Tunggal atau Test Suite

Penjelasan:

                  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
Jakube
sumber
2

Jawa, 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);}

Versi diperluas dan dapat dijalankan

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}));
    }
}
Ypnypn
sumber