fundo
Boggle é um jogo de tabuleiro em que os jogadores precisam encontrar palavras em inglês em um tabuleiro 4 por 4 de alfabetos aleatórios. As palavras podem ser construídas selecionando células sequencialmente adjacentes no quadro. ("adjacente" significa horizontal, vertical ou diagonalmente adjacente.) Além disso, a mesma célula não pode ser usada mais de uma vez em uma palavra.
A seguir, é apresentado um quadro de exemplo:
I L A W
B N G E
I U A O
A S R L
Nesta placa, BINGO
, ORANGE
e WEARS
são palavras válidas, mas SURGE
e RUSSIA
não são:
SURGE
: Não existe um par adjacente no tabuleiroRG
.RUSSIA
:S
não pode ser usado duas vezes.
Boggle modificado é uma versão modificada do Boggle, com as seguintes regras:
- O tamanho da placa é
n
-by-n
, onden
pode ser qualquer número inteiro positivo. - Cada célula pode conter qualquer byte entre 0 e 255, inclusive.
- Uma célula pode ser usada mais de uma vez, mas não duas vezes seguidas .
O uso do quadro de exemplo acima, além de BINGO
, ORANGE
e WEARS
, LANGUAGE
torna-se uma sequência válida (já que G
é usada duas vezes, mas não duas vezes seguidas), mas RUSSIA
ainda não é (devido ao SS
par).
Aqui está outro exemplo usando um fragmento de código. A string from itertools import*\n
pode ser encontrada no quadro a seguir, mas não from itertoosl import*
ou from itertools import *
:
f i ' ' s
r t m l
e o o p
\n * t r
Observe que você precisa de dois o
para corresponder à oo
sequência.
Desafio
Escreva uma função ou programa que, considerando uma placa Boggle modificada B
(de qualquer tamanho) e uma string s
, determine se ela s
pode ser encontrada B
.
Restrições
Seu próprio código também deve caber em uma placa Boggle modificada b
. Ou seja, você deve mostrar ao quadrob
em sua submissão junto com seu código, para que sua função / programa seja verdadeiro se for fornecido b
e seu código como entrada.
Pontuação
A pontuação do seu envio é o comprimento lateral da menor placa b
onde você pode ajustar seu código. Os laços são quebrados pelas regras usuais de código-golfe , ou seja, o tamanho do seu código em bytes. A finalização com a pontuação mais baixa (para ambos os critérios) vence.
Por exemplo, from itertools import*\n
tem a pontuação 4 (usando o quadro acima) e o comprimento do código de 23 bytes.
Entrada e saída
Para entrada, você pode tomar qualquer método conveniente para ambos B
es
. Isso inclui uma lista de caracteres e uma lista de códigos, 2D ou achatada ou o que fizer sentido. Além disso, você pode opcionalmente considerar o tamanho da placa como parte da entrada.
Para saída, você pode escolher um dos seguintes:
- Valores verdadeiros e falsos após a convenção de seu idioma ou
- Um valor predefinido para true e false, respectivamente.
Especifique seu método de entrada / saída no seu envio.
fonte
+=+=
ou algo assim. O problema é a==
função de saída ...Respostas:
Python 2, pontuação 3, 20972 bytes
O código completo é o resultado de: Experimente online!
Cabe no quadro Boggle:
Decodifica e executa este programa:
O que leva a entrada como:
['ILAW','BNGE','IUAO','ASRL'], 'LANGUAGE'
fonte
CJam , pontuação 2, 9351 bytes
Experimente online! Espera entrada como:
e cabe no quadro Boggle:
Constrói a sequência
l~:Q,:K;{\:Y;\:X;:C,!_{;QY=X=C0==_{;[X(XX)]K,&[Y(YY)]K,&m*[XY]a-C1>:D;{~DF}%:|}&}|}:F;l:R;K,2m*{~RF}%:|~
e a avalia como código CJam.fonte
Limpo , pontuação 12 (175 bytes)
(Isso quase certamente será superado por um esolang e provavelmente também por idiomas normais.)
Isso define uma função
$ :: Int [Char] {#String} -> Bool
que verifica se o segundo argumento (a palavra) pode ser encontrado no terceiro argumento (o quadro), dado o primeiro argumento como largura.No quadro em que isso se encaixa (veja abaixo),
*
marca os lugares não utilizados. Há 16 deles, em uma placa de tamanho 12 × 12 = 144, o que significa que 128 são usados com eficiência (uma eficiência de 175/128 ≈ 1,37 ). Pode ser possível obter o mesmo programa em 11 × 11, mas tudo isso é feito à mão e muito tedioso; meu chefe provavelmente não ficaria feliz se eu tentasse obtê-lo em 11 × 11.Experimente online (com o próprio programa como entrada)!
fonte
Java, pontuação 23,
538507 bytesNSFW
Experimente online!
Compilado com o JDK 9, mas deve funcionar com o 8.
Como não sabia o que fazer com as importações e o campo estático (o que é de fato necessário), decidi apenas pegar a classe inteira e colocar as lambdas em um inicializador. O lambda
g
pode então ser aplicado em uma matriz 2D e em uma string, e retorna1
se a string estiver no quadro e0
se não estiver (comoByte
, 3 caracteres menores queInteger
).Agradeço a esse cara por uma (no meu caso) uma maneira mais curta do que codificada para endereçar as células vizinhas.
Em algum momento do progresso de fazer essa monstruosidade, eu fui investido em fazê-lo funcionar com lambdas, e foi ficando cada vez pior e pior até que isso acontecesse. Ele nem chega perto das outras respostas e provavelmente nem chega perto da solução ideal em Java, mas, ei, ele se encaixa perfeitamente em uma placa 23x23 (o que não é ideal, mas talvez mais próximo do que o próprio programa) :
Claro, naquele momento não havia sentido em tentar fazer isso manualmente. Então, como bônus, aqui está a função (ingênua) que usei para compactar o código no quadro:
Ele mapeia sua entrada para uma espiral em que a implementação da serpente não funcionou , deixando os caracteres de fora, se possível. É bastante simples, então provavelmente poderia ser melhorado e eu esqueci de adicionar a verificação de caracteres na direção contrária à direita (atualização: adicionei-a e produziu resultados incorretos) , então eu provavelmente poderia cortar um ou dois caracteres, mas duvido que esteja ficando em um 22x22.
Edit: Removidos 6 espaços em lugares que não precisavam estar. Economizou 13 bytes substituindo uma verificação nos índices da matriz por uma tentativa de captura. Corte 12 bytes movendo o tamanho da placa para um
int
.fonte
Gelatina , 2316 bytes, pontuação 3
Experimente online!
Borda:
Nota: esta é uma solução (um tanto) trivial. Agradecemos a Lynn pela ideia .
Retorna uma lista não vazia, se
s
for encontradaB
, e uma lista vazia, se não. O rodapé adicionado ajuda a esclarecer isso.fonte
s
não pudesse ser encontrado ou um número inteiro positivo se pudesse ser encontrado. Mas as regras declaram "Um valor predefinido para verdadeiro e falso, respectivamente". Ou estão vazias / não vazias para convenções falsas / verdadeiras no Jelly?