Introdução
Depois de um dia bebendo e assistindo a copa do mundo, você se senta para jogar amistoso. O temperamento aumenta quando você é acusado de desperdiçar o tempo de todos com palavras sem sentido que nem estão no quadro! Você pode estar vendo o dobro, mas certamente está pensando o suficiente para escrever um programa que verifique se suas palavras estão no quadro.
Sua tarefa
Escreva um programa, script ou função que use uma placa de boggle e uma palavra como entrada e retorne True se a palavra estiver no quadro e False se a palavra não estiver.
A entrada será na forma de seis \n
linhas delimitadas. As cinco primeiras linhas compreenderão o tabuleiro 5x5 e cada uma conterá cinco letras maiúsculas. A sexta linha conterá a palavra em questão, também em letras maiúsculas.
Entrada de amostra:
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
DAFTER
A saída pode ser qualquer coisa que signifique inequivocamente Verdadeiro ou Falso na sua linguagem de programação preferida e adira às convenções padrão de zero, nulo e vazio, significando Falso.
Saída de amostra para a entrada acima:
1
Diretrizes de E / S
- A entrada pode ser lida em stdin e responder a saída em stdout.
Ou
- A entrada pode ser um argumento de cadeia única para uma função e resposta é o valor de retorno dessa função.
Regras do Boggle
- Uma palavra está 'no quadro' se você puder construí-la por um caminho de blocos consecutivos, adjacentes e não repetitivos no quadro.
- Um bloco é considerado adjacente aos oito blocos que o cercam (caminhos diagonais são permitidos). As peças na borda do tabuleiro são adjacentes a apenas cinco peças. As telhas no canto são adjacentes a apenas três.
- As letras consecutivas na palavra devem ser adjacentes, a
i
th letra na palavra deve ser adjacente ài-1
th ei+1
th. - Uma letra pode aparecer em uma palavra mais de uma vez, mas você não pode usar o mesmo quadrado no painel de boggle mais de uma vez por palavra.
- O site online de boggle wordsplay.net pode ser útil se você nunca jogou boggle antes, mas deseja ter uma idéia dessas regras.
Ao contrário do boggle normal:
- Você NÃO precisa se preocupar com o fato de a palavra ser uma palavra válida em inglês.
- Não haverá nenhum
Qu
bloco único. - A palavra em questão pode ter qualquer tamanho> 0
Exemplo
No conselho de
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
Essas palavras devem retornar True: FATE, DATING, STANDS, LIFTS.
Estas palavras devem retornar Falso: SADDEN, SULTANS, EXIST, SUEDE, QUEST
Este é um desafio do código-golfe, pelo que o código mais curto vence!
Respostas:
GolfScript, 74 caracteres
A entrada deve ser fornecida no STDIN. Imprime o número de caminhos válidos no quadro, ou seja,
0
para nenhum e um número positivo (verdadeiro).Você pode testar o exemplo online .
Código com alguns comentários:
fonte
Javascript (E6) 137
160 175 190Menos de 2 * Golfscript. Vitória moral ...
Editar reorganização do código de golfe. De novo e de novo
Ungolfed Last version, um pouco complicado de seguir
Ungolfed First version, deve ser mais clara
Uso
Teste
Saída:
fonte
F=a=>(b=a.split('\n'),w=b.pop(Q=(p,n)=>((R|=!w[n])||(b[p]=0)||[1,5,6,7,-1,-5,-6,-7].map(q=>b[q+=p]==w[n]&&Q(q,n+1,b[q]=w[n])))),[Q(~~p,1)for(p in b=[...b.join(R=0)])if(b[p]==w[0])],R)
w = a.pop()
(golfe) ouw = b.pop()
(sem golfe, linha 2)? (provavelmente o último, eu acho)a=a.pop()
, em vez deb=a.pop()
...Python,
207 204203Substituir
... (b[i]==w[0])*any ...
por... b[i]==w[0]and any ...
fornece um desempenho muito melhor ao custo de 2 caracteres.fonte
0<=i<25and
J - 75 char
Eugh, este parece desagradável. E nem mesmo amarrar com o Golfscript! Esta é uma função que utiliza uma string como seu único argumento. Você pode usar qualquer delimitador de um caractere, desde que seja encontrado no final de cada linha, incluindo a última.
Segue uma explicação. Observe que a função pode ser dividida em 5 partes distintas de nível superior, cada uma separada por
@
, portanto trataremos cada uma dessas partes separadamente, da direita para a esquerda.(<;._2)
- Isso divide as linhas nos caracteres de novas linhas / separadores. Ele usa o caractere no final da string como o caractere no qual dividir. Colocamos tudo em boxes (<
) porque, se não o fizermos, temos alguns problemas de preenchimento quando J nos devolve o resultado.(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)
- Para cada letra da palavra a ser verificada, crie uma lista de índices no quadro do Boggle, onde é possível encontrar essa letra.{:
é a última peça dividida (a palavra a ser conferida) e}:
é tudo, menos a última (o quadro Boggle).&:>
abre as caixas que criamos anteriormente, com o subproduto útil de se transformar}:
em uma matriz de caracteres 2D.=/
em seguida, faz uma cópia desse quadro Boggle para cada letra da palavra e transforma as posições em booleanos, dependendo se a letra no quadro corresponde à letra da palavra.((<@#:i.)5 5)
é uma maneira curta de expressar uma matriz de índices 5x5.x#:y
é convertidoy
em uma matriz dax
representação base . (Bem, quase. A verdade é mais complexa, mas isso funciona para nossos propósitos.)<@#~&,"2
- Para a matriz booleana resultante de cada letra, colete todos os índices correspondentes correspondentes juntos."2
faz tudo funcionar com os resultados certos,#~&,
faz a seleção e<@
coleta cada resultado em uma caixa para se preparar para a próxima etapa.{
- Este verbo, usado monadicamente, é chamado de catálogo e recebe uma lista de caixas como argumento. Combina o interior de cada caixa de todas as formas possíveis. Assim, por exemplo, um catálogo em algumas caixas contendo as cadeias "AB" e "abc" forneceria os resultados "Aa", "Ab", "Ac", "Ba", "Bb", "Bc".Executar isso em nossa lista de listas de índices em caixas faz todas as combinações possíveis de índices. Pode ser um grande conjunto se a palavra for longa e houver muitas letras repetidas, mas também vazia se alguma letra não estiver no quadro. Também observamos que reutilizamos blocos em alguns desses caminhos: explicaremos isso mais tarde.
([:*/"1^:2(2(=*)@-/\>@~.)S:1)
- Aqui verificamos cada caminho para ver se é válido.(...)S:1
aplica o(...)
a cada caminho e coleta os resultados em uma lista simples. Isso é crucial porque o resultado de{
é uma matriz multidimensional e não nos importamos com a estrutura dessa matriz, apenas com o conteúdo de cada caixa.2(=*)@-/\>
fornece 1 se cada coordenada de cada índice estiver no máximo uma distante da que o segue e 0 caso contrário. O2
e o/\
são responsáveis por fazer isso em pares.*/"1^:2
ANDs lógicos todos juntos no final. A[:
parte é estrutural em J, não se preocupe.Adicionar
@~.
ao>
é realmente uma maneira inteligente de excluir caminhos com entradas repetidas.~.
usa os itens exclusivos de uma lista, para que a lista seja encurtada se ela se cruzar automaticamente, e as listas mais curtas serão preenchidas automaticamente com 0s quando reunidas, como a maneira como os resultados são combinados à medida que saemS:
. Em última análise, isso é mais curto do que excluir explicitamente os caminhos de interseção automática.+/
- Finalmente, simplesmente adicionamos tudo no final. O resultado é o número de caminhos válidos que compõem a palavra no quadro, com 0 significando nenhum caminho, ou seja, essa palavra não está no quadro. Pelo custo de um caracter, podemos escrever+./
(OR lógico - juntos), o que explicitamente fornecerá 1 ou 0 booleano.Aqui estão alguns exemplos de execuções. Você pode obter o intérprete J em jsoftware.com ou experimentá-lo on-line em tryj.tk .
fonte
Prolog - 315
Eu pensei que o Prolog poderia ser uma boa linguagem para este, com o suporte integrado de retorno, mas acho que é mais prejudicial ao precisar de uma variável para quase todos os valores calculados.
Testado com GNU Prolog; deve estar em conformidade com o ISO Prolog.
Ungolfed:
fonte