创建一个独特的可解决填字游戏……毫无头绪


21

您能想象没有任何线索解决《纽约时报》填字游戏吗?也许不是所有的创造力以及现代填字游戏中出现的新单词和短语,但是有了固定的单词列表,人们还是有希望的。在此挑战中,您将创建一个填字游戏拼图网格,在理论上这是可能的。

挑战

最大化白色和黑色底纹的15x15填字游戏网格中的白色方块数量,以使白色方块可以唯一地填充字母,以便每个跨字和向下的单词都出现在国际拼字游戏单词列表中。

网格构造说明

在美国报纸中,通常会构造填字游戏网格,以使每个字母都被“选中”,这意味着它既是“跨字”又是“下”字的一部分。在英国和其他地方(尤其是在隐秘的填字游戏中),情况并非一定如此:如果“ across”或“ down”单词仅是一个字母,则不必是实际单词(例如“ A”或“ I” ”)。对于此挑战,请遵循更为宽松的规则:单字母单词不必出现在单词列表中。

还有其他各种传统(在美国和其他地方),在此挑战中无需遵循任何传统。例如,单词只能是两个字母长,单词可以重复,并且网格不必具有(旋转)对称性。

这有可能吗?

是! 可以编写一个简短的脚本来验证左侧空白网格的唯一解决方案是右侧填充的网格:

15x15网格,四个15个字母的单词的第四个和第五个字母交叉

可以用计算机可读格式显示填充的网格,如下所示:

###CH##########
###YE##########
###AM##########
CYANOCOBALAMINE
HEMOCHROMATOSES
###CH##########
###OR##########
###BO##########
###AM##########
###LA##########
###AT##########
###MO##########
###IS##########
###NE##########
###ES##########

您的解决方案

上面的网格在15x15网格的225个正方形中共有56个白色正方形。这是此挑战的基准。带有较少白色方块的网格也可能由于其得分以外的原因而引起人们的兴趣,例如,如果它们满足上述某些美学传统,则可能会很有意思。

请以与上述计算机可读基准相同的格式提交解决方案。请包含验证您的网格是否有独特解决方案的代码。

有趣的代码片段(例如,搜索可能的空间)和有关如何找到网格的讨论将受到赞赏。

单词表

国际拼字游戏词清单以前被称为SOWPODS,现在被称为Collins拼字游戏词(CSW)。大多数国家(尤其是美国)都使用它。我们更喜欢使用此列表,因为它包含英式拼写,并且通常比美国单词列表包含很多单词。此列表有多个版本,略有不同。你可以找到不同版本的名单,从维基百科的链接,在Github上,在彼得·诺维格的自然语言语料库和其他地方,还经常被称为“SOWPODS”。

这一挑战对单词表选择的广泛性质高度敏感,而对较小的细节则不那么敏感。例如,上面的基准示例适用于任何版本的CSW,但CH不是American Scrabble单词列表中的单词。如果出现差异,我们更喜欢使用CSW的最新版本CSW19。(如果使用今年发布的此列表,则可以预期此挑战的答案将更有效)。您可以在Scrabble单词查找器官方网站上以交互方式查询此列表,也可以从Board&Card Games Stack ExchangeReddit的r / scrabble下载该列表(以及上一版本的CSW15)。

Tldr:在Board&Card Games Stack Exchange上,可以通过纯文本文件(279,496个单词,每行一个)获得此挑战的权威单词列表。

进一步讨论

在早期的答案和评论中提出的一个问题是为什么现有的填字游戏(例如,在NYT中)不回答这个问题。具体而言,已发布的NYT填字游戏的最少黑色正方形(因此最多的白方块)记录已经是填字游戏中最著名的记录。为什么我们不能使用记录网格?有几个问题:

  • NYT填字游戏中的许多答案未出现在我们的单词列表中。例如,记录网格包括PEPCID(商标名称),APASSAGETOINDIA(电影和小说的四个字专有名称,没有空格书写)和STE(“ Sainte”的缩写)。似乎记录网格无法用拼字游戏单词解决。

  • 仅将单词列表扩展为包含更多单词并不一定能解决这一难题:即使记录网格中的所有单词都出现在我们的单词列表中,如果没有线索,解决方案也不是唯一的。通常可以在答案的末尾更改一些字母,同时保留所有单词。(例如,底部最右边的字母可以从改变D到的R)。事实上,这是(人类)施工过程中部分写入一个字谜时,试图获得“好”字。

    普通填字游戏(通常)具有独特解决方案的原因是,这些线索有助于缩小正确答案的范围。如果您只是尝试在使用提示的情况下用单词填充网格,则可能要么没有可能性,要么就有很多可能性。这是同一网格(在NYT中相对频繁使用的一种)的三种不同填充(使用此挑战的单词列表!)的示例:

NYT最常见的填字游戏网格,以三种不同的方式填充了Scrabble单词。

  • 评论中提出的另一个问题是,有些人难以置信,这个问题是编码方面的挑战。也许目前还不清楚,但是很难找到一个有效的答案来应对这一挑战。查找上述基准涉及多个不能保证找到答案的特制搜索程序。如果您想在合理的时间内得到答案,我个人甚至都不知道解决任意网格的一般方法。现有的填字游戏构建程序可以提供帮助,但我认为(也许是错误地)它们实际上并未完全搜索各种可能性。(我在上面的三个并排网格中使用了这样的程序;之所以起作用,是因为该特定网格允许许多解决方案。)

2
:与此相关的一般类型的问题元后codegolf.meta.stackexchange.com/questions/18117/...
A.雷克斯

