Su programa debe encontrar todas las palabras en esta lista de palabras que contienen todas las vocales ( a e i o u y
). Hay formas fáciles de hacer esto, pero estoy buscando la respuesta más corta. Tomaré cualquier idioma, pero me gustaría ver a Bash.
Aquí hay un ejemplo (podría mejorarse mucho):
cat wordlist.txt | grep "a" | grep "e" | grep "i" | grep "o" | grep "u" | grep "y"
Tu puntaje es la longitud del código.
-5 puntos por contar todas las ocurrencias de la palabra.
La puntuación más baja gana.
code-challenge
natural-language
TheDoctor
fuente
fuente
Respuestas:
GolfScript, 20 caracteres - 5 = 15 puntos
Basado en la solución de Howard , pero usando una prueba más corta (
\-!
ahorra un carácter más&,6=
), un agregado de longitud más corto (.,+
= 3 caracteres) y un formato de salida más corto (nadie dijo que la salida tuviera que separarse de la nueva línea, por lo que`
ahorra un carácter másn*
).Aquí está la salida, dada la lista de palabras en minúsculas como entrada (saltos de línea insertados para facilitar la lectura):
(Ps. Técnicamente, dado que el desafío solo dice que el código tiene que funcionar para esta entrada específica,
n%{'aeiouy'\-!},`43
sería un carácter más corto todavía. Sin embargo, considero que hacer trampa).Explicación:
n%
divide la entrada en las nuevas líneas en una matriz.{ },
es un operador "grep", que ejecuta el código entre llaves para cada elemento de la matriz y selecciona aquellos para los que devuelve un valor verdadero.'aeiouy'\-
toma la cadena literalaeiouy
y elimina de ella todos los caracteres encontrados en la palabra candidata. El!
anula entonces lógicamente la cadena resultante, produciendo1
(verdadero) si la cadena está vacía y el0
(falso) si no lo es..,+
realiza una copia de la matriz filtrada, cuenta el número de palabras que contiene y agrega el resultado a la matriz original.`
anula la evaluación de la matriz y la convierte en una representación de cadena de su contenido. (Sin ella, las palabras en la matriz simplemente se concatenarían en la salida, produciendo un lío ilegible).fuente
GolfScript, 19 caracteres
Uso:
Salida:
Si también desea generar el recuento al final, puede usar
que es cuatro caracteres más largo.
fuente
Python - 46 caracteres
Versión legible: ya es bastante legible :-)
fuente
APL, 21 - 5 = 16
Espera encontrar la lista de palabras como
w
. Devuelve una lista de las palabras que contienen todas las vocales, más su recuento. Probado con ngn apl . Aquí hay un ejemplo .Explicación
fuente
Rubí 38
Edición 34: Mejor hasta ahora (desde @OI):
Edición 1: Acabo de notar que la pregunta pedía que se incluyera 'y' entre las vocales, así que he editado mi pregunta en consecuencia. Como señaló @Nik en un comentario a su respuesta,
"aeiouy".chars
es un personaje menor que%w[a e i o u y]
, pero dejaré el último, por diversidad, a pesar de que estoy arriesgando pesadillas por la oportunidad desaprovechada.Edición 2: Gracias a @OI por sugerir la mejora:
que salva 11 caracteres de lo que tenía antes.
Edición 3 y 3a: @OI ha eliminado algunos más:
luego
y nuevamente (3b):
Soy un simple escriba!
Aquí hay dos soluciones menos competitivas:
Inicialmente tuve:
s
es una cadena que contiene las palabras, separadas por nuevas líneas. Ses
devuelve una matriz de palabras que contiene las cinco vocales. Para los lectores no familiarizados con Ruby,%w[a e i o u y] #=> ["a", "e", "i", "o", "u", "y"]
y&
es la intersección de la matriz.Suponer
En el bloque
{...}
, inicialmenteentonces "abreviaturas" no está seleccionado.
Si la cadena
s
puede contener duplicados,s.split.select...
puede ser reemplazada pors.split.uniq.select...
para eliminar duplicados.Sólo se dio cuenta de que podía ahorrar 1 carácter mediante la sustitución
size==6
consize>5
.fuente
...size=5
es un error - debería ser...size==5
s.split.select{|w|'aeiouy'.delete(w)==''}
s.split.select{|w|'aeiouy'.tr(w,'')==''}
. Estoy bastante seguro de que puede obtener esto con menos de 40 caracteres si usa la lógica nula y el método de cadena 'correcto'. Todavía estoy buscando ...Haskell - 67
fuente
Rubí: 28 caracteres (o 27 si
y
está excluido de las vocales)El comando completo para ejecutar es (48 caracteres):
EDITAR: reemplazado
puts
porp
lo sugerido por @CarySwovelandfuente
%w[a e i o u]
ahorraría 1 char,p
paraputs
, 3 más.p
, rara vez lo uso. En cuanto a% w [], si y se incluye en el conjunto de vocales, la versión con caracteres es aún más corta."aeiouy".delete(s)==''
podría ahorrarte algunos personajes.AWK - 29
Para ejecutar: Guarde la lista de palabras en minúsculas en
wordlist.txt
. Entonces hazlo:Si su sistema no tiene
mawk
,awk
puede usarse también.También puede ejecutarlo desde un archivo guardando el programa
program.awk
y haciendomawk
oawk
-f program.awk
.fuente
'/y/&&/u/&&/i/&&/o/&&/a/&&/e/'
!!Python, 45 caracteres
fuente
k [22-5 = 17 caracteres]
Cambié el nombre del archivo "corncob_lowercase.txt" a "w"
Cuenta las palabras [22 caracteres]
Salida
Encuentra todas las palabras [25 caracteres]
En general 43 palabras que contienen todas las vocales
(a e i o u y)
Salida
fuente
Javascript / JScript 147 (152-5), 158 (163-5) o 184 (189-5) bytes:
Aquí está mi versión de JavaScript y JScript horriblemente "no golfizada" (
164152152-5 = 147 bytes):function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;}
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=6;for(z in c)i-=!!s[k].search(c[z]);i&&(r[r.length]=s[k]);}return r;}
¡Gracias @GaurangTandon por la
search()
función, que me ahorró un byte!RegExp basado en un rendimiento HORRIBLE , pero admite mayúsculas y minúsculas (163-5 = 158 bytes):
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=RegExp(c[z],'i').test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
RegExp basado en MEJOR rendimiento, PERO toma muchos más bytes (189-5 = 184 bytes):
function(s,k,z,x,i,c,r,l){l=[];r=[];for(z in c='aeiouy'.split(''))l[z]=RegExp(c[z],'i');for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=l[z].test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
Este es solo por diversión (175-5 bytes) y no contará como respuesta:
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;}
Se basa en la primera respuesta, pero tiene un 'giro': puede saber cuántas veces se ha encontrado una palabra.
Simplemente haces así:
var b=(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;})('youaie youaie youaie youaie a word');
b.youaie //should be 4
Como eso
length
no tiene todas las vocales, no se eliminará y aún sería una respuesta para el bono.¿Como lo llamas?
"Simple": ajusta la función dentro
()
y luego la agrega('string goes here');
al final.Me gusta esto:
(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;})('a sentence youyoy iyiuyoui yoiuae oiue oiuea');
Este ejemplo devolverá una matriz solo con 1 cadena: yoiuae
Sé que esta es la peor solución, ¡pero funciona!
¿Por qué estoy contando -5?
Bueno, las matrices Javascript / JScript tienen una propiedad (
length
) en las matrices que indica la cantidad de elementos que tiene.Después de ser confirmado en la pregunta, la bonificación de -5 es para decir la cantidad de palabras.
Como el número de palabras está en esa propiedad, automáticamente tengo la puntuación de -5.
fuente
search()
lugar deindexOf()
ahorra 1 char..split()
encendido"aeiouy"
. JS recorre una matriz y una cadena de la misma manera. (Eliminarlo te ahorra ~ 10 caracteres)Rubí
3938Actualmente, la entrada de Ruby más corta al contar todo el programa, incluidas las entradas y salidas.
Guardado un char usando en
map
lugar deeach
:Otra versión, 39 caracteres con salida más bonita:
Ambos programas toman la entrada de stdin o como un nombre de archivo pasado como argumento de línea de comando:
$ ruby wovels.rb wordlist.txt
Cuesta 3 personajes adicionales para inclyde
y
como una pala.fuente
Enumerable#grep
para acortar esto? por ejemplo,s.split.grep /a*e*i*o*u*y/
suponiendo ques
es una cadena de palabras separadas por líneas nuevas..*
entre las lanas.s = "aeiouy\neiouay\nyuaioe\n"
. Luegos.split.grep /a*e*i*o*u*y/
vuelve["aeiouy", "eiouay", "yuaioe"]
por mí. Pruebas enpry
Ruby 2.0.0. Gran solución, por cierto.grep
usaba el=~
operador, pero aparentemente lo usa===
. Mi sospecha era que también coincidiría con cadenas que no contengan todas las hebras, porque por ejemplo/e*a*i*o*u*y/=~"eioy"
funciona. Realmente no entiendo qué hace realmente===
entre una expresión regular y un operador. Gran hallazgo; Te sugiero que lo publiques como respuesta tú mismo. editar Tenía razón: prueba con, por ejemplo"heya"
.Mathematica (65 o 314)
Dos enfoques muy diferentes, el mejor fue propuesto por Belisario en los comentarios a mi respuesta inicial. Primero, mi esfuerzo brutal, que genera algorítmicamente todas las expresiones regulares posibles que coinciden con una combinación de seis vocales (incluida "y"), y luego comprueba cada palabra en la lista de palabras objetivo con cada una de estas 720 expresiones regulares. Funciona, pero no es muy conciso y es lento.
~ 320 caracteres. Se podrían guardar algunos mediante la notación alternativa, y se perderán caracteres adicionales al preparar el archivo del diccionario como una lista de cadenas (el formato natural para el diccionario en Mathematica. Otros idiomas pueden no necesitar esta preparación, pero Mathematica sí). Si omitimos ese paso, suponiendo que se haya manejado para nosotros, se puede hacer el mismo enfoque en menos de 250 caracteres, y si usamos el diccionario incorporado de Mathematica, obtendremos ahorros aún mayores,
Menos de 200 caracteres. Para contar la cantidad de palabras encontradas solo se requiere pasar el resultado a
Length[Flatten[]]
, que se puede agregar alrededor de cualquier bloque de código anterior, o se puede hacer después con, por ejemploLength@Flatten@%
,. La lista de palabras especificada para este desafío da 43 coincidencias, y el diccionario de Mathematica da 64 (y es mucho más rápido). Cada diccionario tiene palabras coincidentes que no están en el otro. Mathematica encuentra "no profesionalmente", por ejemplo, que no está en la lista compartida, y la lista compartida encuentra "eucariota", que no está en el diccionario de Mathematica.Belisario propuso una solución mucho mejor. Suponiendo que la lista de palabras ya ha sido preparada y asignada a la variable
l
, define una sola prueba basada en laStringFreeQ[]
función de Mathematica , luego aplica esta prueba a la lista de palabras usando laPick[]
función. 65 caracteres, y es aproximadamente 400 veces más rápido que mi enfoque.fuente
f@u_:=And@@(!StringFreeQ[u,#]&/@Characters@"aeiouy");Pick[l,f/@l]
¿Dóndel
está la lista de palabrasy
como una vocal (¡según los requisitos de OP!)Perl 6 - 35 caracteres
Inspirado por la solución Ruby de @CarySwoveland:
Esto selecciona (
grep
s) cada línea que regresaTrue
para<a e i o u y> ⊆ *.comb
, que es sólo una forma elegante de pedir "es el conjunto de('a','e','i','o','u','y')
un subconjunto (⊆
) del conjunto componen de las letras de la entrada (*.comb
)?"En realidad, ambos
<a e i o u y>
y*.comb
solo creanList
s:⊆
(o(<=)
si estás atrapado en ASCII) los convierte enSet
s para ti.Para obtener el número de líneas impresas, este guión de 42 caracteres - 5 = 37 puntos también generará eso:
fuente
C - 96 bytes
Ahorré varios bytes de paréntesis gracias a una afortunada coincidencia de precedencia de operadores.
fuente
Javascript - Puntuación = 124 - 5 = 119 !!!
Editar: 17/02/14
¡Muchas gracias a @Ismael Miguel por ayudarme a cortar ~ 12 caracteres !
Eliminé el formulario de función de notación de flecha gruesa porque, aunque he visto que comienza a usarse, no funciona. No tengo idea de por qué ...
Para que funcione:
Pase todas las palabras separadas por nueva línea como argumento a la función como se muestra a continuación.
Prueba:
fuente
k="aeiouy".split("")
para estar dentro delfor(i in k)
bucle. Usar en;
lugar de nuevas líneas ahorra algunos bytes en Windows. Y sin embargo, no veo cómo manejará una lista de palabras. Y cómo hacer que funcione.k="aeiouy";o=0;for(i in k)
intentarloo=0;for(i in k='aeiouy')
. y el uso de la guarda bytes, puede utilizarlos para cambiaro+=RegExp(k[i]).test(s)
ao+=RegExp(k[i],'i').test(s)
, teniendo uno más bytes, pero trabajar con mayúsculas y minúsculas.Bash + coreutils, 39
Toma información de stdin.
fuente
sed 29 caracteres
Orden elegida de Frecuencia de letra en wikipedia para verificar la velocidad.
En mi anfitrión:
y
fuente
Bash (grep): 36 bytes
Tenga en cuenta el orden de las vocales probadas, menos frecuentes primero. Para el caso de prueba, esto se ejecuta aproximadamente 3 veces más rápido que la prueba en orden aeiou y. De esa manera, la primera prueba elimina una mayor cantidad de palabras, por lo que las pruebas posteriores tienen menos trabajo por hacer. Obviamente, esto no tiene ningún efecto sobre la longitud del código. Muchas de las otras soluciones publicadas aquí se beneficiarían de manera similar al hacer las pruebas en este orden.
fuente
D - 196
Sin golf :
Uso :
C:\>rdmd vowels.d wordlist.txt
wordlist.txt
debe contener las palabras de la lista en minúsculas.fuente
Rebol (104 caracteres)
Sin golf:
d
ahora contiene una lista de palabras encontradas. Aquí hay un ejemplo de la consola Rebol:fuente
Smalltalk (36/57 caracteres)
para obtener el recuento, envíe #size a la colección resultante. La colección de resultados contiene 43 palabras ('abstemiamente' 'autoritativamente' ... 'incuestionablemente' 'irreconocible')
El código anterior tiene 77 caracteres, pero podría haber cambiado el nombre del archivo de la lista de palabras a 'w', así que cuento el nombre de archivo como 1, lo que da una puntuación de 57.
¿Leer el archivo es parte del problema o no? Si no (vea otros ejemplos), y la lista de palabras ya está en una colección c, entonces el código se reduce a:
que son 36 caracteres (sin espacios en blanco omitibles).
fuente
actualizado: espacios innecesarios eliminados
Muy lento pero en bash (81 caracteres):
EDITAR:
echo $l|fold -w1
reemplazado porfold -w1<<<$l
lo sugerido por @ nyuszika7hfuente
fold -w1<<<$l
lugar deecho $l|fold -w1
. Nota: El código actual tiene 84 caracteres, no debe contar la nueva línea final.JavaScript: 95 bytes
Aquí está mi golf.
Y también me gustaría señalar que su golf no parece encontrar todas las apariciones de vocales.
Sin golf:
fuente
(?=.*a)
verificar sia
está en algún lugar de la cadena.ordenar + uniq + sed
Este no coincide con las repeticiones de una palabra. Tampoco coincide con la letra 'y' si aparece al comienzo de una palabra.
fuente
Golpetazo
No tan corto como el OP, pero una línea en Bash:
fuente
C # - 170
Formateado:
En este momento no está de humor para implementar el conteo, pero debería ser fácil.La ruta a la (versión en minúsculas de la) lista de palabras se debe pasar al programa como primer argumento:Salida:
Me tomé la libertad de mostrar y separar las palabras por comas; ninguno de los cuales se especifica en las reglas (qué estado "debe encontrar todas las palabras", no cómo (e IF) para la salida).
Recuento incluido (+ salida): 192 - 5 = 187
Salida:
(Tenga en cuenta el recuento al final: 43)
Sin salida ("debe encontrar todas las palabras"): 137 - 5 = 132
(Doblar las reglas un poco, nuevamente: no realmente) Esto encuentra todas las palabras y el conteo está disponible al ejecutar
r.Count()
.fuente
C-Sharp
Nunca he hecho esto antes y no estoy exactamente seguro de cuáles son los procedimientos de publicación. Pero esto es lo que se me ocurrió:
185 bytes
wordList
= aList<string>
de todas las palabras.si quieres mostrar un total:
219 - 5 = 214 bytes
Expandido
fuente
vb.net (Puntuación 91 = 96c - 5) * 0
* 0 + 49c min
Esto crea una enumeración que contiene todas las palabras que contienen todas las vocales.
fuente
Your program must find all the words in this wordlist
. Esto es a) no un programa, sino un fragmento de un programa yb) no lee / usa la lista de palabras.Mathematica -
136102El enlace acortado va a http://www.mieliestronk.com/corncob_lowercase.txt
fuente
http://bit.ly/1iZE9kY
.Characters["aeiou"]
o más si lo incluyey
.