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.