No me gustan las cuerdas con más de tres vocales seguidas. ¿Puedes escribir un programa que elimine todas las vocales que no quiero de las palabras?
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).
La entrada es una cadena que contiene solo caracteres ASCII imprimibles (0x20 a 0x7E, inclusive).
La salida es una cadena que contiene solo corridas de como máximo 3 vocales consecutivas. Si hay una ejecución de más de 3 vocales consecutivas en la cadena de entrada, su programa debe producir una cadena de salida que incluya las primeras tres vocales encontradas en esa ejecución, descartando cualquier otra vocal consecutiva.
Y no es una vocal para los propósitos de este desafío.
Este es el código de golf, por lo que gana el código más corto (en bytes).
Casos de prueba
"Aeiou" => "Aei"
"screeeen" => "screeen"
"We're queueing up for the Hawaiian movie." => "We're queung up for the Hawaiin movie."
"Spaces break runs: aei iou." => "Spaces break runs: aei iou."
aaYYAAaaaAERGH
.Respuestas:
Pyth, 21 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
Repito todos los caracteres y hago un seguimiento de cuántas vocales pasé usando un contador. Cada vez que paso un carácter, que no es una vocal, restablezco el contador a 0. Revoco los caracteres, siempre que el contador sea> 4.
fuente
Ilegible , 1647 bytes
Explicación
Este programa es equivalente a un pseudocódigo como este:
con las siguientes asignaciones variables:
Como puede ver, evité la ranura variable 0 porque
0
es una constante muy larga para escribir.Entonces leemos cada carácter y almacenamos el valor en ambos
cp
ych
. Lo modificaremos,cp
pero lo conservaremosch
para poder imprimirlo si es necesario. Seguidamente restamos los números 65, 4, 4, 6, etc.cp
para verificar si se trata de cada uno de los 10 posibles caracteres vocales en ASCII (tenga en cuenta que el último no necesita ser una asignación).vs
siempre contiene 3 menos que el número de vocales que aún se pueden imprimir. Comienza en0
, por lo que se pueden imprimir 3 vocales. Cuando llega-3
, dejamos de imprimir vocales.Si nos encontramos con una no vocal (incluido el espacio), ejecutamos
print(ch)
seguido devs = 0
. Como probablemente haya adivinado, esto restablece el contador de vocales.Si encontramos una vocal , ejecutamos
((--vs)+4) ? print(ch) : (++vs)
. Analicemos esto:vs
;-4
, hemos ido demasiado lejos, así que no imprima nada, pero incremente devs
nuevo para-3
que sigamos negándonos a imprimir vocales;fuente
Retina , 25 bytes
Pruébalo en línea.
Sustitución de expresiones regulares bastante sencilla. Esto también funciona para el mismo número de bytes:
fuente
JavaScript (ES6), 42
Como una función anónima
fuente
Perl, 27 caracteres.
(Código de 26 caracteres + opción de línea de comando de 1 carácter)
No es gran cosa, solo una rara ocasión que recuerdo
\K
existe.Ejecución de muestra:
fuente
\K
". :)s/([aeiou]{1,3})(?1)+/$1/gi
.En serio, 34 bytes
Hex Dump:
Pruébalo en línea
Utiliza el mismo algoritmo que la respuesta de Pyth, mapea sobre la cadena mientras realiza un seguimiento de la longitud de la ejecución actual de vocales en un registro, incrementándola cada vez que el carácter actual es una vocal y verificando si ha excedido la longitud permitida, devolviendo 0 si es así, y luego filtrando la cadena original con este filtro generado. Será mucho más corto una vez que podamos usar la resta de conjuntos en las cadenas. (Se
Ok
puede eliminar yOkd
se puede reemplazar por solo@
). Escuché que esta característica llegará en la próxima actualización ...fuente
C, 166 bytes
No es la respuesta más corta con diferencia, pero creo que muy bien ...
caso de prueba:
fuente
Mathematica, 68 bytes
La respuesta regex tendría la misma longitud, pero ¿quién usa regex?
fuente
Java, 115 bytes
Espera entrada como parámetro del programa.
Salida de prueba de la unidad:
fuente
String[]
ya
.String[]a
print
lugar deprintln
. No creo que la especificación requiera una nueva línea final.APL, 40 caracteres
En inglés:
'aeiouAEIOU'∊⍨' ',⍵
: encuentra las vocales (y antepone un espacio para romper en la rotación);(1-⍳4)⌽¨⊂
: rotar 0, 1, 2, 3 veces (con envoltura) empujando hacia la derecha el vector booleano;⊃+/ sum
: las rotaciones y unbox1↓4≠
: encuentre el diferente de 4 y elimine el primero (para ocupar el espacio que anteponemos)⍵/⍨
: en el argumento, mantenga solo el elemento donde la suma fue diferente de 4.fuente
Perl 6 ,
3635 bytesuso:
fuente
C (205 bytes)
(Se agregó un salto de línea para mayor claridad)
fuente
Scala, 107 bytes
fuente
Javascript ES6, 43 caracteres
Prueba:
fuente
Archivo x86 MS-DOS .COM ,
44 bytes36 bytesLos archivos .COM son ampliamente compatibles desde MS-DOS 1 hasta el presente --- Estoy ejecutando en dosemu, usando solo los comandos 8086.
Reducido de 44 a 36 bytes usando REPNE SCASB para probar vocales en lugar de usar un comando separado para probar cada vocal.
fuente
Matlab / Octave, 54 bytes
Ejemplo:
Pruébalo en ideone .
fuente
V , 21 bytes (sin competencia)
Pruébalo en línea!
Explicación:
Esto es apenas más corto que la solución más sencilla:
(22 bytes)
fuente
Ruby, 44 bytes
Ejemplo:
fuente
$<.read
para que maneje la entrada multilínea (por lo tanto, contiene caracteres fuera de rango 0x0a) en lugar degets
?