锁和钥匙游戏


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
这也许与有关吗?
艾迪生·克伦普


@VoteToClose不错的视频。相似之处在于它只讨论数学难题和特定算法,而不是通用算法。
ghosts_in_the_code 2015年

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())并专注于挑战的有趣部分。
Martin Ender 2015年

Answers:


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
user41805

array long &作品中,这样你就可以删除a0a&。可悲的是,这使您很难被抓住。
彼得·泰勒

@PeterTaylor不幸的是,如果我替换0a&0&,我也必须替换0+0aa+,因为这0 0&很虚假。
丹尼斯

@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,它不是特别可扩展。我没有用比问题中的测试输入大的输入来测试它,所以我不确定它在标准1GB堆上可以走多远。
彼得·泰勒

我正在尝试将6行显示为JS中的数组:[ [4,0], [1,3,4], [0], [6,0], [3,0], [5]]当然使用原始帖子中所示的输入样式。
扎曼

@qumonio,在我的计算机上,它仅使用128MB的堆就可以很好地处理输入,这比默认情况下要少。
彼得·泰勒

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.