填字游戏强迫!


14

克里斯,一个神秘的填字游戏瘾君子,针对其解决顺序有一套固定的算法。

在此处输入图片说明

我们将使用以上图像作为指导。

  1. 克里斯总是从第一个交叉线索开始,在这种情况下是1 Across。克里斯是一位能力强的填字游戏爱好者,因此假设他将始终知道他正在研究的线索的答案。
  2. 克里斯完成一个线索后,他将检查与已完成的线索相邻的所有线索(在第一种情况下为1 Down,2 Down和3 Down),然后以最低编号完成该线索。如果没有相邻的线索,他将转到步骤3。
  3. 如果线索使下一个数字(如步骤3中所述)同时具有交叉线索和向下线索,则他将首先完成跨线索(确定性为100%,这在OCD上是边界!)。
  4. 如果没有相邻的线索,他将转到下一个数字上的下一个可用线索(交叉或向下)
  5. 从第2步重复进行,直到完成所有线索。

亲爱的程序员,这就是您的责任所在。您的任务是创建代码,该代码可以在提供了填字游戏模板后,根据Chris解决问题的算法提供描述线索顺序的输出。

该代码将接受填字游戏模板的输入,其形式为.代表白色正方形和#代表黑色正方形。

范例

.....#.........
.#.#.#.#.#.#.#.
...#...#.......
.#.#.#.#.#.#.#.
....#..........
##.#.#.#.#.#.#.
......#........
.###.#####.###.
........#......
.#.#.#.#.#.#.##
..........#....
.#.#.#.#.#.#.#.
.......#...#...
.#.#.#.#.#.#.#.
.........#.....

输入可以通过以下方式进行:a)读取填字游戏的表示形式的文件,或b)填字游戏的每一行的行输入,后跟\n,第二个\n指示EOF。

然后,它将根据上面描述的算法确定克里斯解决该问题的方法。

输出必须采用一系列逗号分隔的指令格式,格式为n(A|D),其中n是线索编号,其后为Afor或Ddown。

因此,在上面的示例中(来自图像和示例模板,两者是相同的),输出将是:

1A,1D,2D,3D,9A,10A,4D,5D,6D,7D,8D,11A,12A,13A,15A,14D,15D,16A,17A,18D,19D,20A,21D,23A,22D,24A,25D,27A,28A,26D,29A,30A,31A

最短的代码胜出...

测试中

您必须在提交时提供代码,字节数以及以.#格式表示的四个测试用例之一,以及从此输入生成的输出。有四个测试用例,以下三个以及上面的示例模板。

测试用例示例:

测试用例1

.....#
.#.#.#
...#..
.#.#.#
.....#
##.#..

输出: 1A,1D,2D,3D,4A,5A,6A,7A

测试案例2

.....#..
.#.##..#
.#....#.
...##.#.
.####...
......##

输出: 1A,1D,2D,5A,4D,4A,3D,3A,7A,8A,6D,9A

测试用例3

.........#
#.#.#.#.#.
....#...#.
#...#.#.#.
..###.#.#.
.#....#...
.#####...#
.....###..

输出: 1A,2D,3D,4D,5D,7A,8A,9A,10A,11A,11D,12A,13A,6D,14D,15A,16A,17A

测试案例4

.....#.........
.#.#.#.#.#.#.#.
...#...#.......
.#.#.#.#.#.#.#.
....#..........
##.#.#.#.#.#.#.
......#........
.###.#####.###.
........#......
.#.#.#.#.#.#.##
..........#....
.#.#.#.#.#.#.#.
.......#...#...
.#.#.#.#.#.#.#.
.........#.....

输出: 1A,1D,2D,3D,9A,10A,4D,4A,5D,6D,7D,8D,11A,12A,13A,15A,14D,15D,16A,17A,18D,19D,20A,21D,23A,22D,24A,25D,27A,28A,26D,29A,30A,31A

祝好运!


只需确保:在您的示例图像中,哪个数字是强制性填写的第五条线索?(在1H,1V,2V,3V之后)
belisarius博士2014年

@belisarius图像对应于第四个测试用例。因此,要填充的第五条线索将是9跨,或者按照您的说法是9H :)由于第四条线索完成后唯一的相邻线索是9和10跨,克里斯将被迫首先填充最低的线索...
WallyWest

仅根据产生正确输出的代码来考虑字节。IOW,为了使其可编译,您是否对include,C#名称空间+类+ Main等进行了惩罚,或者是否可以合理地假设,如果我使用C#或类似语言编写代码,则只需要最少的代码?
ChiefTwoPencils 2014年

