Descripción de la tarea
A veces, realmente necesitas adaptar algo que estás escribiendo en un espacio pequeño. Puede ser tentador abandonar las vocales y las palabras, y en su defecto, ¿quién realmente necesita espacios? Thssprfctlrdbl! †
Escriba una función o programa que elimine las vocales en minúsculas aeiou
, y luego los espacios, y luego los caracteres de una cadena de entrada . Además, cada vez que eliminas un personaje, debe ser el personaje más adecuado para eliminarlo. Debe repetir este proceso hasta que la cadena no supere una longitud de entrada determinada .
† “¡Esto es perfectamente legible!” Pero si estás leyendo esta nota al pie, probablemente no lo sea, realmente ... :)
Ejemplos
Aquí, puede ver este proceso aplicado para tamaños de entrada sucesivamente más pequeños:
23: Hello, Code Golf World!
22: Hello, Code Golf Wrld!
21: Hello, Code Glf Wrld!
20: Hello, Cod Glf Wrld!
19: Hello, Cd Glf Wrld!
18: Hell, Cd Glf Wrld!
17: Hll, Cd Glf Wrld!
16: Hll, Cd GlfWrld!
15: Hll, CdGlfWrld!
14: Hll,CdGlfWrld!
13: Hll,CdGlfWrld
12: Hll,CdGlfWrl
11: Hll,CdGlfWr
(etc.)
Después de apretar la cadena hasta 17 caracteres, nos quedamos sin vocales para eliminar, por lo que el siguiente carácter que eliminamos es el espacio más a la derecha; Cuando llegamos a 14 caracteres, hemos eliminado todas las vocales y espacios, por lo que simplemente comenzamos a masticar la cadena de derecha a izquierda.
Aquí hay un código pseudocódigo de Python que resuelve este desafío:
def crunch_string(string, to_length):
while len(string) > to_length:
# Store the best candidate index for deletion here.
best = None
# First, find the rightmost vowel's index.
for i in range(len(string)):
if string[i] in 'aeiou':
best = i
# If there were no vowels, find the rightmost space's index.
if best is None:
for i in range(len(string)):
if string[i] == ' ':
best = i
# If there were no spaces either, use the final index.
if best is None:
best = len(string) - 1
# Remove the selected character from the string.
string = string[:best] + string[best + 1:]
# Return the string once `len(string) <= to_length`.
return string
Reglas
Este es el código de golf , por lo que gana el código más corto en bytes.
La cadena de entrada consistirá en los caracteres ASCII imprimibles desde el espacio (
decimal 32) hasta tilde (inclusive
~
, decimal 126). No habrá vocales mayúsculasAEIOU
en la cadena. En particular, no habrá Unicode, pestañas o nuevas líneas involucradas.Llame a la cadena de entrada s , y la longitud del objetivo de entrada t . Entonces 0 <t ≤ longitud ( s ) ≤ 10000 está garantizado. (En particular, la cadena de entrada nunca estará vacía. Si t = longitud ( s ), simplemente debe devolver la cadena sin modificar).
Casos de prueba
Input: 50, Duis commodo scelerisque ex, ac consectetur metus rhoncus.
Output: Duis commodo scelerisque ex, ac cnscttr mts rhncs.
Input: 20, Maecenas tincidunt dictum nunc id facilisis.
Output: Mcnstncdntdctmnncdfc
Input: 150, golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf
Output: glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glfglfglfglfglfglfglfglfglfglf
y
una vocal?aeiou
son vocales, yAEIOU
no ocurrirán, por simplicidad. (Todo el asunto en mayúsculas / minúsculas no es en lo que quiero centrarme). Agregué una aclaración.w
(por ejemplo, en la palabra co w , ¡w
es una vocal!) Por supuesto, eso está resuelto para este, pero para donde no se dice que el conjunto de vocales esaeiou
, a veces debes incluiry
yw
. : -Ofor index, char in enumerate(string)
lugar de larange(len(str))
construcciónRespuestas:
MATL , 20 bytes
Pruébalo en línea!
fuente
Perl,
484543 bytesIncluye +4 para
-Xlpi
(-X puede omitirse pero deja advertencias feas en STDERR)Ejecute con el número después de la
-i
opción y la entrada en STDIN (también admite varias líneas). p.ejperl -Xlpi50 crunch.pl <<< "Duis commodo scelerisque ex, ac consectetur metus rhoncus."
crunch.pl
:fuente
/$+/
ywhile
JavaScript (ES6),
6661 bytesGuardado 5 bytes gracias a @Neil
No creo que la expresión regular sea golfable aún más. Sorprendentemente, lo más corto que puedo encontrar para eliminar de adelante hacia atrás es un byte más largo:
Intento más interesante (ES7), 134 bytes
Esto utiliza un enfoque similar a la respuesta MATL.
fuente
|.$/,"$1$2"
para guardar 5 bytes.sh + gnu sed,
7861Proporcione la cadena a
STDIN
, la longitud como primer argumento.fuente
Lua, 120 bytes
Toma entrada como argumentos de línea de comando, en el formato
lua crunch.lua 10 "This is a string"
, con salidaThs sstrng
.Explicación:
fuente
Perl, 68
Al eliminar desde la derecha se agregan una tonelada de caracteres, tal vez haya una mejor manera de hacerlo.
Use
-i
para ingresar el número. Es 65 caracteres más 3 para eli
,p
yl
en la línea de comandos.Corre con:
fuente
y///c
lugar delength
y puede mover el ciclo while hasta el final:s///||s///||s///while$^I<y///c
Java 8, 303 bytes
Esto es demasiado largo. Trataré de acortarlo pronto. Sería mucho más corto si Java tuviera un método para invertir cadenas y reemplazos hacia atrás.
Prueba con lo siguiente:
fuente
s->j->{...}
). Creo que Java no lo admite muy bien o lo estoy configurando mal.C #, 180 bytes
Ensayador:
fuente
Scala, 160 bytes
Ensayador:
fuente
Dyalog APL,
774542 bytest[
…]
Letras de t con índices ...t←⌽⍞
t obtiene una entrada de texto invertidai←⍳⍴t
i obtiene índices de longitud de t/¨⊂i
múltiples (3) selecciones booleanas de elementos de i :1.
(t∊'aeiou')
booleano donde vocal2.
(' '=t)
booleano donde espacio3.
1
todos∪∊
únicos de los enlistados ( aplanado) 3 selecciones eliminan los⌽⎕↓⌽
últimos caracteres ingresados evaluados (igual que(-⎕)↓
)⌽i~
invierten los índices restantes después de eliminar algunosRespuesta original:
Ehm, sí, eso es un poco difícil de leer. Básicamente, la traducción directa de OP a APL:
fuente
Mathematica, 201 Bytes
Debe haber una mejor manera que esta ...
fuente
R,
169143bytes* editar guardado 36 bytes a través de reescribir con
utf8ToInt
->intToUtf8
conversiones nostrstplit
ypaste0(...,collapse)
no golfed con explicación
fuente