Advent Challenge 6: Транспортна док-станція!


9

<< Попередня Наступна >>

Завдяки спільноті PPCG, Санта встиг сортувати свої подарунки у правильному порядку для переїзду на транспортний док. На жаль, знаки транспортного дока розбиті, тому він не знає, де поставити всі подарунки! Всі подарунки згруповані разом, а не за їх асортиментом, що Санта визнає, що це було б кращою ідеєю.

Тепер, з огляду на подання у відсортованому порядку, визначте всі можливі конфігурації мінімального діапазону, які призвели б до того, що даний час буде в правильному порядку. Тобто знайдіть усі конфігурації мінімального діапазону такі, що сортування подарунків за алгоритмом у виклику №5 не змінило б порядок.

Виклик

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

Завдання полягає у пошуку всіх можливих конфігурацій мінімального діапазону, які застосовуватимуться до теперішніх розмірів. Візьмемо приклад:[3, 1, 2, 5, 4, 7, 6]

Існує тривіальний випадок, який повинен приймати діапазон всієї наявної конфігурації. У цьому випадку [[1, 7]]було б рішення.

Для прикладів з унікальними елементами був би інший тривіальний випадок [[3], [1], [2], [5], [4], [7], [6]](оскільки діапазони не потрібно впорядковувати).

На цьому прикладі ми також бачимо, що [[1, 3], [4, 7]]і [[1, 3], [4, 5], [6, 7]]буде працювати, як і [[1, 3], [5], [4], [6, 7]]і [[1, 3], [4, 5], [7], [6]].

Остаточною відповіддю [3, 1, 2, 5, 4, 7, 6]буде [[[3], [1], [2], [5], [4], [7], [6]], [[3], [1], [2], [5], [4], [6, 7]], [[3], [1], [2], [4, 5], [7], [6]], [[3], [1], [2], [4, 5], [6, 7]], [[3], [1], [2], [4, 7]], [[3], [1, 2], [5], [4], [7], [6]], [[3], [1, 2], [5], [4], [6, 7]], [[3], [1, 2], [4, 5], [7], [6]], [[3], [1, 2], [4, 5], [6, 7]], [[3], [1, 2], [4, 7]], [[1, 3], [5], [4], [7], [6]], [[1, 3], [5], [4], [6, 7]], [[1, 3], [4, 5], [7], [6]], [[1, 3], [4, 5], [6, 7]], [[1, 3], [4, 7]], [[1, 5], [7], [6]], [[1, 5], [6, 7]], [[1, 7]]].

Технічні характеристики форматування

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

Кожен діапазон у вашому виході (який знаходиться на другому шарі) може бути представлений як [min, max], [num]якщо це одноцільовий діапазон, або як весь діапазон, але ваш вихідний формат повинен відповідати. Будь ласка, вкажіть, чи бажаєте ви використовувати дещо інший розумний формат виводу.

Дублюючі значення повинні бути охоплені одним діапазоном у висновку; тобто жоден два діапазони на виході не можуть мати перекриття.

Ваше рішення може повертати діапазони в будь-якому порядку, і це не повинно бути детермінованим.

Правила

  • Застосовуються стандартні лазівки
  • Це є тому виграє найкоротша відповідь у байтах
  • Відповідь не буде прийнято

Тест для списку з повторюваними елементами:

2 3 2 4 -> [[[2, 3], [4]], [[2, 4]]]

Довідкова реалізація

Заголовок - посилання.

Примітка: Натхнення для цієї серії викликів я черпав з Advent Of Code . Я не маю приналежності до цього сайту

Ви можете переглянути список усіх викликів у серії, переглянувши розділ "Пов'язані" першого виклику тут .

Щасливого гольфу!

Відповіді:



3

Брахілог , 17 16 байт

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ

Працює і за списками з дублікатами. Діапазони представлені списками елементів, які вони містять. Спробуйте в Інтернеті!

Пояснення

Ідея полягає в тому, щоб розбити список на блоки та перетворити блоки на діапазони, а потім переконатися, що вони не перетинаються.

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ  Input is a list.
{             }ᶠ  Compute all possible outputs for this predicate:
 ~c                Break the list into contiguous blocks.
   ⟨    ⟩ᵐ         For each block,
    ⌋  ⌉           take its minimum and maximum,
     ⟦₂            and create the range between them.
          .        This is the output.
           c       Also, if you concatenate the output,
            ≠      its elements are distinct.
             ∧     Prevent the interpreter from thinking this is also the output.

1

JavaScript (ES6), 166 164 байт

Редагувати: оновлена ​​версія, яка тепер підтримує дублікати

Виводить результати безпосередньо на консоль у форматі [min, max] .

f=(a,r=[],l=0)=>a[l++]?f([...a],r,l,f(a,[...r,[Math.min(...x=a.splice(0,l)),Math.max(...x)]])):a[0]|r.some(([x,y],i)=>r.some(([z])=>i--&&z>=x&z<=y))||console.log(r)

Тестові справи


0

Пітон 2 , 179 байт

lambda l:[l for l in[[range(min(x),max(x)+1)for x in P]for P in p(l)]if len(sum(l,[]))==len(set(sum(l,[])))]
p=lambda l:[[l[:i]]+a for i in range(1,len(l))for a in p(l[i:])]+[[l]]

Спробуйте в Інтернеті!

Виводить список повних діапазонів.

Сильно натхненний еталонною реалізацією.

Будує всі розділи, а потім діапазони min / max для кожного розділу. Список діапазонів є дійсним, якщо жодне значення в списку не відображається більше одного разу.


sum(l,[]) вирівнює список списків і дозволяє перевірити наявність дублікатів:

l=[[1, 2], [2, 3]]
sum(l,[]) = [1,2,2,3]
len([1,2,2,3] == len(set([1,2,2,3]))  -> False (duplicates)

0

Pyth , 17 байт

f{IsTmm}hSkeSkd./

Спробуйте тут!

Зараз це набагато краще. Виводить цілі діапазони. Перегляньте історію редагування попередньої версії (з приголомшливими 31 байтами).

Як це працює

f {IsTmm} hSkeSkd./ ~> Повна програма.

               ./ ~> Список розділів.
     m ~> Карта за допомогою змінної d.
      md ~> Відображення на d за допомогою змінної k.
        hSk ~> Мінімум k.
           eSk ~> Максимум k.
       } ~> Включений цілий діапазон.
f ~> Фільтр цих ...
   sT ~> Що при сплющенні,
 {I ~> Інваріантний щодо дедуплікації.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.