3
1.放弃美观选项(“ Grids with fewer white squares may also be interesting for reasons other than their score, for example if they satisfy some of the aesthetic traditions mentioned above.”)-与避免在代码高尔夫中获得奖励类似,我宁愿代码挑战仅是一回事。这意味着所有答案都可以按喜欢进行比较。它还清楚地表明了目标,这将有助于重新投票。
trichoplax

4
2.选择一个单词列表,并坚持所有答案。tldr提到了权威的词汇表,但是事先进行的讨论可能会使人们认为他们可以选择其中提到的任何一个。这可能有助于将严格的要求保持在职位顶部附近,并非常清楚地表明其他细节不是挑战说明的一部分。理想情况下,请省略任何多余的规范,以使文章简短明了。
trichoplax

2
3.使包含用于找到解决方案的代码成为对有效答案的要求。
trichoplax

3
人们可以在聊天室中讨论方法,这是一种挑战。如果您设置了聊天室并从规范的末尾链接到该聊天室,则可以在此处发布讨论作为初始帖子,并在挑战中将此内容提及给想要了解更多信息的人。
trichoplax

Answers:


9

180个白色方块

空白格 解

我的策略只是找到一个没有黑色正方形的较小矩形,以便可以唯一地填充它。所有2×k矩形都有多种解决方案。对于3×k矩形,k在3到14之间有多种解决方案,但是对于,只有一种解决方案k=15

然后,我将4个这样的矩形放入网格中。这意味着每个单词在解决方案中出现4次,通常在填字游戏构造中会被皱眉,但对于此挑战来说,这是可以接受的。另一方面,此解决方案同时具有左/右和上/下对称性!

计算机可读网格:

HETERONORMATIVE
OVEROPINIONATED
POSSESSEDNESSES
###############
HETERONORMATIVE
OVEROPINIONATED
POSSESSEDNESSES
###############
HETERONORMATIVE
OVEROPINIONATED
POSSESSEDNESSES
###############
HETERONORMATIVE
OVEROPINIONATED
POSSESSEDNESSES

这是我用来查找给定网格大小的所有解决方案的R代码。15个字母的单词的所有三重循环太慢。相反,我尝试用

  • 设置前两列(两个3个字母的单词)
  • 然后遍历所有15个字母的单词,这些单词从现在已经确定的前两个字母开始。
  • 对于15个字母的单词的每个可能选择,然后验证是否生成的所有3个字母的单词都在字典中。

例如,对于最后的溶液中,代码首先放入HOPEVO,然后完成到HETERNORMATIVEOVEROPINIONATEDPOSSESSEDNESSES,最后核实了所有3个字母的字(HOPEVOTESERSROEOPSNISONERIDMONANETASITSVEEEDS)。

R代码

library(fastmatch)
f = "scrabble-wordlist.txt"
d = read.table(f, skip=2, as.is=T, na.strings=NULL)

d$l = apply(d, 2, nchar)
d3 = d[d$l==3, 1]

sp = function(s) strsplit(s, "")[[1]]
cm = function(v) paste0(v, collapse="")
d3s = sapply(d3, sp)

f3 = function(l){
  m = matrix("", 3, l)

  md = sapply(d[d$l == l, 1], sp)
  nf = 0

  a1 = seq(1, 3*l, by=3); a2 = a1 + 1; a3 = a1 + 2

  for(i in 1:ncol(d3s)){
    m[, 1] = d3s[, i]

    id1 = as.matrix(md[, md[1, ] == m[1, 1]])
    id2 = as.matrix(md[, md[1, ] == m[2, 1]])
    id3 = as.matrix(md[, md[1, ] == m[3, 1]])

    if(any(ncol(id1) == 0, ncol(id2) == 0, ncol(id3) == 0)) next

    for(j in 1:ncol(d3s)){
      m[, 2] = d3s[, j]

      jd1 = as.matrix(id1[, id1[2, ] == m[1, 2]])
      jd2 = as.matrix(id2[, id2[2, ] == m[2, 2]])
      jd3 = as.matrix(id3[, id3[2, ] == m[3, 2]])

      if(any(ncol(jd1) == 0, ncol(jd2) == 0, ncol(jd3) == 0)) next

      for(k1 in 1:ncol(jd1)){
        m[1, ] = jd1[, k1]

        for(k2 in 1:ncol(jd2)){
          m[2, ] = jd2[, k2]

          for(k3 in 1:ncol(jd3)){
            m[3, ] = jd3[, k3]

            w = paste0(m[a1], m[a2], m[a3])
            if(all(w %fin% d3)){
              nf = nf + 1
              print(m)
            }
            if(nf >= 2){
              print(c(l, nf))
              return()
            }
          }
        }
      }
    }
  }

  return(nf)
}

称为f3(15)。在我的个人计算机上花了几个小时。


@downvoter你能发表评论吗?
罗宾·赖德

我的回答也被否决了。🤷
A.雷克斯

1

182个白色方块

四个3x15区域由另外两个白色正方形连接。

受到罗宾·赖德Robin Ryder)的回答的启发,我试图挤进更多的白色正方形。我相信该解决方案是独一无二的,因此我将很快发布相应的验证码。

计算机可读网格:

HETERONORMATIVE
OVEROPINIONATED
POSSESSEDNESSES
B##############
INCOMMUNICATIVE
NEUROANATOMICAL
DETERMINATENESS
###############
HETERONORMATIVE
OVEROPINIONATED
POSSESSEDNESSES
B##############
INCOMMUNICATIVE
NEUROANATOMICAL
DETERMINATENESS

184因为moncot可以与monocot一起唯一完成
Jonathan Allan

...设为“也许...”,因为我尚未验证它不会破坏整个系统的独特性!
乔纳森·艾伦

我很想知道您的验证码。我所有的验证网格的尝试都非常缓慢。
罗宾·赖德
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.