Цифри копають підземелля


10

Редагувати: Я нагороджу 100-репутаційною нагородою за перший вирішувач бонусної головоломки наприкінці питання!

Я додаю щедрості до питання лише тоді, коли з’явиться відповідь, оскільки цей щедрот не має терміну.

Враховуючи не зменшуваний список одноцифрових натуральних чисел, слід визначити, наскільки глибоко підземелля будуть викопувати цифри.

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

Перед початком копання земля вирівнюється.

Кожна цифра може видалити рівно один грунт ґрунту знизу, але він повинен досягти цього положення поза підземеллям, і після його вилучення блок повинен покинути підземелля. При цьому цифра не може опускатися або підніматися більше, ніж її числове значення, на будь-якому горизонтальному кроці.

Для цифр використовується наступна стратегія копання:

  • Цифра з найменшим значенням копається спочатку, а після цього наступним копачем завжди є наступне найменше значення від решти цифр.
  • Першу цифру можна викопати в будь-якій позиції. (Вся земля однакова.)
  • Наступні цифри завжди копаються в крайньому лівому стовпчику, де вже можна вийти та вийти. Якщо такого стовпця немає, вони починають викопувати новий стовпець праворуч від крайнього правого.

Наприклад, цифри 1 1 1 2 3 3копають наступні підземелля (поетапна візуалізація цифрами, які позначають, яка цифра викопує цю позицію):

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

Пояснення для прикладу:

  • Другий 1не міг вилізти з єдиної наявної колони, якщо вона поглибить його до 2-глибокого, щоб він копав прямо до нього.
  • Третій 1може викопати в крайньому лівому стовпчику, створивши 2глибокий стовпчик, оскільки він може переміститися в 1-глибокий стовпчик, а потім до рівня землі.
  • Наступний 2і 3обидва можуть викопати в крайній лівій колонці.
  • Останній 3не може копати в крайньому лівому стовпці, але може в наступному.

Вхідні дані

  • Не зменшується список позитивних одноцифрових цілих чисел, принаймні один елемент.

Вихідні дані

  • Єдине додатне ціле число, глибина побудованої підземелля.

Приклади

Введення => Виведення (з глибинами стовпців підземелля зліва направо як пояснення, яке не є частиною виводу)

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

Це код-гольф, тому найкоротший запис виграє.

Бонусна головоломка

Чи можете ви довести (або спростуєте), що стратегія, описана в розділі "Цифри використовують наступну стратегію для копання", завжди дає найглибший підземелля для даних цифр?

Відповіді:


5

Pyth, 21 байт

huXf>+H@GhT@GT0G1Qm0Q

Спробуйте в Інтернеті: Один демонстраційний або тестовий набір

Пояснення:

                  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

Ява, 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);}

Розширена версія для запуску

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}));
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.