Escreva uma função que aceite dois parâmetros: um número inteiro positivo n e uma lista de palavras.
Dado um cubo de unidades n- por- n- por- n , atribua uma letra aleatória (AZ) a cada unidade de superfície. (Para um cubo 3x3x3, haveria 9 unidades de superfície em cada face.)
Em seguida, determine se é possível que uma formiga caminhe pela superfície (com a capacidade de cruzar faces) soletrar cada uma das palavras fornecidas. Suponha que para escrever uma palavra, as letras devem estar para cima / baixo ou esquerda / direita adjacentes, mas não necessariamente na mesma face. [ Editar, para maior clareza: a formiga pode reverter seu caminho e usar letras mais de uma vez. Cada unidade de superfície conta como um caractere; portanto, para escrever uma palavra com letras repetidas (por exemplo, "ver"), a formiga deve visitar três unidades adjacentes.]
A função deve gerar duas coisas:
1) Cada uma das letras em cada face, de forma que a topologia possa ser inferida. Por exemplo, para um cubo 2x2x2, uma saída aceitável seria semelhante a:
QW
ER
TY OP UI
DF JK XC
AS
GH
LZ
VB
2) Cada uma das palavras, juntamente com um booleano, representa se é possível que a formiga soletre a palavra caminhando pela superfície do cubo. Por exemplo:
1 ask
0 practical
1 pure
0 full
Desafio de bônus (não será considerado na pontuação, apenas por diversão): em vez de n representar apenas o tamanho do cubo, deixe n também representar a dimensionalidade da forma. Portanto, um n de 2 produziria um quadrado 2x2; um n de 3 produziria um cubo 3x3x3; e um n de 4 produziria um efeito tesseract 4x4x4x4.
qwq
ouqq
no cubo de exemplo?Respostas:
Ruby, 272 bytes
Duas novas linhas desnecessárias são adicionadas ao código em ambos os lados da função aninhada
g
para melhorar a legibilidade. Estes são excluídos da pontuação. Os caracteresf=
que atribuem a função anônima a uma variável também são excluídos.O formato de saída é
0
ou1
por pergunta, em vez do nativotrue
e do Rubyfalse
. Uma nova linha (em vez de um espaço) é usada para separar o booleano e a palavra. Meu entendimento é que essa é uma interpretação aceitável dos requisitos de saída, mas, se não, o impacto na contagem de bytes seria menor.Resultado
Após cerca de 50 chamadas como esta:
Finalmente consegui a seguinte saída com 2 hits.
ANT
fica no canto inferior direito, subindo, eAN
é compartilhado porCAN
, com oC
contorno redondo para o canto superior esquerdo.Explicação
O desdobramento particular do cubo selecionado foi escolhido em parte por sua facilidade de desenho, mas principalmente por sua facilidade de pesquisa.
Os caracteres que não são do alfabeto (os pontos mais a nova linha no final de cada linha) são uma parte importante do campo em que a formiga pode ser encontrada andando.
A pesquisa é realizada pela função recursiva
g
, que está aninhada na funçãof
. Se a palavra passada for uma sequência vazia, a pesquisa será concluída e$r
definida como 1. Se a formiga estiver em um quadrado de letras correspondente à primeira letra da palavra, a pesquisa continuará nas quatro direções: a função é chamada novamente com a palavra abreviada removendo sua primeira letra. Nesse caso, o parâmetro de direção é ignorado. O movimento é feito chamando recursivamente com o índice de células alterado pelos valores emx.
O resultado da adição é obtido pelo módulo do tamanho da grade mais uma meia linha extra. Isso significa que a linha de baixo passa para o topo e vice-versa, com o deslocamento horizontal correto.Se a formiga estiver em um quadrado que não seja uma letra, ela deverá zigue-zague em um movimento de escada até encontrar um quadrado de letras. Ela zizag na direção sudeste ou noroeste. Isso é simulado por chamadas recursivas, com o
d
parâmetro sendo XOR com 1 a cada vez para acompanhar o movimento dela. Até que ela atinja o próximo quadrado da letra, não há encurtamento da palavra de entrada. Convenientemente, isso pode ser feito pela mesma recursão usada quando estamos pesquisando na área com letras. A diferença é que a recursão tem apenas um ramo quando a formiga está na área de espaço em branco, em oposição a 4 na área da letra.Código comentado
fonte