크로스 워드 강요!


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.