Descrição da tarefa
Às vezes, você realmente precisa ajustar algo que está escrevendo em um espaço pequeno. Pode ser tentador abandonar as vogais e escrever coisas erradas - e na falta disso, quem realmente precisa de espaços? Thssprfctlrdbl! †
Escreva uma função ou programa que remova vogais em minúsculas aeiou
, espaços e, em seguida, qualquer caractere de uma sequência de entrada . Além disso, cada vez que você remove um personagem, ele deve ser o personagem mais à direita elegível para remoção. Ele deve repetir esse processo até que a string não tenha mais que um determinado comprimento de entrada .
† “Isso é perfeitamente legível!” Mas se você está lendo esta nota de rodapé, provavelmente não é, realmente ... :)
Exemplos
Aqui, você pode ver esse processo aplicado para tamanhos de entrada sucessivamente menores:
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.)
Depois de espremer a string para 17 caracteres, ficamos sem vogais para removê-las, portanto o próximo caractere que removemos é o espaço mais à direita; quando atingimos 14 caracteres, removemos todas as vogais e espaços, então começamos a mastigar a corda da direita para a esquerda.
Aqui está um código Python com pseudocódigo que resolve esse desafio:
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
Regras
Isso é código-golfe , então o código mais curto em bytes vence.
A sequência de entrada consistirá nos caracteres ASCII imprimíveis do espaço (
, decimal 32) até e incluindo o til (
~
, decimal 126). Não haverá vogais maiúsculasAEIOU
na string. Em particular, não haverá Unicode, guias ou novas linhas envolvidas.Chame a sequência de entrada s e o comprimento do destino de entrada t . Então 0 <t ≤ comprimento ( s ) ≤ 10000 é garantido. (Em particular, a sequência de entrada nunca estará vazia. Se t = comprimento ( ões ), você deve retornar a sequência sem modificação.)
Casos de teste
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
uma vogal?aeiou
são vogais eAEIOU
não ocorrerão por simplicidade. (A coisa toda em maiúsculas / minúsculas não é o que eu quero focar.) Adicionei esclarecimentos.w
(por exemplo, na palavra co w ,w
é uma vogal!) É claro que isso está resolvido para esta, mas para onde não está declarado que o conjunto de vogais éaeiou
, às vezes você deve incluiry
ew
. : -Ofor index, char in enumerate(string)
, em vez darange(len(str))
construçãoRespostas:
MATL , 20 bytes
Experimente online!
fonte
Perl,
484543 bytesInclui +4 para
-Xlpi
(-X pode ser deixado de fora, mas deixa avisos feios em STDERR)Execute o número após a
-i
opção e a entrada STDIN (também suporta várias linhas). por exemploperl -Xlpi50 crunch.pl <<< "Duis commodo scelerisque ex, ac consectetur metus rhoncus."
crunch.pl
:fonte
/$+/
ewhile
JavaScript (ES6),
6661 bytesGuardado 5 bytes graças a @Neil
Não acho que o regex seja ainda mais jogável. Surpreendentemente, o menor tempo possível para remover a frente para trás é um byte mais longo:
Tentativa mais interessante (ES7), 134 bytes
Isso usa uma abordagem semelhante à resposta MATL.
fonte
|.$/,"$1$2"
para salvar 5 bytes.sh + gnu sed,
7861Forneça a string para
STDIN
, o comprimento como primeiro argumento.fonte
Lua, 120 bytes
Recebe entrada como argumentos de linha de comando, no formato
lua crunch.lua 10 "This is a string"
, com saídaThs sstrng
.Explicação:
fonte
Perl, 68
Remover da direita adiciona uma tonelada de caracteres, talvez haja uma maneira melhor de fazer isso.
Use
-i
para inserir o número. É 65 caracteres mais 3 para oi
,p
el
na linha de comando.Correr com:
fonte
y///c
vez delength
e pode mover o loop while até o fim:s///||s///||s///while$^I<y///c
Java 8, 303 bytes
Isso é muito longo. Vou tentar encurtar em breve. Seria muito mais curto se o java tivesse um método para reverter seqüências de caracteres e substituições anteriores.
Teste com o seguinte:
fonte
s->j->{...}
). Acho que o Java não suporta muito bem ou estou configurando errado.C #, 180 bytes
Testador:
fonte
Scala, 160 bytes
Testador:
fonte
Dyalog APL,
774542 bytest[
…]
Letras de t com índices ...t←⌽⍞
t obtém entrada de texto invertidai←⍳⍴t
i obtém índices de comprimento de t/¨⊂i
várias (3) seleções booleanas de elementos de i :1.
(t∊'aeiou')
booleano onde vogal2.
(' '=t)
booleano onde espaço3.
1
todos∪∊
exclusivos do alistado ( nivelado) 3 seleções⌽⎕↓⌽
eliminam os últimos caracteres introduzidos avaliados (o mesmo que(-⎕)↓
)⌽i~
invertem os índices restantes após remover algunsResposta original:
Ehm, sim, isso é um pouco difícil de ler. Basicamente, a tradução direta do OP no APL:
fonte
Mathematica, 201 bytes
Deve haver uma maneira melhor do que isso ..
fonte
R,
169143 bytes* editar economizou 36 bytes através de reescrever com
utf8ToInt
->intToUtf8
conversões nãostrstplit
epaste0(...,collapse)
ungolfed com explicação
fonte