Kreuzworträtsel Zwänge!


14

Chris, ein kryptischer Kreuzworträtsel-Süchtiger, hat einen festgelegten Algorithmus für die Reihenfolge, in der er sie löst.

Bildbeschreibung hier eingeben

Wir werden das obige Bild als Leitfaden verwenden.

  1. Chris beginnt immer mit der ersten Ahnung, in diesem Fall 1 Across. Chris ist ein fähiger Kreuzworträtsel-Enthusiast, daher wird davon ausgegangen, dass er immer die Antwort auf den Hinweis weiß, an dem er arbeitet.
  2. Sobald Chris einen Hinweis vervollständigt, sucht er nach allen Hinweisen, die zu den von ihm vervollständigten Hinweisen gehören (im ersten Fall 1 Runter, 2 Runter und 3 Runter), und vervollständigt dann den Hinweis mit der niedrigsten Nummer. Wenn es keine Anhaltspunkte dafür gibt, fährt er mit Schritt 3 fort.
  3. Wenn der Hinweis so ist, dass die nächste Zahl (wie in Schritt 3 beschrieben) sowohl einen Querhinweis als auch einen Abwärtshinweis hat, wird er den Querhinweis zuerst vervollständigen (100% ige Gewissheit, dies grenzt an OCD!)
  4. Wenn es keine Anhaltspunkte gibt, geht er zum nächsten verfügbaren Anhaltspunkt mit der nächsten Nummer (quer oder runter).
  5. Wiederholen Sie den Vorgang ab Schritt 2, bis alle Hinweise vollständig sind.

Und hier kommt es auf Sie an, liebe Programmierer. Sie wurden beauftragt, Code zu erstellen, der bei Verwendung einer Kreuzworträtselvorlage eine Ausgabe liefert, in der die Reihenfolge der Hinweise auf der Grundlage von Chris 'Algorithmus zur Lösung beschrieben wird.

Der Code akzeptiert die Eingabe einer Kreuzworträtselvorlage in Form .eines weißen und #eines schwarzen Quadrats.

Beispiel :

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

Die Eingabe kann erfolgen durch: a) eine Datei, die die Darstellung des Kreuzworträtsels liest, oder b) durch Zeileneingabe jeder Zeile des Kreuzworträtsels, gefolgt von \neiner zweiten \n, die EOF anzeigt.

Und dann bestimmt es die Methode, mit der Chris es nach dem oben beschriebenen Algorithmus lösen würde.

Die Ausgabe muss im Format einer Reihe von durch Kommas getrennten Anweisungen erfolgen, in Form von n(A|D), wobei ndie Hinweisnummer gefolgt von Afür across oder Dfür down ist.

Im obigen Beispiel (sowohl aus dem Bild als auch aus der Beispielvorlage, die identisch sind) wäre die Ausgabe:

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

Kürzester Code gewinnt ...

Testen

Sie müssen bei Ihrer Übermittlung den Code, eine Bytezahl sowie einen der vier im Format .und dargestellten Testfälle und #die von dieser Eingabe generierte Ausgabe angeben. Es gibt vier Testfälle, die drei unten sowie die obige Beispielvorlage.

Beispiel Testfälle:

Testfall 1

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

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

Testfall 2

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

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

Testfall 3

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

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

Testfall 4

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

Ausgabe: 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

Viel Glück!


Nur um sicherzugehen: Welche Zahl ist in Ihrem Beispielbild der fünfte Hinweis, der zwangsweise ausgefüllt werden muss? (nach 1H, 1V, 2V, 3V)
Dr. belisarius

@belisarius Das Bild entspricht dem vierten Testfall. Der fünfte Hinweis, der ausgefüllt werden muss, ist also 9 Across oder, wie Sie sagen, 9H :) Da die einzigen angrenzenden Hinweise nach dem Abschluss des vierten Hinweises 9 und 10 Across sind, muss Chris zuerst den niedrigsten Hinweis ausfüllen ...
WallyWest

Werden die Bytes nur auf Basis des Codes berücksichtigt, der die korrekte Ausgabe erzeugt. IOW, sind Sie bestraft wegen Includes, C # -Namensraum + Klasse + Main und dergleichen, um es kompilierbar zu machen, oder ist es vernünftig anzunehmen, dass, wenn ich es in C # oder ähnlich schreibe, eine minimale Menge an Code erforderlich wäre?
ChiefTwoPencils

1
@BobbyDigital Nun, das ist Code-Golf ... Ich hoffe, wenn Sie es in C # schreiben würden, würden Sie versuchen, nicht zu viele externe Geräte zu verwenden ... Sie müssten sie leider zählen ... .
WallyWest

1
@WallyWest Ich denke dein drittes Beispiel lässt ein 17Aam Ende aus. Auch der vierte 4Agleich danach 4D.
Howard

Antworten:


5

GolfScript, 154 Zeichen

:^,,{.^=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;;]','*

Die Eingabe muss über STDIN erfolgen. Die Beispiele liefern folgende Ergebnisse ( online prüfen ):

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 Bemerkenswert prägnant. Wie funktioniert es?
DavidC

Wow, danke, dass du klargestellt hast, dass ich nicht einmal meine Zeit verschwenden sollte. Es ist klar, dass Sie eine passendere Sprache wählen müssen. votes++
ChiefTwoPencils

@BobbyDigital Ich meinte keine Respektlosigkeit. C # ist eine sehr ausführliche Sprache ... es ist wahrscheinlich nicht die beste für Codegolf. Code-Bowling oder für Beliebtheitswettbewerbe hier ... aber Code Golf ist ein ganz neuer Fischkessel.
WallyWest

+1 auch hier ... Wahrscheinlich einer der längeren GolfScript-Einträge, die ich gesehen habe ... Gut gemacht.
WallyWest

1
@BobbyDigital: Die Aufgabe selbst ist sehr interessant. Probieren Sie es in einer Ihnen vertrauten Sprache aus. Ich denke, Sie werden das Rätsel genauso lieben wie ich - untersuchen Sie die verschiedenen Ansätze, um das Rätsel zu lösen. Es macht für sich genommen Spaß, auch wenn Sie nicht so wenige Zeichen wie diese Antwort erreichen.
Howard

3

Mathematica 806 477

(Es scheint einen Fehler in der Reihenfolge der Lösungsschritte zu geben. Ich untersuche dies.)

Golf gespielt

Die Funktion ermittelt qdie Reihenfolge der Kreuzworträtsellösungen.

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]])

Ungolfed

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]]]

boardzeigt das Kreuzworträtsel an. Der Code ist nicht in der Zeichenanzahl enthalten. Hier sind einige Unterfunktionen von qausgeliehen.

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,"#"]}]]

Testfälle

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}


Ich denke, Sie haben ein Problem mit Ihrem Code. ZB in Beispiel 2 3Asollte das nicht gleich nach dem sein, 2Dweil es noch keinen Hinweis gibt. Auch die anderen Lösungen zeigen diesen Effekt.
Howard

Howard, ich verstehe deinen Standpunkt nicht. Ab "4. Wenn es keine benachbarten Hinweise gibt, geht er zum nächsten verfügbaren Hinweis mit der nächsten Nummer (quer oder runter)", scheint es, dass 3A nach 2D sein kann.
DavidC

Aber zB 5Ahat eine Ahnung und sollte deshalb vorgezogen werden 3A.
Howard

Sie haben eine Abkürzung für ToStringzweimal definiert
Dr. belisarius

Howard, jetzt verstehe ich deinen Standpunkt. Vielen Dank. Wird später korrigiert.
DavidC
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.