クロスワード強制!


14

不可解なクロスワード中毒者のクリスは、それらを解決する順序のアルゴリズムを設定しています。

ここに画像の説明を入力してください

上記の画像をガイドとして使用します。

  1. クリスは常に最初の手がかりから始めます。この場合は1 Acrossです。クリスは有能なクロスワード愛好家なので、彼が取り組んでいる手がかりの答えを常に知っていると思われます。
  2. クリスが手掛かりを完了すると、完了したものに隣接するすべての手がかり(最初のケースでは1ダウン、2ダウン、3ダウン)をチェックし、最も小さい番号の手がかりを完了します。隣接する手がかりがなければ、ステップ3に進みます。
  3. 手がかりが次の番号(ステップ3で説明)に横向きの手がかりと下向きの手がかりの両方がある場合、彼は最初に横向きの手がかりを完成させます(100%の確実性、OCDの境界線!)
  4. 隣接する手がかりがない場合、次の利用可能な手がかりに移動します(横または下)。
  5. すべての手がかりが完了するまで、手順2から繰り返します。

親愛なるコーダー、これこそがあなた次第です。クロスワードテンプレートが提供されると、それを解決するためのChrisのアルゴリズムに基づいて、手がかりの順序を説明する出力を提供できるコードを作成する必要がありました。

コードは、クロスワードパズルテンプレートの入力を受け入れます。これは.、白い四角を表す形式と#黒い四角を表す形式です。

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

入力は、a)クロスワードの表現のファイル読み取り、またはb)クロスワードの各行の行入力とそれに続く\n\nEOFを示す2番目の入力によって行うことができます。

そして、Chrisが上記のアルゴリズムに従って解決する方法を決定します。

出力は、の形式の一連のコンマ区切りの命令の形式である必要がありますn(A|D)。ここnで、手がかり番号に続いてAforまたはDdownが続きます。

したがって、上記の例(画像とサンプルテンプレートの両方から1つが同じ)の場合、出力は次のようになります。

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

最短のコードが勝つ...

テスト中

コード、バイトカウント、.およびand #形式で表される4つのテストケースの1つ、およびこの入力から生成された出力を提出する必要があります。4つのテストケースがあり、以下の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

幸運を!


念のために:例の画像では、強制的に入力する5番目の手がかりはどの番号ですか?(1H、1V、2V、3Vの後)
ベリサリウス博士14

@belisarius画像は4番目のテストケースに対応しています。5番目の手がかりは9 Across、または、あなたが言うように、9Hです:) 4番目の手がかりが完了した後の唯一の隣接する手がかりは9と10 Acrossです。 ...
WallyWest 14

バイトは、正しい出力を生成するコードに基づいてのみ考慮されますか。IOW、コンパイル可能にするためにインクルード、C#名前空間+クラス+メインなどにペナルティを科していますか、それともC#などで書くと最小限のコードが必要だと仮定するのは合理的ですか?
ChiefTwoPencils 14

1
@BobbyDigitalまあ、これはコードゴルフです...もしあなたがC#でそれを書くことを計画していたら、あまり多くの外部を使わないようにしようと願っています...あなたはそれらを数えなければならないと思います。 。
WallyWest

1
@WallyWest 3番目の例では17A、最後にa を省略しています。また、4番目の4A直後4D
ハワード14

回答:


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 14

わあ、時間を無駄にしないことを明確にしてくれてありがとう。より適切な言語を理解する必要があることは明らかです。votes++
ChiefTwoPencils 14

@BobbyDigital私は無礼を意味しませんでした。C#は非常に冗長な言語です...おそらくコードゴルフには最適ではありません。コードボウリングやここでの人気コンテストのために...しかし、コードゴルフは魚の全く新しいやかんです。
WallyWest 14

ここでも+1 ...おそらく私が見たGolfScriptのより長いエントリの1つです...うまくできました。
WallyWest 14

1
@BobbyDigital:タスク自体は非常に興味深いものです。使い慣れた言語で試してみてください。パズルを楽しんでいただけると思います。パズルに取り組むためのさまざまなアプローチをすべて調査してください。この答えほど低い文字数に達していなくても、それ自体は楽しいです。
ハワード14

3

Mathematica 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」}


3

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ではありません。他のソリューションもこの効果を示しています。
ハワード14

ハワード、私はあなたの主張を理解していません。「4.隣接する手がかりがない場合、次の利用可能な手がかりに進む(横または下)」、3Aは2Dの後にあるようです。
DavidC

しかし、例えば5A、手掛かりがあり、それゆえに支持されるべきです3A
ハワード14

ToString2回の略記を定義しました
ベリサリウス博士

ハワード、今あなたの主張を理解しています。ありがとう。後で修正します。
DavidC 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.