Su tarea es escribir un programa que genere una lista legible de cada palabra de cinco letras con la estructura:
consonante - vocal - consonante - vocal - consonante
La salida se debe ordenar alfabéticamente con una palabra por línea y ninguna palabra repetida dos veces. Puede ser minúscula o mayúscula pero no mezclada. Entonces la lista podría comenzar y terminar así:
babab
babac
babad
...
zyzyw
zyzyx
zyzyz
Las vocales son a - e - i - o - u - y , las otras 20 letras del alfabeto inglés son consonantes.
Las palabras no tienen que ser palabras reales del diccionario.
El código más corto gana.
Nota: Hace unos años me topé con un programa en el sitio web de una universidad que hacía exactamente eso. Resulta que mi nombre y apellido se ajustan a la restricción de cvcvc, y yo mismo había estado buscando en Google.
Respuestas:
Mathematica,
726561 bytesPara las pruebas, recomiendo reemplazarlas
Print@@@
por""<>#&/@
. Luego, Mathematica mostrará un formulario truncado que muestra las primeras y últimas palabras, en lugar de tomar una eternidad para imprimir 288,000 líneas.Explicación
Finalmente encontré un uso para dividir cadenas. :)
Me ha intrigado la posibilidad de agregar o multiplicar cadenas por un tiempo, pero los casos de uso reales son bastante limitados. El punto principal es que algo como
"foo"+"bar"
o"foo"*"bar"
(y, en consecuencia, la forma abreviada"foo""bar"
) es completamente válido en Mathematica. Sin embargo, realmente no sabe qué hacer con las cadenas en las expresiones aritméticas, por lo que estas cosas permanecen sin evaluar. Sin embargo, Mathematica aplica simplificaciones generalmente aplicables. En particular, las cadenas se ordenarán en orden canónico (que está bastante desordenado en Mathematica, una vez que comience a ordenar cadenas que contienen letras de varios casos, dígitos y no letras), que a menudo es un factor decisivo, pero no importa aquí . Además,"abc""abc"
se simplificará a"abc"^2
(lo cual es un problema cuando tiene cadenas repetidas, pero tampoco tenemos eso), y algo así"abc"/"abc"
se cancelará (que incluso haremos uso de).Entonces, ¿qué estamos tratando de jugar golf aquí? Necesitamos una lista de vocales y una lista de consonantes, de modo que podamos alimentarlas
Tuples
para generar todas las combinaciones posibles. Mi primer enfoque fue la solución ingenua:Esa lista codificada de consonantes duele un poco. Mathematica tiene una función
Alphabet
incorporada que me permitiría evitarlo, si pudiera eliminar las vocales de una manera barata. Sin embargo, aquí es donde se pone difícil. La forma más sencilla de eliminar elementos esComplement
, pero eso termina siendo más largo, utilizando una de las siguientes opciones:(Tenga en cuenta que ya no necesitamos aplicar
Characters
a todo el asunto, porqueAlphabet[]
da una lista de letras, no una cadena).Así que intentemos ese negocio aritmético. Si representamos el alfabeto completo como un producto de letras en lugar de una lista, entonces podemos eliminar letras por división simple, debido a la regla de cancelación. Eso ahorra muchos bytes porque no los necesitaremos
Complement
. Además, en"a""e""i""o""u""y"
realidad es un byte más corto queCharacters@"aeiouy"
. Entonces hacemos esto con:Donde estamos almacenando los productos de consonantes y vocales en
a
yb
, respectivamente. Esto funciona escribiendo una función que multiplica todos sus argumentos##
y los divide por el producto de las vocales. Esta función se aplica a la lista del alfabeto, que pasa cada letra como un argumento separado.Hasta ahora todo bien, pero ahora tenemos
como argumento para
Tuples
, y esas cosas siguen siendo productos, no listas. Normalmente, la forma más rápida de arreglar eso es poner unList@@@
al frente, lo que convierte los productos en listas nuevamente. Desafortunadamente, agregar esos 7 bytes lo hace más largo que el enfoque ingenuo.Sin embargo, resulta que
Tuples
no le importan en absoluto los encabezados de las listas internas. Si lo haces(Sí, para un indefinido
f
). Obtendrá:Como si hubieras usado un en
List
lugar def
. Por lo tanto, podemos pasar esos productos directamenteTuples
y aún así obtener el resultado correcto. Esto ahorra 5 bytes sobre el enfoque ingenuo utilizando dos cadenas codificadas.Ahora el
"a""e""i""o""u""y"
sigue siendo bastante molesto. Pero espera, ¡también podemos guardar algunos bytes aquí! Los argumentos de nuestra función son las letras individuales. Entonces, si solo seleccionamos los argumentos correctos, podemos reutilizarlos en lugar de los literales de cadena, que es más corto para tres de ellos. Queremos argumentos#
(abreviatura de#1
),#5
,#9
,#15
,#21
y#25
. Si lo ponemos#
al final, tampoco necesitamos agregar ninguno*
para multiplicarlos, porque (regex)#\d+
es un token completo que no puede tener ningún dígito agregado. Por lo tanto, terminamos#5#9#15#21#25#
ahorrando otros 4 bytes.fuente
Tuples
truco. Eso es completamente indocumentado, ¿verdad? ¡E inesperado dado que el formulario de dos entradasTuples[list,n]
trata delist
no tener laList
cabeza (al menos para mí)!List
. El encabezado en cada nivel en las matrices generadas porTuples
será el mismo que el encabezado de la lista .Tuples[f[{1,2}, {3,4}]]
da en su{f[1, 3], f[1, 4], f[2, 3], f[2, 4]}
lugar. No está documentado que la cabeza interna sea completamente ignorada.Perl, 47 bytes
Contando el shebang como uno.
Pruébalo en línea!
fuente
say
?-M5.01
sea 'gratis'.-M5.010
. Y la parte interesante en el golf no es reemplazarprint
consay
...-E
(y posteriormentesay
) un obsequio?Python 3 - 110 bytes
Sencilla diversión en bucle :)
fuente
Ruby,
72 7152 bytesGracias a Value Ink por la idea básica, que la redujo a 60 bytes.
fuente
grep
. Si genera un rango que utiliza cadenas en minúsculas, obtendrá una secuencia de las palabras en minúsculas solamente.puts ("babab".."zyzyz").grep /#{["[^aeiouy]"]*3*"[aeiouy]"}/
para 60 bytes05AB1E ,
1816 bytes05AB1E utiliza la codificación CP-1252 .
Explicación
Para fines de prueba, recomiendo reemplazar
žP
con algunas consonantes yžO
con algunas vocales.Ejemplo usando 5 consonantes y 3 vocales
fuente
Python 2 ,
12010294 bytesPruébalo en línea!
fuente
Pure Bash, 74
Expansión directa de la llave.
Pruébalo en línea .
Si cada artículo debe estar en su propia línea, entonces tenemos:
Pure Bash, 84
fuente
PHP,
88868480 bytesincremento de cadena bonita :)
6 bytes guardados por @Christoph
recorre todas las cadenas de
bababa
azyzyz
y prueba si coinciden con el patrón. Corre con-nr
.fuente
$a="001";$a++;
algún día. Ese fue un cambio muy poco conveniente.for($s=$v=aeiouy;++$s<zyzza;)preg_match("#[^$v][$v][^$v][$v][^$v]#",$s)&&print"$s\n";
te ahorra 1 char. Lamentablemente, debe cambiar el eco para imprimir para usar&&
. Reemplazar\n
con un salto de línea real salva otro."#([^$v][$v]){2}[^$v]#"
pero no lo he probado.([^$v][$v]){2}[^$v]
no funciona en el bucle, mientras que[^$v]([$v][^$v]){2}
sí. Sin embargo, ambos funcionan de forma independiente (incluso con la variable).MATL , 21 bytes
Pruébalo en línea! (pero la salida está truncada).
fuente
11Y2'y'h2Y2yX~yyy&Z*
(¡ Pruébelo en línea! )vcvcv
patrón, nocvcvc
como se requiere. Gracias sin embargo!Python, 92 bytes
No puedo dejar
itertools
ganar. Iterative es 1 byte más largo en Python 2.fuente
Haskell,
5451 bytesmapM func list
construye todas las palabras tomando los posibles caracteres para el índice i de la lista devuelta porfunc (list!!i)
.Editar: @xnor encontró 2 bytes para guardar y mirando su solución, encontré otra.
fuente
mapM id$take 5$cycle["bcdfghjklmnpqrstvwxz","aeiouy"]
Guarda un byte.mapM(cycle["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0..4]
omapM(["bcdfghjklmnpqrstvwxz","aeiouy"]!!)[0,1,0,1,0]
. Sería bueno no codificar las vocales y las consonantes, peromapM(\n->[x|x<-['a'..'z'],elem x"aeiou"==odd n])[0..4]
no lo logra.cycle
desde su primera variante con recursión explícita ahorra un byte adicional.Brachylog , 18 bytes
Pruébalo en línea!
Explicación
fuente
g
yb
, pero al probarlo, ¿esto se debe a quej
parece negarse a tomar una lista de cadenas como entrada?:ea
Sin embargo, realmente muestra las fortalezas de Prolog / Brachylog, y es un paso que la mayoría de los otros idiomas encuentran mucho más difícil.g
yb
se necesitaban.j
parece estar molesto y esto se debe una vez más a la dificultad de distinguir una lista de argumentos de solo una lista. Podría arreglar esto, aunque esto una vez más complicará la implementación. También podría no solucionarlo e invertir mi tiempo en solucionar el problema central en una nueva versión de Brachylog.JavaScript (ES6),
9190 bytesEdiciones
for
declaraciónExplicación
Esto define una función recursiva de 5 profundidades que usa la paridad de su profundidad de llamada para determinar si iterar vocales o consonantes. En cada iteración, verifica si debe repetirse o imprimirse verificando la cantidad de recursiones restantes, y concatena la letra de su iteración actual al final de la cadena de 5 caracteres que se está construyendo actualmente en profundidad.
Solución alternativa de 89 bytes asumiendo la codificación ISO8859-1:
Solución alternativa de 96 bytes que devuelve la salida completa como una sola cadena:
Corre bajo tu propio riesgo. Para la solución de 91 bytes, simplemente use
f()
y para la alternativa de 97 bytes, useconsole.log(f())
.fuente
f=(s='',i=2)=>(for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))for(q of i?f(s+c,i-1):[s+c])q)
desafortunadamente, usar el formulario estándar es un byte más largo:function*f(s='',i=2){for(c of(i%2?'aeiouy':'bcdfghjklmnpqrstvwxz'))yield*i?f(s+c,i-1):[s+c]}
todavía espero el día en que un generador sea la opción más corta ...for...of
declaración para guardar un byteC,
201199186184183169163 bytesHaciéndolo un poco diferente que con el método de conteo básico anterior:
Sin golf:
Y escrito de una manera un poco más convencional:
Básicamente, yo soy los contadores, y s la matriz de cadenas que contiene todos los caracteres sobre los que debemos iterar, para cada contador. El truco es el bucle while interno : se usa para incrementar los contadores, comenzando por el más a la derecha. Si vemos que el siguiente carácter que deberíamos mostrar es el carácter nulo final, reiniciaremos el contador a cero y el "carry" se propagará al siguiente contador.
Gracias cristoph!
fuente
char *c
Creo que el espacio es innecesario.f(){char*c="bcdfghjklmnpqrstvwxz",*v="aeiouy",i[]={0,0,0,0,0},*s[]={c,v,c,v,c},j=0;while(j>=0){for(j=0;j<5;++j)putchar(s[j][i[j]]);for(;--j>=0&&!s[j][++i[j]];)i[j]=0;puts("");}}
te lleva a 177. Vamos, puedes hacerlo aún mejor;).i[5]={0}
lugar dei[]={0,0,0,0,0}
guardar 7 bytes.Perl, 71 bytes
Pruébalo en línea!
Explicación
Agregaré más explicaciones más tarde.
map{push@{1+/[aeiouy]/},$_}a..z;
crea dos matrices:@1
contiene las consonantes y@2
contiene las vocales.glob
Cuando llame con argumentos como,{a,b}{c,d}
devuelve todas las permutaciones de los elementos entre llaves.fuente
Befunge, 95 bytes
Pruébalo en línea! , aunque tenga en cuenta que la salida se truncará.
Esto es solo un bucle en el rango de 0 a 287999, generando el índice como un número mixto 20-6-20-6-20, con los "dígitos" del número recuperado de las tablas en las últimas dos líneas.
fuente
Perl 6 , 70 bytes
Explicación de la parte interesante:
El código anterior solo genera la lista de vocales (
$_
) y la lista de consonantes (c
), que lamentablemente es detallada.fuente
Python 2 ,
120117 bytesGracias a @WheatWizard por la sugerencia de pestañas.
Pruébalo en línea!
No estoy seguro de que se pueda jugar mucho al golf. Pruébelo en línea se trunca a 128 KB pero muestra lo suficiente como para dar una idea. Una ejecución local con código de depuración para contar las palabras dio un total de 288000. Se ejecuta en aproximadamente 45 segundos si alguien quiere probar.
Versión no compatible y, por lo tanto, no competitiva (imprime matrices anidadas en lugar del formato especificado) para 110 bytes:
fuente
Perl 6, 53 bytes
Toma un poco de tiempo tener alguna salida. Muy ineficiente Hace el trabajo.
fuente
xeger , 49 bytes
Dada una expresión regular, xeger simplemente genera todas las cadenas coincidentes. Para no matar el navegador, se detiene cada 1000 salidas y debe hacer clic para continuar, pero eventualmente llegará allí.
Aquí hay una versión de 23 bytes con un error
^
corregido:Estas son clases de caracteres "todas las consonantes ASCII en minúsculas"
[:c]
cony
excluido^y
, y "todas las vocales ASCII en minúscula"[:v:]
cony
agregado.fuente
&
.[bcdfghj-np-tvwxz]
.JavaScript (Firefox 30-57), 82 bytes
Devuelve una matriz de cadenas. Versión muy rápido para
102101 (1 byte gracias a @ETHproductions) Bytes:fuente
CJam ,
32312928 bytesAhorró 2 bytes gracias a Martin Ender y 1 byte gracias a kaine
Pruébalo en línea! (Tenga en cuenta que la salida se corta en TIO)
Explicación
fuente
'{,97>
para obtener el alfabeto Y luego"aeiouy"_'{,97>^
guardar otro byte1$
.Apilado, no competitivo, 51 bytes
Bastante simple. Pruébalo aquí!
fuente
Perl,
635954 bytesProbar Perl golf para variar.
EDITAR: Parece que todavía tengo mucho que aprender ... :)
fuente
/$b[^$a]/&&say for"a"x5.."z"x5
para guardar algunos bytes. Editar: y puede soltar el$b
y hacer$a="aeiouy";/([^$a][$a]){2}[^$a]/&&say for"a"x5.."z"x5
.aeiouy
. Además, dado que su expresión regular verifica 5 caracteres, puede hacerloa.."z"x5
.$a
y$b
como nombres de variables, porque esos no necesitan ser declarados incluso en modo estricto ... :) También uso mucho Perl 6 en estos días, que ni siquiera tiene un modo no estricto.Scala,
8786 bytesfuente
f"$c$d$e$f$g"
con""+c+d+e+f+g
para guardar un byte.R,
143132 bytesEsta es mi primera vez en Code Golf, así que agradecería cualquier sugerencia para reducirlo aún más. Hasta ahora todo es bastante estándar R; Lo único posiblemente complicado aquí es que paste0 recicla sus argumentos a la longitud del más largo.
Editar: truco de asignación usado de rturnbull, reemplazado
sapply(x,length)
porlengths
.fuente
R,
11198 bytesAgregado
y
como vocal y con 13 bytes de golf, gracias a @Patrick B.Usamos
expand.grid
para generar todas las combinaciones posibles deV
yC
en una matriz, que definimos a partir de la variable preestablecidaletters
(el alfabeto). Revertimos las combinaciones (ya que el valor predeterminado es que la primera variable gire más rápido) para garantizar el orden alfabético. Luego iteramos a través de cada fila de la matriz, imprimiendo cada letra en stdout. Usamos elfill
argumento paracat
asegurarnos de que cada palabra comience en una nueva línea.fuente
Clojure, 101 bytes
No es tan emocionante ...
fuente
Rubí,
6561 bytesEnfoque completamente diferente:
Cosas nuevas que aprendí hoy: la función de producto Array #
fuente
C 361 bytes
Versión sin golf:
Debe haber alguna forma de acortar esto definitivamente.
Explicación
fuente