Kilitler ve anahtarlar oyunu


12

1-n numaralı n kutusu vardır . Her bir kutu kilitlenir, öyle ki sadece tek bir karşılık gelen anahtarla açılabilir ( 1-n numaralı ). Bu anahtarlar kutulara rastgele dağıtılır (bir kutuda herhangi bir sayıda anahtar olabilir, bir anahtarda herhangi bir sayıda kopya olabilir) ve sonra tüm kutular kapatılır. Kutuların çoğunda da bir hazine ( 0 numaralı ) kilitlendi.

Tüm hazineyi almak için bir çilingir kiraladınız. Açtığı her kutu için ücret alıyor. Anahtarın zaten mevcut olduğu bir kutuyu açmak için herhangi bir ücret alınmaz.

Girdi, her kutunun içeriğidir. Girişin biçimine karar verebilirsiniz.

Hazineleri elde etmek için gereken minimum maliyeti çıktılayın.

notlar

  1. Algoritmanız uzun sürebilir, ancak bu önemsizdir.
  2. En kısa kod kazanır.
  3. Geçersiz girdi hakkında endişelenmenize gerek yok.

Örnek veri

Burada i satırı , kutu i'de bulunan anahtarları temsil eder .

Giriş

2 0
3
4 0
5 6 0
6
0

Çıktı

1

Giriş

2 0
3 0

4 0
6
5 0

Çıktı

3

Giriş

2 4 0
3 0

1 0
6
5 0

Çıktı

2

Giriş

1
3 4


2 6
5

Çıktı

0

2
Bu belki de bir ilgisi var mı bu ?
Addison Crump


@VoteToClose Güzel video. Genelleştirilmiş bir algoritmadan ziyade matematiksel bir bulmaca ve spesifik bir algoritmadan bahsedilmesi dışında benzerdir.
ghosts_in_the_code

1
Bu yaklaşık 100 ahşap ve çelik kilitli kutu bu bulmaca ile ilgili görünüyor: puzzling.stackexchange.com/q/17852/4551
xnor

4
@ghosts_in_the_code Basitlikle değil esneklikle ilgili. Genellikle, yapılandırılmış girdi gerektiren zorluklar, veriler önceden işlenmediği sürece herhangi bir uygun liste formatına izin verir. Dile bağlı olarak, sizin gibi bir boşlukla ayrılmış dosya anlamına gelebilir, ya [[1] [3 4] [] [] [2 6] [5]]da belki ya da belki anlamına gelebilir {{1},{3,4},{},{},{2,6},{5}}. Bu şekilde, çoğu dil girdiyi önemsiz bir şeye okumayı azaltabilir i=eval(read())ve zorluğun eğlenceli kısmına odaklanabilir.
Martin Ender

Yanıtlar:


6

CJam, 59 52 50 49 45 43 42 bayt

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

@ BayBüttner'e 3 bayt golf oynadığınız ve 4 yol daha açtığınız için teşekkürler!

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

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 anlayışının armağanı olmadan bize bir açıklama ekleyebilir misiniz? : D Bunun nasıl çalıştığını bilmek istiyorum.
Addison Crump

2
@VoteToClose Şuraya bak CJAM101
user41805

array long &eserler, bu nedenle kaldırabilirsiniz adan 0a&. Ne yazık ki bu sizi yakalamayı biraz zorlaştırıyor.
Peter Taylor

Ben değiştirirseniz @PeterTaylor Maalesef 0a&ile 0&, ben de değiştirmek zorunda 0+ile 0aa+beri, 0 0&falsy olduğunu.
Dennis

@VoteToClose Cevabımı düzenledim.
Dennis

2

CJam (53 bayt)

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

Bu, çevrimiçi tercüman için oldukça yavaştır.

teşrih

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 spaceProgramınızla birlikte geldim .
Zaman

@ qumonio, özellikle ölçeklenebilir değil. Soruda test girişlerinden daha büyük girişlerle test etmedim, bu yüzden standart 1GB yığınında ne kadar ileri gidebileceğinden emin değilim.
Peter Taylor

Burada JS bir dizi olarak gösterilen 6 satır deniyordu: [ [4,0], [1,3,4], [0], [6,0], [3,0], [5]]tabii ki orijinal yazı gösterildiği gibi giriş tarzı ile.
Zaman

@ qumonio, bilgisayarımda bu girdiyi varsayılan olarak olduğundan daha az olan yalnızca 128MB yığın ile işler.
Peter Taylor

0

Haskell, 173 bayt

l Aramak istediğin kişi.

Ben Mapyerine ( [(Int,[Int])]yerine [[Int]]) sözde kullanmamalı emin değilim .

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.