Antecedentes
Boggle es un juego de mesa donde los jugadores tienen que encontrar palabras en inglés en un tablero de 4 por 4 de alfabetos aleatorios. Las palabras se pueden construir seleccionando celdas secuencialmente adyacentes en el tablero. ("adyacente" significa horizontal, vertical o diagonalmente adyacente). Además, la misma celda no se puede usar más de una vez en una palabra.
El siguiente es un tablero de ejemplo:
I L A W
B N G E
I U A O
A S R L
En este tablero, BINGO
, ORANGE
y WEARS
son palabras válidas, pero SURGE
y RUSSIA
no lo son:
SURGE
: No hay par adyacente en el tablero que tengaRG
.RUSSIA
:S
no se puede usar dos veces.
Boggle modificado es una versión modificada de Boggle, con las siguientes reglas:
- El tamaño de la placa es
n
-by-n
, donden
puede ser cualquier número entero positivo. - Cada celda puede contener cualquier byte entre 0 y 255 inclusive.
- Una celda se puede usar más de una vez, pero no dos veces seguidas .
Usar el panel de ejemplo anterior, además de BINGO
, ORANGE
y WEARS
, se LANGUAGE
convierte en una cadena válida (ya que G
se usa dos veces, pero no dos veces seguidas) pero RUSSIA
aún no lo es (debido al SS
par).
Aquí hay otro ejemplo usando un fragmento de código. La cadena from itertools import*\n
se puede encontrar en el siguiente tablero, pero no from itertoosl import*
o from itertools import *
:
f i ' ' s
r t m l
e o o p
\n * t r
Tenga en cuenta que necesita dos o
para que coincida con la oo
secuencia.
Desafío
Escriba una función o programa que, dado un tablero de Boggle modificado B
(de cualquier tamaño) y una cadena s
, determine si s
se puede encontrar en él B
.
Restricciones
Su código en sí también debe caber en un tablero de Boggle modificado b
. Es decir, debe mostrar el tablero b
en su envío junto con su código, de modo que su función / programa salga verdadero si se proporciona b
y su código como entrada.
Puntuación
El puntaje de su envío es la longitud lateral del tablero más pequeño b
donde puede ajustar su código. Los empates se rompen por las reglas habituales de código de golf , es decir, la longitud de su código en bytes. La presentación con el puntaje más bajo (para ambos criterios) gana.
Por ejemplo, from itertools import*\n
tiene un puntaje de 4 (usando la tabla anterior) y una longitud de código de 23 bytes.
Entrada y salida
Para la entrada, puede tomar cualquier método conveniente para ambos B
y s
. Esto incluye una lista de caracteres y una lista de códigos de barras, 2D o aplanados o lo que tenga sentido. Además, opcionalmente puede tomar el tamaño de la placa como parte de la entrada.
Para la salida, puede elegir uno de los siguientes:
- Valores de verdad y falsedad siguiendo la convención de su idioma, o
- Un valor predefinido para verdadero y falso respectivamente.
Especifique su método de entrada / salida en su envío.
fuente
+=+=
o algo así. El problema es la==
función de salida ...Respuestas:
Python 2, puntaje 3, 20972 bytes
El código completo es el resultado de: ¡ Pruébelo en línea!
Se adapta a la tabla Boggle:
Decodifica y ejecuta este programa:
Que toma entrada como:
['ILAW','BNGE','IUAO','ASRL'], 'LANGUAGE'
fuente
CJam , puntaje 2, 9351 bytes
Pruébalo en línea! Espera entradas como:
y cabe en el tablero Boggle:
Construye la cadena y
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}%:|~
luego la evalúa como código CJam.fuente
Limpio , puntaje 12 (175 bytes)
(Esto seguramente será superado por un esolang y probablemente también por los idiomas normales).
Esto define una función
$ :: Int [Char] {#String} -> Bool
que verifica si el segundo argumento (la palabra) se puede encontrar en el tercer argumento (el tablero) dado el primer argumento como ancho.En el tablero en el que encaja esto (ver más abajo),
*
marca los lugares no utilizados. Hay 16 de ellos, en un tablero de tamaño 12 × 12 = 144, lo que significa que 128 se usan de manera efectiva (una eficiencia de 175/128 ≈ 1.37 ). Es posible obtener el mismo programa en 11 × 11, pero todo esto se hace a mano y muy tedioso; mi jefe probablemente no estaría feliz si tratara de ponerlo en 11 × 11.¡Pruébelo en línea (con el programa como entrada)!
fuente
Java, puntaje 23,
538507 bytesNSFW
Pruébalo en línea!
Compilado con JDK 9, pero debería funcionar con 8.
No sabía qué hacer con las importaciones y el campo estático (que de hecho es necesario), así que decidí tomar toda la clase y pegar las lambdas en un inicializador. La lambda
g
se puede aplicar en una matriz 2D y una cadena, y devuelve1
si la cadena está en el tablero y0
si no (como unByte
, 3 caracteres más cortos queInteger
).Le doy crédito a este tipo por una forma (en mi caso) más corta que la codificada para abordar las celdas vecinas.
En algún lugar en el progreso de hacer esta monstruosidad me invertí en hacer que funcionara con lambdas, empeoró progresivamente cada vez más hasta que esto sucedió. Ni siquiera se acerca a las otras respuestas y probablemente ni siquiera se acerca a la solución óptima en Java, pero bueno, encaja bastante bien en una placa de 23x23 (que no es óptima, pero tal vez más cerca que el programa en sí) :
Por supuesto, en ese punto no tenía sentido tratar de hacer eso a mano. Como beneficio adicional, aquí está la función (ingenua) que usé para comprimir el código en el tablero:
Mapea su entrada en una espiral que la implementación de la serpiente no funcionó , dejando los caracteres fuera si es posible. Es bastante simple, por lo que probablemente podría mejorarse y olvidé agregar la verificación de caracteres en la dirección hacia atrás-derecha (actualización: lo agregué y produjo resultados incorrectos) , por lo que probablemente podría eliminar uno o dos caracteres, pero dudo que esté obteniendo en un 22x22.
Editar: Se eliminaron 6 espacios en lugares donde no necesitaban estar. Ahorró 13 bytes al reemplazar una verificación en los índices de la matriz con un try-catch. Afeitó 12 bytes moviendo el tamaño de la placa a un
int
.fuente
Gelatina , 2316 bytes, puntaje 3
Pruébalo en línea!
Tablero:
Nota: esta es una solución (algo) trivial. Gracias a Lynn por la idea .
Devuelve una lista no vacía si
s
se puede encontrar en ellaB
, y una lista vacía si no. El pie de página agregado ayuda a aclarar eso.fuente
s
no se podía encontrar, o un entero positivo si se podía encontrar. Pero las reglas establecen "Un valor predefinido para verdadero y falso respectivamente". ¿O están vacíos / no vacíos para una convención falsa / verdadera en Jelly?