Гра в замки та ключі


12

Є n ящиків, пронумерованих 1-n . Кожен ящик заблокований таким чином, що його можна відкрити лише одним відповідним типом ключа (також пронумерованим 1-n ). Ці клавіші випадковим чином розкидані по полях (один ящик може мати будь-яку кількість клавіш, один ключ може мати будь-яку кількість дублікатів), а потім усі поля закриваються. Скарб (пронумерований 0 ) також був заблокований у багатьох скриньках.

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

Введення - це вміст кожного поля. Ви можете визначити формат введення.

Виведіть мінімальну вартість, необхідну для отримання скарбів.

Примітки

  1. Ваш алгоритм може зайняти багато часу, але це не має значення.
  2. Найкоротший код виграє.
  3. Недійсні введення не потрібно.

Зразок даних

Тут рядок i представляє ключі, наявні у вікні i .

Вхідні дані

2 0
3
4 0
5 6 0
6
0

Вихідні дані

1

Вхідні дані

2 0
3 0

4 0
6
5 0

Вихідні дані

3

Вхідні дані

2 4 0
3 0

1 0
6
5 0

Вихідні дані

2

Вхідні дані

1
3 4


2 6
5

Вихідні дані

0

2
Це, можливо, пов’язано з цим ?
Аддісон Кримп

Крім того, пов'язані з : puzzling.stackexchange.com/questions/23150 / ...
Leif Willerts

@VoteToClose Приємне відео. Це схоже, за винятком того, що в ньому йдеться про математичну загадку та конкретний алгоритм, а не про узагальнену.
ghosts_in_the_code

1
Здається, пов’язано з цією головоломкою про 100 замкнених ящиків з дерева та сталі: puzzling.stackexchange.com/q/17852/4551
xnor

4
@ghosts_in_the_code Йдеться не про простоту, а про гнучкість. Зазвичай виклики, що потребують структурованого введення, дозволяють будь-який зручний формат списку, доки дані не будуть попередньо оброблені. В залежності від мови , який може означати пробільні відокремлений файл , як у вас є, або це може означати , [[1] [3 4] [] [] [2 6] [5]]або , може бути {{1},{3,4},{},{},{2,6},{5}}. Таким чином, більшість мов може звести читання вступу до чогось такого тривіального, як i=eval(read())і зосередитись на цікавій частині виклику.
Мартін Ендер

Відповіді:


6

CJam, 59 52 50 49 45 43 42 байт

qN/ee::~e!{_0+{0a&}#>W%_{1$|(z@-},,\;}%:e<

Дякуємо @ MartinBüttner за те, що виграли 3 байти і проклали шлях ще на 4!

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

qN/      e# Read all input and split it at linefeeds.
ee       e# Enumerate the lines.
         e# STACK: [[0 "i0 i1 ..."] [1 "j0 j1 ..."] ...]
::~      e# Apply ~ (bitwise NOT/evaluate) to each item of the pairs.
         e# STACK: [[-1 i0 i1 ...] [-2 j0 j1 ...] ...]
e!       e# Push all unique permutations of the resulting array.
{        e# For each permutation:
  _0+    e#   Push a copy and append 0 to it.
  {0a&}# e#   Find the first index of an element that contains 0.
  >      e#   Discard all previous elements of the array.
  W%     e#   Reverse the resulting array.
         e#   We now have a (partial) permutation that contains
         e#   all treasures and ends with a treasure.
  _      e#   Push a copy. The original (which contains lists, but no 
              numbers) will serve as accumulator.
  {      e#   Filter; for each list in the array:
    1$|  e#     Push a copy of the accumulator and perform set union.
    (    e#     Shift out the first element (bitwise NOT of 0-based index).
    z    e#     Apply absolute value to push the 1-based index.
    @-   e#     Perform set difference with the former state of the 
         e#     accumulator. This pushes an empty list iff the 1-based
         e#     index was already in the accumulator, i.e., iff we already
         e#     had a key.
  },     e#   Keep the element if we did not have the key.
  ,      e#   Count the kept elements.
  \;     e#   Discard the accumulator from the stack.
}%       e#
:e<      e# Get the minimum of all results.

2
Не могли б ви додати пояснення для нас без подарунка CJam? : D Я хотів би знати, як це працює.
Аддісон Кримп

2
@VoteToClose Подивіться на цей CJAM101
користувач41805

array long &працює, тому ви можете видалити aз 0a&. На жаль, це робить вас трохи важче зловити вас.
Пітер Тейлор

@PeterTaylor На жаль, якщо я заміню 0a&з 0&, я також повинен замінити 0+з 0aa+, так як 0 0&це falsy.
Денніс

@VoteToClose Я відредагував свою відповідь.
Денніс

2

CJam (53 байти)

Nq+N/:a::~:A,_m*_.&{,}$_{{_Af=e_|}:PA,*A,,^0-P0&!}#=,

Це досить повільно для онлайн-перекладача.

Розсічення

Nq+N/:a::~:A      e# Parse the input into arrays and store in A
,_m*_.&           e# Generate (with duplicates) a powerset of [0 1 ... n]
{,}$              e# Sort by size
_{                e# Create a copy and search for first index satisfying...
  {_Af=e_|}:P     e#   Store in P a block which does a reachability expansion
  A,*             e#   Apply it n times (no path can be longer than n)
  A,,^0-          e#   Invert to get the unreached nodes (except 0)
  P               e#   Apply P again to see what's reached from the unreached nodes
  0&!             e#   Check that it doesn't include [0]
}#
=,                e# Look up the powerset element at that index and find length

Я отримав java.lang.OutOfMemoryError: Java heap spaceразом із вашою програмою.
ЖаМан

@qumonio, це не особливо масштабовано. Я не перевіряв його на входах, більших, ніж тестові входи у питанні, тому я не впевнений, наскільки далеко він може пройти на стандартній купі 1 ГБ.
Пітер Тейлор

Я намагався 6 рядок, показаний тут як масив у JS: [ [4,0], [1,3,4], [0], [6,0], [3,0], [5]]звичайно зі стилем введення, як показано в оригінальній публікації.
Жаман

@qumonio, на моєму комп’ютері він обробляє цей вхід штрафом лише з 128 МБ купи, що менше, ніж за замовчуванням.
Пітер Тейлор

0

Haskell, 173 байт

l це той, кого ти хочеш подзвонити.

Не впевнений, чи слід використовувати Mapзамість нього псевдо- ( [(Int,[Int])]замість [[Int]]).

l=o[].map(map read).map words.lines
o[]b|0`notElem`concat b=0|0<1=1+minimum[o[n]b|n<-[1..length b],b!!(n-1)/=[]]
o(n:k)b=o(filter(/=0)(k++b!!(n-1)))(take(n-1)b++[]:drop n b)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.