Según esta página , la mejor estrategia para adivinar las palabras del verdugo en inglés es calcular las probabilidades de cada letra en una lista de palabras que cumplan con nuestras condiciones. Pero, como soy realmente vago, no quiero calcular cada palabra en el diccionario por mí mismo. Pero, como sé que siempre estás aquí para ayudarme, estoy seguro de que podrás hacerme un rey de un código que lo haga por mí. Y, debido a que mi disco duro está casi lleno, me gustaría tener el código más pequeño posible. Significa que este es el código de golf, y la presentación con la menor cantidad de bytes ganará, ¡pero también la más precisa! .
De entrada y salida
Se tomará una palabra aleatoria de esta lista de palabras .
Su programa debe aceptar, en argumentos o por entrada del usuario (ventanas emergentes, stdin, lo que sea),
- Longitud de la palabra
- Letra incorrecta ya encontrada, o 0 si acabamos de comenzar el juego, y no proporcionaste ninguna letra incorrecta.
- Cartas ya encontradas Y su posición en la palabra
Ejemplo: ./hangsolver 6 XBZ 1P 4P 2E 6E
Aquí, elegí la palabra "personas". Para mayor claridad: PE _ P _ E (las letras incorrectas son XB y Z)
¡Eso significa que, en un juego, tendré que lanzar tu script muchas veces!
La salida será una sola letra, su próximo intento.
Reglas
- El que adivine 10 palabras en menos intentos que los demás ganará.
- En caso de empate, gana el código más corto en bytes.
- Si todavía hay un empate, el programa más rápido ganará.
- Puede suponer que solo hay estas palabras en inglés.
- Solo intentaré palabras válidas de la lista de palabras.
- Tengo una buena computadora, la potencia de la CPU no será un problema (¡pero trata de responder lo más rápido que puedas!)
- No puede resolver con un solucionador en línea, pero puede descargar la lista de palabras o pasarla como argumento. Puede suponer que se llamará "wordlist.txt" y en el mismo directorio que su script.
- Su código debe poder ejecutarse en un sistema operativo común. Podría ser Windows, Mac o Ubuntu / Debian / CentOS o Redhat.
- No puede usar un solucionador externo.
- Sin embargo, puede acortar la URL a la lista de palabras.
- Este código de golf finalizará el primero de septiembre.
- DEBE utilizar el método descrito anteriormente.
Buena suerte !
Lista de palabras encontrada aquí en SE.
fuente
Respuestas:
PowerShell,
248246241 bytesSin golf
Bueno, tanto como pude sin cambiar la forma en que funciona:
Descompostura
El enfoque que tomé aquí fue generar primero una expresión regular para sacar posibles palabras de la lista de palabras. Como sé la longitud de la palabra y las letras que no funcionaron, puedo hacer una expresión regular de eso con bastante facilidad.
Entonces, en el ejemplo de PEOPLE, 6 letras con XBZ como parte de la palabra, buscaría generar
^PE[^XBZ]P[^XBZ]E$
.Estoy explotando el hecho de que
Get-Content
(gc
) devuelve una matriz de líneas, y el-match
operador cuando se usa con una matriz en el lado izquierdo, devuelve una matriz de coincidencias en lugar de un bool, por lo que puedo obtener rápidamente una lista de solo palabras que son candidatos, una vez que tenga la expresión regular.Para generar la expresión regular, comienzo con una matriz (
$e
) de la clase de caracteres negativos coincidentes con$c
elementos (que$c
es el número de letras en la palabra). Iterando los números del 1 al 1$c
, verifico si hay una letra coincidente en esa posición y, si existe, reemplazo el elemento en$e
con esa letra.Una vez que he iterado a través de todas las posiciones, la matriz final es
-join
edita (con una cadena vacía) y tenemos nuestra expresión regular.Así que ahora tengo una serie de todas las palabras posibles que podría ser. Un rápido
-join
con una cadena vacía en eso, me da una gran cadena concatenada de todas las palabras, la dividí en\B
(no un límite de palabra, si me divido en una cadena vacía obtendré 2 elementos en blanco adicionales), así que ahora tengo una matriz de cada letra en cada palabra posible.Tipear eso en
Where-Object
me permite filtrar las letras que ya se han emparejado. Esta parte fue un verdadero dolor. Tuvo que lidiar con la lista de letras coincidentes (que incluyen la posición) que es 1 elemento, más de 1 elemento o 0 elementos, forzando$b
primero a una matriz para que-match
pueda operar en todas ellas, pero eso (desafortunadamente en este caso ) devuelve una matriz, por lo que tenemos que verificar.Count
. Usar!(thing).Count
es un poco más pequeño que usar(thing).Count-gt0
.Continuando, ahora tenemos una matriz de todos los caracteres individuales (como
string
s no comochar
s) de todas las palabras que podría ser, menos las letras que ya se adivinaron correctamente.Conectar eso en
Group-Object
me da un objeto con los recuentos de cada letra, por lo que un tubo rápido enSort-Object count
hace que sea fácil obtener el recuento más alto. En lugar de lo(thing|sort count -des)[0]
que podemos usar(thing|sort count)[-1]
. En PowerShell[-1]
obtiene el último elemento. En este punto, todavía estamos tratando con los objetos que provienen, porGroup-Object
lo que obtenemos la.Name
propiedad que es la letra que más aparece.Notas
wordlist.txt
contrario, eso podría reducir algunos bytes..\hangman.ps1 7 0
) se ejecuta en unos 350 ms.fuente
Python3, 299 bytes
Estoy bastante seguro de que esto se puede jugar más.
Filtra la lista de palabras para posibles coincidencias, crea un mapa de frecuencia de caracteres y selecciona el carácter más frecuente que aún no se ha seleccionado.
fuente
''.join(..)
s. Si todos los elementos en el interior son cadenas de longitud 1, puede cambiarlo a'..'[2::5]
, donde los apóstrofos son puntos de retroceso.Java,
646640631607606 (corto)790789779 (rápido) bytesCORTO
RÁPIDO
Ponga el archivo de la lista de palabras en la carpeta.
Algoritmo de versión corta
p[i] == q[i] || q[i] == '\0'
donde p es una palabra de la lista de palabras (matriz de caracteres), y q es la palabra que estamos tratando de adivinarAlgoritmo de versión larga
fuente
PHP, 346 bytes
Funciona de la siguiente manera:
Suposiciones
>=5.4
wordlist.txt
archivo en la carpeta actualfuente
php hangman.php 6 YH 2E 6E 3O 1P 4P PHP Notice: Undefined offset: 2 in ./Desktop/hangman.php on line 1 Notice: Undefined offset: 2 in ./Desktop/hangman.php on line 1
Powershell, 153 bytes
Inspirado por la respuesta de briantist .
Como otros escritores usé el nombre del archivo
wordlist.txt
. Aunque fue posible elegir un nombre más corto.Menos guión de prueba de golf:
Salida:
Valores variables para
&$f 7 0 2o,5e,7t
:fuente