1
@BobbyDigital好吧,这是代码高尔夫。我希望,如果您打算用C#编写它,那么您将尽量不要使用太多的外部函数……恐怕您必须数数它们。 。
华利·威斯特

1
@WallyWest我想您的第三个示例17A在末尾省略了一个。排在第四4A之后4D
霍华德

Answers:


5

GolfScript,154个字符

:^,,{.^=46<{;-1}*)}%[.^n?)/zip[0]*]{1,%{,1>},}%:H"AD"1/]zip{~`{1$0=H{{0=}/}%.&$?)\+[\]}+/}%(2/\{0=)[\~\]}$+[]{1${1=1$&},.!{;1$1<}*1<:F~~@|@F-\1$}do;;]','*

必须在STD​​IN上提供输入。这些示例产生以下结果(在线检查):

1A,1D,2D,3D,4A,5A,6A,7A

1A,1D,2D,5A,4D,4A,3D,3A,7A,8A,6D,9A

1A,2D,3D,4D,5D,7A,8D,9A,10A,11A,11D,12A,13A,6D,14D,15A,16A,17A

1A,1D,2D,3D,9A,10A,4D,4A,5D,6D,7D,8D,11A,12A,13A,15A,14D,15D,16A,17A,18D,19D,20A,21D,23A,22D,24A,25D,27A,28A,26D,29A,30A,31A

+1非常简洁。它是如何工作的?
DavidC

哇,感谢您明确表示我什至不应该浪费时间。显然必须要使用一种更合适的语言。votes++
ChiefTwoPencils 2014年

@BobbyDigital我的意思是不尊重。C#是一种非常冗长的语言……对于代码高尔夫来说,它可能不是最好的。代码保龄球或这里的人气比赛...但是Code Golf是鱼的新水壶。
WallyWest

这里也+1 ...可能是我见过的更长的GolfScript条目之一...做得很好。
WallyWest

1
@BobbyDigital:任务本身很有趣。试试用您熟悉的语言。我想您会和我一样喜欢拼图-研究解决拼图的所有不同方法。即使您没有达到这个答案那么低的字符数,它本身也很有趣。
霍华德

3

数学806 477

(解决方案步骤的顺序似乎出现了故障。我正在对此进行调查。)

打高尔夫球

该函数q查找填字游戏解决方案的顺序。

i = Dimensions; v = MemberQ; u = Position; y = ToString; k = Select;
q@t_ :=
 (g@p_ := Characters@StringSplit[p, "\n"];
  w = g@t;
  a[{r_, c_}, z_] := (c != i[z][[2]]) \[And] 
    v[u[z, "."], {r, c + 1}] \[And] ((c == 1) \[Or] 
      v[u[z, "#"], {r, c - 1}]);
  b@z_ := k[u[z, "."], a[#, z] &];
  d[{r_, c_}, z_] := (r != i[z][[2]]) \[And] 
    v[u[z, "."], {r + 1, c}] \[And] ((r == 1) \[Or] 
      v[u[z, "#"], {r - 1, c}]);
  e@z_ := k[u[z, "."], d[#, z] &];
  Cases[Flatten[{
       If[v[b[w], #[[1]]], y[#[[2]]] <> "A"],
       If[v[e[w], #[[1]]], y[#[[2]]] <> "D"]} & /@ (MapIndexed[List, 
        b[w] \[Union] e[w]] /. {{r_, c_}, {i_}} :> ({r, c} -> i))], 
   Except[Null]])

不打高尔夫球

q[t7_]:=
Module[{d,acrossSquareQ,acrossSquares,downSquareQ,downSquares,m,numberedCells},
(*w=g[t7];*)
g[p2_]:=Characters@StringSplit[p2,"\n"];
w=g[t7];
acrossSquareQ[{r_,c_},z_]:=(c!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r,c+1}] \[And]((c==1)\[Or]MemberQ[Position[z,"#"],{r,c-1}]);
acrossSquares[z_]:=Select[Position[z,"."],acrossSquareQ[#,z]&];
downSquareQ[{r_,c_},z_]:=(r!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r+1,c}] \[And]((r==1)\[Or]MemberQ[Position[z,"#"],{r-1,c}]);
downSquares[z_]:=Select[Position[z,"."],downSquareQ[#,z]&];
numberedCells[z_]:=acrossSquares[z]\[Union]downSquares[z];
m=MapIndexed[List,numberedCells[w]]/.{{r_?IntegerQ,c_?IntegerQ},{i_?IntegerQ}}:> ({r,c}-> i);
Cases[Flatten[{
If[MemberQ[acrossSquares[w],#[[1]]],ToString[#[[2]]]<>"A"],
If[MemberQ[downSquares[w],#[[1]]],ToString[#[[2]]]<>"D"]}&/@m],Except[Null]]]

board显示填字游戏。该代码不包括在字符计数中。q这里借用了几个子功能。

board[p_]:=
Module[{q,g,w,downSquareQ,downSquares,acrossSquareQ,acrossSquares,numberedCells,m},
downSquareQ[{r_,c_},z_]:=(r!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r+1,c}] \[And]((r==1)\[Or]MemberQ[Position[z,"#"],{r-1,c}]);
downSquares[z_]:=Select[Position[z,"."],downSquareQ[#,z]&];
acrossSquareQ[{r_,c_},z_]:=(c!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r,c+1}] \[And]((c==1)\[Or]MemberQ[Position[z,"#"],{r,c-1}]);
acrossSquares[z_]:=Select[Position[z,"."],acrossSquareQ[#,z]&];
numberedCells[z_]:=acrossSquares[z]\[Union]downSquares[z];
g[p2_]:=Characters@StringSplit[p2,"\n"];
w=g[p];
m=MapIndexed[List,numberedCells[w]]/.{{r_?IntegerQ,c_?IntegerQ},{i_?IntegerQ}}:> ({r,c}-> i);
Grid[ReplacePart[w,m],Dividers->All,Background->{None,None,(#-> Black)&/@Position[w,"#"]}]]

测试用例

1个

t1=".....#
.#.#.#
...#..
.#.#.#
.....#
##.#..";
board[t1]
q[t1]

11

{“ 1A”,“ 1D”,“ 2D”,“ 3D”,“ 4A”,“ 5A”,“ 6A”,“ 7A”}


2

t2=".....#..
.#.##..#
.#....#.
...##.#.
.####...
......##";

board[t2]
q[t2]

t2

{“ 1A”,“ 1D”,“ 2D”,“ 3A”,“ 3D”,“ 4A”,“ 4D”,“ 5A”,“ 6D”,“ 7A”,“ 8A”,“ 9A”}


3

t3=".........#
#.#.#.#.#.
....#...#.
#...#.#.#.
..###.#.#.
.#....#...
.#####...#
.....###..";

board[t3]

q[t3]

3天

{“ 1A”,“ 2D”,“ 3D”,“ 4D”,“ 5D”,“ 6D”,“ 7A”,“ 8D”,“ 9A”,“ 10A”,“ 11A”,“ 11D”,“ 12A”,“ 13A”,“ 14D”,“ 15A”,“ 16A”,“ 17A”}


4

t4=".....#.........
.#.#.#.#.#.#.#.
...#...#.......
.#.#.#.#.#.#.#.
....#..........
##.#.#.#.#.#.#.
......#........
.###.#####.###.
........#......
.#.#.#.#.#.#.##
..........#....
.#.#.#.#.#.#.#.
.......#...#...
.#.#.#.#.#.#.#.
.........#.....";

board[t4]


q[t4]

4天

{“ 1A”,“ 1D”,“ 2D”,“ 3D”,“ 4A”,“ 4D”,“ 5D”,“ 6D”,“ 7D”,“ 8D”,“ 9A”,“ 10A”,“ 11A”,“ 12A”,“ 13A”,“ 14D”,“ 15A”,“ 15D”,“ 16A”,“ 17A”,“ 18D”,“ 19D”,“ 20A”,“ 21D”,“ 22D” ,“ 23A”,“ 24A”,“ 25D”,“ 26D”,“ 27A”,“ 28A”,“ 29A”,“ 30A”,“ 31A”}


我认为您的代码有问题。例如,在示例2中,3A不应该紧随其后,2D因为还没有任何线索。其他解决方案也显示了这种效果。
霍华德

霍华德,我不明白你的意思。从“ 4.如果没有相邻的线索,他将转到下一个可用的线索,其数量是下一个(交叉或向下)”,看来3A可能在2D之后。
DavidC

但是,例如,5A有一个线索,因此应该受到青睐3A
霍华德

您已经定义了ToString两次速记
belisarius博士,2014年

霍华德,现在我明白你的意思了。谢谢。稍后将纠正。
DavidC 2014年
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.