Gra zamków i kluczy

12

Jest n pól, ponumerowanych 1-n . Każde pudełko jest zablokowane, tak że można je otworzyć tylko jednym odpowiednim typem klucza (również ponumerowanym 1-n ). Te klucze są losowo rozrzucone w polach (jedno pole może mieć dowolną liczbę kluczy, jeden klucz może mieć dowolną liczbę duplikatów), a następnie wszystkie pola są zamykane. Skarb (numer 0 ) został również zamknięty w wielu skrzyniach.

Zatrudniłeś ślusarza, aby odzyskał cały skarb. Opłaca za każde pęknięte przez siebie pudełko. Nie ma opłaty za otwarcie skrzynki, dla której klucz jest już dostępny.

Dane wejściowe to zawartość każdego pola. Możesz zdecydować o formacie wejścia.

Wydaj minimalny koszt wymagany do zdobycia skarbów.

Notatki

  1. Twój algorytm może zająć dużo czasu, ale nie ma to znaczenia.
  2. Najkrótszy kod wygrywa.
  3. Nie musisz się martwić o nieprawidłowe dane wejściowe.

Przykładowe dane

Tutaj wiersz i reprezentuje klucze obecne w polu i .

Wejście

2 0
3
4 0
5 6 0
6
0

Wynik

1

Wejście

2 0
3 0

4 0
6
5 0

Wynik

3

Wejście

2 4 0
3 0

1 0
6
5 0

Wynik

2

Wejście

1
3 4


2 6
5

Wynik

0
ghosts_in_the_code
źródło
2
Jest to prawdopodobnie związane z tym ?
Addison Crump,
Związane również: puzzling.stackexchange.com/questions/23150/...
Leif Willerts
@VoteToClose Ładne wideo. Jest podobny, tyle że mówi o matematycznej łamigłówce i specyficznym algorytmie, a nie o uogólnieniu.
ghosts_in_the_code
1
To wydaje się podobne do tej układanki około 100 zamkniętych pudełkach z drewna i stali: puzzling.stackexchange.com/q/17852/4551
XNOR
4
@ghosts_in_the_code Nie chodzi o prostotę, ale o elastyczność. Zwykle wyzwania wymagające uporządkowanego wprowadzania pozwalają na dowolny dogodny format listy, o ile dane nie są wstępnie przetwarzane. W zależności od języka, który może oznaczać plik oddzielony spacjami, taki jak Ty, może to oznaczać [[1] [3 4] [] [] [2 6] [5]]lub być może {{1},{3,4},{},{},{2,6},{5}}. W ten sposób większość języków może ograniczyć czytanie wkładu do czegoś tak trywialnego, jak i=eval(read())i skupić się na zabawnej części wyzwania.
Martin Ender,

Odpowiedzi:

6

CJam, 59 52 50 49 45 43 42 bajtów

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

Dzięki @ MartinBüttner za grę w golfa z 3 bajtów i torowanie drogi dla 4 kolejnych!

Wypróbuj online w interpretatorze CJam .

Jak to działa

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.
Dennis
źródło
2
Czy mógłbyś dodać wyjaśnienie dla nas bez zrozumienia CJam? : D Chciałbym wiedzieć, jak to działa.
Addison Crump,
2
@VoteToClose Spójrz na to CJAM101
user41805
array long &działa, więc możesz usunąć az 0a&. Niestety utrudnia to złapanie cię.
Peter Taylor,
@PeterTaylor Niestety, jeśli zastąpi 0a&się 0&, ja też muszę wymienić 0+z 0aa+, ponieważ 0 0&jest falsy.
Dennis
@VoteToClose Zredagowałem swoją odpowiedź.
Dennis
2

CJam (53 bajty)

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

Jest to zbyt wolne dla tłumacza online.

Sekcja

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
Peter Taylor
źródło
Otrzymałem java.lang.OutOfMemoryError: Java heap spacez twoim programem.
ŽaMan,
@ qumonio, nie jest szczególnie skalowalny. Nie testowałem go z wejściami większymi niż wejścia testowe w pytaniu, więc nie jestem pewien, jak daleko może zajść na standardowej sterty 1 GB.
Peter Taylor,
Próbowałem tutaj 6 linii pokazanej jako tablica w JS: [ [4,0], [1,3,4], [0], [6,0], [3,0], [5]]oczywiście ze stylem wprowadzania pokazanym w oryginalnym poście.
ŽaMan,
@ qumonio, na moim komputerze dobrze radzi sobie z tym wejściem, mając tylko 128 MB sterty, czyli mniej niż ma domyślnie.
Peter Taylor
0

Haskell, 173 bajtów

l to ten, do którego chcesz zadzwonić.

Nie jestem pewien, czy nie powinienem używać pseudo- Mapzamiast ( [(Int,[Int])]zamiast [[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)
Leif Willerts
źródło