크로스 워드 강요!


14

비밀 크로스 워드 중독자 인 Chris는 자신이 해결하는 순서에 대한 알고리즘을 설정했습니다.

여기에 이미지 설명을 입력하십시오

위의 이미지를 가이드로 사용합니다.

  1. Chris는 항상 첫 번째 단서부터 시작합니다 (이 경우 1 Across). Chris는 유능한 크로스 워드 애호가이므로 자신이 작업중인 단서에 대한 답을 항상 알고 있다고 가정합니다.
  2. Chris가 실마리를 완성하면 자신이 완성한 것들 (첫 번째 경우에는 1 Down, 2 Down 및 3 Down)에 인접한 모든 실마리를 확인한 다음 가장 낮은 숫자로 실마리를 완성합니다. 인접한 단서가 없으면 3 단계로 이동합니다.
  3. 단서가 다음 단계 (3 단계에서 설명한)가 단서와 단서를 모두 가지고있는 경우, 먼저 단서를 완료합니다 (100 % 확실성,이 경계선은 OCD에 있습니다!)
  4. 인접한 단서가 없으면 다음 번에 사용할 수있는 다음 단서 (가로 또는 아래로)로 이동합니다.
  5. 모든 단서가 완료 될 때까지 2 단계부터 반복하십시오.

그리고 이것이 여러분에게 귀중한 곳입니다. 크로스 워드 템플릿이 제공 될 때이를 해결하기위한 Chris의 알고리즘에 따라 단서 순서를 설명하는 출력을 제공 할 수있는 코드를 작성해야했습니다.

이 코드는 .흰색 사각형과 #검은 색 사각형을 나타내는 크로스 워드 퍼즐 템플릿의 입력을 허용합니다 .

예 :

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

입력 은 다음과 같습니다 : a) 십자 표시의 파일 읽기, 또는 b) 십자 단어의 각 행의 라인 입력, 그 다음에 \n두 번째로 \nEOF 표시.

그런 다음 Chris가 위에서 설명한 알고리즘에 따라 해결하는 방법을 결정합니다.

출력 은 형식으로 쉼표로 구분 된 일련의 명령어 형식이어야합니다 n(A|D). 여기서 n단서 번호는 뒤에 A또는 D아래로 표시됩니다.

따라서 위의 예제 (이미지와 예제 템플릿 모두 동일)에서 출력은 다음과 같습니다.

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

최단 코드 승리 ...

테스팅

제출시 코드, 바이트 수, .및 #형식으로 표시된 네 가지 테스트 사례 중 하나 와이 입력에서 생성 된 출력을 제출해야합니다 . 위 예제 템플릿뿐만 아니라 아래 3 가지 테스트 사례가 있습니다.

테스트 사례 예 :

테스트 사례 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 이후)
— Dr. belisarius

@belisarius 이미지는 네 번째 테스트 사례에 해당합니다. 따라서 채워질 다섯 번째 단서는 9 가로 또는 9H :) 네 번째 단서가 완료된 후 인접한 단서는 9와 10만이므로 Chris는 가장 낮은 단서를 먼저 채 웁니다. ...
— WallyWest

바이트는 올바른 출력을 생성하는 코드를 기준으로 만 고려됩니까? IOW, C # 네임 스페이스 + 클래스 + 메인 등을 포함하여 컴파일 할 수 있거나 C #으로 작성하거나 이와 비슷한 경우 최소한의 코드가 필요하다고 가정하는 것이 합리적입니까?
— ChiefTwoPencils

1
@BobbyDigital 글쎄, 이것은 코드 골프입니다 ... C #으로 작성하려고 계획했다면 너무 많은 외부 장치를 사용하지 않으려 고 바랍니다 ... 당신은 그들을 두려워해야합니다 .. .
— WallyWest

1
@WallyWest 나는 세 번째 예제가 17A마지막에 생략한다고 생각합니다 . 또한 네 번째 4A바로 다음에 4D.
— Howard

답변:


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;;]','*

STDIN에 입력이 제공되어야합니다. 예제는 다음 결과를 산출합니다 ( 온라인 확인 ).

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

@BobbyDigital 나는 무례하지 않았습니다. C #은 매우 장황한 언어입니다. 코드 골프에는 적합하지 않을 수 있습니다. 코드 볼링이나 여기에서 인기 콘테스트를 위해 ... 코드 골프는 완전히 새로운 물고기 주전자입니다.
— WallyWest

+1도 여기에 있습니다. 내가 본 더 긴 GolfScript 항목 중 하나 일 것입니다.
— WallyWest

1
@BobbyDigital : 작업 자체가 매우 흥미 롭습니다. 익숙한 언어로 사용해보십시오. 나는 당신이 내가했던 것처럼 퍼즐을 즐길 것이라고 생각합니다-퍼즐을 다루는 모든 다른 접근법을 조사하십시오. 이 답변만큼 낮은 문자 수에 도달하지 않더라도 자체적으로 재미 있습니다.
— Howard

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]

t1

{ "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"}


삼

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

board[t3]

q[t3]

t3

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


4

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

board[t4]


q[t4]

t4

{ "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. 다른 솔루션에서도이 효과를 보여줍니다.
— Howard

하워드, 나는 당신의 요점을 이해하지 못합니다. "4. 인접한 단서가 없으면 다음 번에 사용할 수있는 단서 (옆 또는 아래)로 이동합니다."는 3A가 2D 이후 일 수있는 것으로 보입니다.
— DavidC

그러나 예를 들어 5A단서가 있으므로 선호해야합니다 3A.
— Howard

당신은 ToString두
— 번의

하워드, 이제 당신의 요점을 이해합니다. 감사. 나중에 수정합니다.
— DavidC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.