Compulsões de palavras cruzadas!


14

Chris, um viciado em palavras cruzadas, tem um algoritmo definido para a ordem em que ele os resolve.

insira a descrição da imagem aqui

Usaremos a imagem acima como guia.

  1. Chris sempre começa com a primeira pista, neste caso 1 Across. Como Chris é um entusiasta capaz de palavras cruzadas, presume-se que ele sempre saiba a resposta para a pista em que está trabalhando.
  2. Depois que Chris concluir uma pista, ele verificará todas as pistas adjacentes às que ele completou (no primeiro caso, 1 Down, 2 Down e 3 Down) e depois completará a pista com o número mais baixo. Se não houver pistas adjacentes, ele passaria para a etapa 3.
  3. Se a pista for tal que o próximo número (conforme descrito na Etapa 3) tenha uma pista transversal e uma pista descendente, ele completará a pista transversal primeiro (100% de certeza, isso faz fronteira com o TOC!)
  4. Se não houver pistas adjacentes, ele passará para a próxima pista disponível que será a próxima em número (do outro lado ou do baixo)
  5. Repita da Etapa 2 até que todas as pistas sejam concluídas.

E é aqui que tudo se resume a você, queridos programadores. Você foi encarregado de criar um código que, ao receber um modelo de palavras cruzadas, forneça uma saída descrevendo a ordem das pistas com base no algoritmo de Chris para resolvê-lo.

O código aceitará a entrada de um modelo de palavras cruzadas, na forma de um .quadrado branco e de um #quadrado preto.

Exemplo :

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

A entrada pode ser feita através de: a) um arquivo lido da representação das palavras cruzadas, ou b) pela entrada de linha de cada linha das palavras cruzadas, seguida por \n, com um segundo \nindicando EOF.

E então determinará o método pelo qual Chris o resolveria de acordo com o algoritmo acima descrito.

A saída deve estar no formato de uma série de instruções separadas por vírgula, na forma de n(A|D), onde né o número da pista seguido por Apara todo ou Dpara baixo.

Portanto, no exemplo acima (ambos da imagem e do modelo de exemplo, que são o mesmo), a saída seria:

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

O menor código vence ...

Teste

Você deve fornecer com seu envio o código, uma contagem de bytes, além de um dos quatro casos de teste representados no formato .e #, assim como a saída gerada a partir dessa entrada. Existem quatro casos de teste, os três abaixo e o modelo de exemplo acima.

Exemplos de casos de teste:

Caso de teste 1

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

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

Caso de teste 2

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

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

Caso de teste 3

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

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

Caso de teste 4

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

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

Boa sorte!


Só para ter certeza: em sua imagem de exemplo, qual número é a quinta pista a ser preenchida compulsivamente? (após 1H, 1V, 2V, 3V)
Dr. belisarius

@belisarius A imagem corresponde ao quarto caso de teste. Portanto, a quinta pista a ser preenchida seria 9 Across, ou como você colocaria, 9H :) Como as únicas pistas adjacentes após a conclusão da quarta pista são 9 e 10 Across, Chris será obrigado a preencher a pista mais baixa primeiro ...
Wally West

Os bytes são considerados apenas com base no código que produz a saída correta. IOW, você é penalizado com includes, namespace C # + classe + Main e similares para compilá-lo ou é razoável supor que, se eu o escrever em C # ou similar, seria necessária uma quantidade mínima de código?
ChiefTwoPencils

1
@BobbyDigital Bem, isso é código-golfe ... Espero que, se você planeja escrevê-lo em C #, tente não usar muitos recursos externos ... Você teria que contá-los. .
Wally West

1
@WallyWest Acho que seu terceiro exemplo é omitir um 17Ano final. Também o quarto 4Adepois 4D.
247 Howard Howard

Respostas:


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;;]','*

A entrada deve ser fornecida no STDIN. Os exemplos produzem os seguintes resultados (verifique 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 notavelmente sucinto. Como funciona?
24714

Uau, obrigado por deixar claro que eu não deveria nem perder meu tempo. Claramente vai ter que ficar em cima de um idioma mais apropriado. votes++
ChiefTwoPencils

@BobbyDigital Não quis desrespeitar. C # é uma linguagem muito detalhada ... provavelmente não é a melhor para código de golfe. Boliche em código ou por concursos de popularidade por aqui ... mas o Code Golf é uma chaleira de peixe totalmente nova.
WallyWest

+1 aqui também ... Provavelmente uma das entradas mais longas do GolfScript que eu já vi ... Muito bem.
22414 WallyWest

1
@BobbyDigital: A tarefa em si é bastante interessante. Faça uma tentativa em um idioma que você esteja familiarizado. Acho que você vai gostar do quebra-cabeça tanto quanto eu - investigue todas as diferentes abordagens para enfrentá-lo. É divertido por si só, mesmo que você não alcance uma contagem de caracteres tão baixa quanto esta resposta.
257 Howard

3

Mathematica 806 477

(Parece haver uma falha na ordenação das etapas da solução. Estou analisando isso.)

Golfe

A função qencontra a ordem das soluções de palavras cruzadas.

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

boardexibe as palavras cruzadas. O código não está incluído na contagem de caracteres. Várias sub-funções de qsão emprestadas aqui.

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 teste

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


Eu acho que você tem um problema com seu código. Por exemplo, no exemplo 2 3A, não deve ser logo após o 2Dporque ainda não há pista. Além disso, as outras soluções mostram esse efeito.
24514 Howard

Howard, não estou entendendo o seu ponto. De "4. Se não houver pistas adjacentes, ele passará para a próxima pista disponível, que será a próxima em número (entre ou para baixo)", parece que 3A pode ser posterior a 2D.
DavidC

Mas, por exemplo, 5Atem uma pista e, portanto, deve ser favorecida 3A.
Howard

Você definiu uma abreviação para ToStringduas vezes
Dr. belisarius

Howard, agora eu entendo o seu ponto. Obrigado. Corrigirá mais tarde.
DavidC
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.