Cruciverba Compulsions!


14

Chris, un enigmatico criptico dei cruciverba, ha un algoritmo definito per l'ordine in cui li risolve.

inserisci qui la descrizione dell'immagine

Useremo l'immagine sopra come guida.

  1. Chris inizia sempre con il primo indizio, in questo caso 1 Across. Chris è un appassionato di cruciverba, quindi si presume che saprà sempre la risposta all'indizio su cui sta lavorando.
  2. Una volta che Chris ha completato un indizio, controllerà tutti gli indizi adiacenti a quelli che ha completato (nel primo caso, 1 in basso, 2 in basso e 3 in basso) e quindi completa l'indizio con il numero più basso. Se non ci sono indizi adiacenti, andrebbe al passaggio 3.
  3. Se l'indizio è tale che il numero successivo (come descritto nel passaggio 3) ha sia un indizio trasversale che un indizio discendente, completerà prima l'indizio opposto (certezza al 100%, questo confina con il DOC!)
  4. Se non ci sono indizi adiacenti, passerà al successivo indizio disponibile che è il prossimo numero (attraverso o in basso)
  5. Ripeti dal passaggio 2 fino al completamento di tutti gli indizi.

Ed è qui che dipende da te, cari programmatori. Ti è stato assegnato il compito di creare un codice che, fornendo un modello cruciverba, possa fornire un output che descriva l'ordine degli indizi basato sull'algoritmo di Chris per risolverlo.

Il codice accetterà l'inserimento di un modello di cruciverba, sotto forma di un .quadrato bianco che #rappresenta e un quadrato nero.

Esempio :

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

L'input può essere attraverso: a) un file letto della rappresentazione del cruciverba, oppure b) mediante input di riga di ciascuna riga del cruciverba, seguito da \nun secondo che \nindica EOF.

E poi determinerà il metodo con cui Chris lo risolverebbe secondo l'algoritmo sopra descritto.

L'output deve essere nel formato di una serie di istruzioni separate da virgola sotto forma di n(A|D), dove nè il numero di indizio seguito da Aper across o Dper down.

Quindi nell'esempio sopra (sia dall'immagine, sia dal modello di esempio, che sono la stessa cosa), l'output sarebbe:

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

Il codice più corto vince ...

analisi

È necessario fornire con l'invio il codice, un conteggio dei byte, nonché uno dei quattro casi di test rappresentati nel formato .e #, nonché l'output generato da questo input. Esistono quattro casi di test, i tre seguenti e il modello di esempio sopra riportato.

Esempi di test:

Caso di prova 1

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

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

Caso di prova 2

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

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

Caso di prova 3

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

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

Caso di prova 4

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

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

In bocca al lupo!


Solo per essere sicuri: nella tua immagine di esempio, quale numero è il quinto indizio da compilare compulsivamente? (dopo 1H, 1V, 2V, 3V)
Dr. belisarius,

@belisarius L'immagine corrisponde al quarto caso di test. Quindi il quinto indizio da riempire sarebbe 9 Across, o come diresti tu, 9H :) Poiché gli unici indizi adiacenti dopo che il quarto indizio è stato completato sono 9 e 10 Across, Chris sarà costretto a compilare prima l'indizio più basso ...
WallyWest,

I byte sono considerati solo sulla base del codice che produce l'output corretto. IOW, sei penalizzato su include, spazio dei nomi C # + class + Main e simili per averlo compilabile o è ragionevole supporre che se lo scrivo in C #, o simile, sarebbe richiesta una quantità minima di codice?
ChiefTwoPencils,

1
@BobbyDigital Bene, questo è code-golf ... Spero che se avessi intenzione di scriverlo in C #, avresti cercato di non usare troppi esterni ... Dovresti contarli, temo .. .
Wally West

1
@WallyWest Penso che il tuo terzo esempio stia omettendo un 17Aalla fine. Anche il quarto 4Asubito dopo 4D.
Howard,

Risposte:


5

GolfScript, 154 caratteri

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

L'ingresso deve essere fornito su STDIN. Gli esempi danno i seguenti risultati (controllare online ):

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 Notevolmente succinto. Come funziona?
DavidC,

Caspita, grazie per aver chiarito che non dovrei nemmeno perdere tempo. Chiaramente dovrà imparare una lingua più appropriata. votes++
ChiefTwoPencils,

@BobbyDigital Non intendevo mancare di rispetto. C # è un linguaggio molto dettagliato ... probabilmente non è il migliore per il golf del codice. Code-bowling o per concorsi di popolarità qui ... ma Code Golf è un nuovissimo bollitore di pesce.
WallyWest,

+1 anche qui ... Probabilmente una delle voci GolfScript più lunghe che ho visto ... Ben fatto.
WallyWest,

1
@BobbyDigital: l'attività stessa è piuttosto interessante. Provalo in una lingua che conosci. Penso che ti divertirai tanto quanto me: studia tutti i diversi approcci per affrontarlo. È divertente da solo anche se non raggiungi un numero di personaggi basso come questa risposta.
Howard,

3

Mathematica 806 477

(Sembra esserci un problema tecnico nell'ordinamento dei passaggi della soluzione. Sto esaminando questo.)

golfed

La funzione qtrova l'ordine delle soluzioni cruciverba.

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

boardvisualizza il cruciverba. Il codice non è incluso nel conteggio dei caratteri. qQui vengono prese in prestito diverse sotto funzioni .

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

Casi test

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


Penso che tu abbia un problema con il tuo codice. Ad esempio nell'esempio 2 3Anon dovrebbe essere giusto dopo il 2Dperché non c'è ancora alcun indizio. Anche le altre soluzioni mostrano questo effetto.
Howard,

Howard, non capisco il tuo punto. Da "4. Se non ci sono indizi adiacenti, passerà al successivo indizio disponibile che è il prossimo numero (attraverso o in basso)", sembra che 3A potrebbe essere dopo il 2D.
DavidC,

Ma ad esempio 5Aha un indizio e dovrebbe quindi essere favorito 3A.
Howard,

Hai definito una scorciatoia per ToStringdue volte
Dr. belisarius,

Howard, ora capisco il tuo punto. Grazie. Correggerò più tardi.
DavidC,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.