检查15个拼图是否可解决


9

十五谜题的特别之处在于只有一半安排的可能的状态是可以解决的。如果翻转14和15瓦片,则无法滑动块以使其向后翻转。

您的任务是构建一个程序,该程序接受您选择的格式的整数列表(恰好包含从0到15的每个数字的一​​个实例,其中0为空白)代表瓦片中的排列状态。 4x4网格,并输出一个布尔值,确定该网格是否可求解。

以任何语言执行此操作的最短代码都会胜出。


好问题:)
Cruncher

我本来要问这个问题,但是边长是任意的。但这几乎没有增加挑战。
乔纳森·艾伦,

Answers:


0

果冻,9 个字节

Œc>/€;TSḂ

一个Monadic链接,它接受一个以行优先顺序读取的整数列表,在左右和左右之间交替,0如果可溶和1不可溶,则产生(将其反¬加到代码的右边)。

在线尝试!(此示例是一个仅需滑入12个位置的板)

怎么样?

John Dvorak的答案类似,我们计算奇偶校验并利用类似蛇的输入顺序来简化棋盘格奇偶校验,尽管不是检查奇偶校验是否相等,而是将无序计数与非零索引求和,并测试是否奇:

Œc>/€;TSḂ - Link: list of integers
Œc        - unordered pairs
    €     - for each:
   /      -   reduce with:
  >       -     greater than?
      T   - truthy indices (i.e. [1..16] without 1-indexed index of 0)
     ;    - concatenate
       S  - sum
        Ḃ - is odd?

4

J,28个字符

((C.!.2=_1^i.&0)&.".&.stdin''

输入顺序是主要行,行在表的单个路径中从左到右和从右到左交替读取。假设零属于左上角。

在Windows上的用法:

<nul set /p="0 1 2 3 7 6 5 4 8 9 10 11 15 14 13 12" | jconsole c:\...\15.jhs

说明:

  • <nul set /p=用于防止输入中的换行符echo产生".不喜欢的字符。当然,Unix支持echo /n
  • v&.".&.stdin''读为“输入,然后解析输入,然后执行v,然后撤消解析(=格式),然后撤消输入(=输出)”,表示“在stdin下的v under parse下的v”。1!:1]3是短一个字符,但没有定义的逆数。
  • C.!.2表示“排列奇偶校验”。它返回1(偶校验)或_1(奇校验)。那是,_1^inversions
  • _1^i.&0 表示“ -1等于索引0的幂”。
  • 因此,C.!.2=_1^i.&0意味着“置换奇偶性等于孔位置奇偶性吗?”

这适用于4x4电路板,但是如果所需的最终位置从左到右是行主要的,则求解位置的置换具有奇数个反转,因此奇数奇偶校验。同样,当所需的孔位置从左上移到右下时,奇偶校验反转(对于任何输入顺序)。在两种情况下,解决方法都是一个字符:在-后面添加=以反转期望的奇偶校验。

正确性证明:

每次移动后,零都将与某个数字交换位置,从而翻转排列奇偶校验。零还在白色和黑色棋盘格位置之间交替,由输入顺序中的奇数和偶数位置指示。因此,该条件是必要的。用计数论证也足够了:众所周知,正好一半的职位是可以解决的。这种情况会过滤掉可能位置的一半。


当您说“零也在奇数和偶数位置之间交替出现”时:它不是按+ 1,-1,+ 4或-4来变化吗?我认为格子图案可以提供您所需的颜色,但可以更准确地描述它。
彼得·泰勒

@PeterTaylor你是对的;抱歉。我的编辑是否算作有效修正?
John Dvorak 2013年

我认为您的修改解决了一个完全独立的问题。我引用的是最后一段。
彼得·泰勒

“在奇数和偶数位置之间”更像是“在棋盘上的黑白正方形之间”。
Joe Z.
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.