Crucigrama compulsiones!

14

Chris, un adicto a los crucigramas crípticos, tiene un algoritmo establecido para el orden en que los resuelve.

ingrese la descripción de la imagen aquí

Utilizaremos la imagen de arriba como guía.

  1. Chris siempre comienza con la primera pista cruzada, en este caso 1 Across. Chris es un entusiasta capaz de los crucigramas, por lo que se supone que siempre sabrá la respuesta a la pista en la que está trabajando.
  2. Una vez que Chris complete una pista, verificará todas las pistas adyacentes a las que ha completado (en el primer caso, 1 Down, 2 Down y 3 Down) y luego completará la pista con el número más bajo. Si no hay pistas contiguas, iría al paso 3.
  3. Si la pista es tal que el siguiente número (como se describe en el Paso 3) tiene una pista cruzada y una pista descendente, primero completará la pista cruzada (¡100% de certeza, esto limita con el TOC!)
  4. Si no hay pistas contiguas, irá a la siguiente pista disponible que sea la siguiente en número (al otro lado o hacia abajo)
  5. Repita desde el Paso 2 hasta completar todas las pistas.

Y aquí es donde se trata de ustedes, queridos codificadores. Se le ha encomendado la tarea de crear código que, al recibir una plantilla de crucigrama, proporcione resultados que describan el orden de las pistas en función del algoritmo de Chris para resolverlo.

El código aceptará la entrada de una plantilla de crucigrama, en forma de un .cuadrado blanco y #otro negro.

Ejemplo :

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

La entrada puede ser a través de: a) un archivo leído de la representación del crucigrama, o b) por entrada de línea de cada línea del crucigrama, seguido de \n, con un segundo que \nindica EOF.

Y luego determinará el método por el cual Chris lo resolvería de acuerdo con el algoritmo descrito anteriormente.

Salida debe estar en el formato de una serie de instrucciones separadas por comas en forma de n(A|D), donde nestá el número de pista seguido de Apara cruzar o Dpara abajo.

Entonces, en el ejemplo anterior (tanto de la imagen como de la plantilla de ejemplo, que son la misma), la salida sería:

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

El código más corto gana ...

Pruebas

Debe proporcionar con su envío el código, un recuento de bytes, así como uno de los cuatro casos de prueba representados en el .# formato y , así como la salida generada a partir de esta entrada. Hay cuatro casos de prueba, los tres a continuación, así como la plantilla de ejemplo anterior.

Ejemplos de casos de prueba:

Caso de prueba 1

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

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

Caso de prueba 2

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

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

Caso de prueba 3

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

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

Caso de prueba 4

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

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

¡Buena suerte!

WallyWest
fuente
Solo para estar seguro: en su imagen de ejemplo, ¿qué número es la quinta pista que debe rellenarse compulsivamente? (después de 1H, 1V, 2V, 3V)
Dr. belisario
@belisarius La imagen corresponde al cuarto caso de prueba. Entonces, la quinta pista que se completará sería 9 Across, o como se podría decir, 9H :) Como las únicas pistas contiguas después de completar la cuarta pista son 9 y 10 Across, Chris se verá obligado a completar primero la pista más baja ...
WallyWest
¿Los bytes se consideran solo en función del código que produce la salida correcta? IOW, ¿está penalizado por incluir, espacio de nombres C # + clase + Main, y similares para que sea compilable o es razonable suponer que si lo escribo en C # o similar, se requeriría una cantidad mínima de código?
ChiefTwoPencils
1
@BobbyDigital Bueno, este es el código de golf ... Espero que si planea escribirlo en C # intente no usar demasiados externos ... Tendría que contarlos, me temo ... .
Wally West
1
@WallyWest Creo que tu tercer ejemplo es omitir un 17Aal final. También el cuarto 4Ajusto después 4D.
Howard

Respuestas:

5

GolfScript, 154 caracteres

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

La entrada debe proporcionarse en STDIN. Los ejemplos arrojan los siguientes resultados (verifique en línea ):

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
Howard
fuente
+1 Notablemente sucinto. ¿Como funciona?
DavidC
Wow, gracias por dejar en claro que ni siquiera debería perder mi tiempo. Claramente va a tener que conseguir un lenguaje más apropiado. votes++
ChiefTwoPencils
@BobbyDigital No quise faltarle al respeto. C # es un lenguaje muy detallado ... probablemente no sea el mejor para el golf de código. Code-bowling o para concursos de popularidad aquí ... pero Code Golf es una nueva olla de pescado.
WallyWest
+1 aquí también ... Probablemente una de las entradas más largas de GolfScript que he visto ... Bien hecho.
WallyWest
1
@BobbyDigital: La tarea en sí es bastante interesante. Pruébalo en un idioma con el que estés familiarizado. Creo que disfrutarás el rompecabezas tanto como yo: investiga los diferentes enfoques para resolverlo. Es divertido en sí mismo, incluso si no alcanzas un recuento de caracteres tan bajo como esta respuesta.
Howard
3

Mathematica 806 477

(Parece que hay una falla en el orden de los pasos de la solución. Estoy investigando esto).

Golfed

La función qencuentra el orden de las soluciones de crucigramas.

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

Sin golf

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

boardmuestra el crucigrama. El código no está incluido en el recuento de caracteres. qAquí se toman prestadas varias subfunciones .

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

Casos de prueba

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

DavidC
fuente
Creo que tienes un problema con tu código. Por ejemplo, en el ejemplo 2 3A, no debería estar justo después del 2Dporque todavía no hay una pista. También las otras soluciones muestran este efecto.
Howard
Howard, no entiendo tu punto. Desde "4. Si no hay pistas contiguas, pasará a la siguiente pista disponible que sea la siguiente en número (al otro lado o hacia abajo)", parece que 3A puede estar después de 2D.
DavidC
Pero, por ejemplo, 5Atiene una pista y, por lo tanto, debe ser favorecido 3A.
Howard
Has definido una taquigrafía para ToStringdos veces
Dr. belisarius
Howard, ahora entiendo tu punto. Gracias. Corregirá más tarde.
DavidC