El foro más grande en la web, llamado postcount ++, decidió crear un nuevo juego de foro. En este juego, el objetivo es publicar la palabra, pero la palabra debe tener una letra agregada, eliminada o modificada. Tu jefe quería que escribieras un programa que corriera la voz y el diccionario UNIX, mientras trabajas para una empresa que tiene un foro más inteligente con juegos de foro más inteligentes y quiere destruir a la competencia (oye, es tu jefe, no lo hagas). discuta con él, de todos modos obtiene mucho efectivo de su trabajo).
Su programa obtendrá dos argumentos, la palabra y el diccionario. Debido a que el usuario que administra el programa (sí, un usuario, su empresa no tiene recursos para ejecutar bots) no es perfecto, debe normalizar el caso en ambos. Las palabras en el diccionario pueden tener letras ASCII (mayúsculas y minúsculas, pero deben ignorarse durante la comparación), guiones, apóstrofes y espacios no consecutivos en el medio. No tendrán más de 78 caracteres. Tienes que generar una lista de palabras que serían aceptadas en el juego, para romper la diversión de las personas que piensan en palabras manualmente.
Este es un ejemplo de su programa esperado, buscando palabras similares a golf
.
> ./similar golf /usr/share/dict/words
Goff
Wolf
gold
golfs
goof
gulf
wolf
El /usr/share/dict/words
es una lista de palabras, con salto de línea después de cada una. Puede leerlo fácilmente con fgets (), por ejemplo.
La empresa en la que trabaja no tiene muchas tarjetas perforadas (sí, es 2014, y todavía usan tarjetas perforadas), así que no las desperdicie. Escribe el programa más corto posible. Ah, y se le pidió que no utilizara implementaciones integradas o externas de la distancia de Levenshtein o cualquier algoritmo similar. Algo sobre No inventado aquí o puertas traseras que aparentemente el vendedor insertó en el idioma (no tiene pruebas de eso, pero no discuta con su jefe). Entonces, si desea distancia, deberá implementarla usted mismo.
Eres libre de usar cualquier idioma. Incluso con tarjetas perforadas, la compañía tiene acceso a los lenguajes de programación más modernos, como Cobol Ruby o Haskell o lo que quieras. Incluso tienen GolfScript, si crees que es bueno para la manipulación de cadenas (no sé, tal vez ...).
El ganador obtiene 15 puntos de reputación de mí y probablemente muchos otros puntos de la comunidad. Las otras buenas respuestas obtendrán 10 puntos, y puntos de la comunidad también. Escuchaste que los puntos no valen nada, pero lo más probable es que reemplacen dolares en 2050. Sin embargo, eso no se confirmó, pero es una buena idea obtener puntos de todos modos.
Respuestas:
GolfScript, 59 caracteres
¡Claro, GolfScript es ideal para la manipulación de cadenas!
Lo que GolfScript no es tan bueno es manejar E / S de archivos o argumentos de línea de comandos. Por lo tanto, este programa espera recibir toda su entrada a través de stdin: la primera línea no en blanco se considera la palabra objetivo, mientras que las líneas restantes deben contener el diccionario. En un sistema Unixish, puede ejecutar este código, por ejemplo, con:
En mi cuadro Ubuntu Linux, el resultado del comando anterior es:
Tenga en cuenta que todas las palabras se convierten en minúsculas y se eliminan los duplicados; por lo tanto, a diferencia de su salida de muestra, la mía no aparece en la lista
Wolf
y porwolf
separado. Según la descripción de su desafío, supongo que esto es aceptable.Además, el código es realmente lento, ya que utiliza un enfoque de fuerza bruta y ni siquiera utiliza optimizaciones obvias, como verificar que la longitud de la palabra candidata coincida con la de la palabra objetivo ± 1. Aún así, se las arregla para ir a través de la
/usr/share/dict/words
lista completa, sin filtrar en ... um ... Te avisaré cuando termine, ¿de acuerdo?Editar: OK, tardó unos 25 minutos, pero terminó.
fuente
Bash + coreutils, 99 bytes
O bien entendí mal la pregunta ( la respuesta de @ lambruscoAcido da resultados muy diferentes ), o esta es una aplicación de expresiones regulares bastante sencilla:
Salida:
fuente
${a:b:c}
hacer?b
dec
la variablea
c
comienza en la posiciónb
(basada en cero) de la variablea
. La expansión de subcadenas es una de las expansiones de parámetros bashPython 3, 291 caracteres
Muy sencillo y, por lo tanto, no muy inteligente. Pero con una gran maraña de generador y lentitud optimizada. Porque no quiere dejar el tiempo de cálculo asignado sin usar, ¿verdad?
fuente
l=len
yr=range
reducir esas funciones aún más.Scala -
403130[Actualizado]: completamente actualizado porque la solución anterior también permitía letras permutadas. No utiliza expresiones regulares ni ninguna herramienta integrada.
Sin golf:
Uso:
fuente
atechny
No cambia una letra. Esta solución hace algo no relacionado con la pregunta.Python, 174 caracteres:
Rápido y al punto.
Ejemplo:
Salida:
Supongo que el archivo de palabras OS X solo tiene más entradas.
fuente
golf'
.golf'
, se imprimirá.Haskell - 219
fuente
Rebol - 213
Sin golf (con algunos comentarios):
Ejemplo de uso (probado en Rebol 3 en OS X Lion):
A continuación se muestra la
parse
regla creada para que coincida con palabras similares a golf :fuente
Python (103):
Bastante eficiente, creo. Además, me gusta lo bien que esto jugó en Python.
fuente