Desafio
Escreva uma função que use um argumento que seja um verbo e retorne o tempo passado do verbo. (Suponha que o verbo seja regular)
Pretérito
Nota: considere y como nem consoante nem vogal.
Normalmente, apenas a adição ed
após o final do verbo torna o pretérito do verbo.
Ex: jump
→ jumped
, ask
→asked
No entanto, existem outras regras.
Se o último caractere do verbo fornecido for
e
, basta adicionard
.Ex:
love
→loved
,move
→moved
Se o verbo terminar com uma consoante +
y
, alterey
parai
e adicioneed
.Ex:
study
→studied
,cry
→cried
No entanto, se o verbo terminar com uma vogal +
y
, basta adicionared
.Ex:
play
→played
,stay
→stayed
Se um verbo terminar com uma vogal e uma consoante, escreva a consoante mais uma vez e adicione
ed
.Ex:
stop
→stopped
,plan
→planned
No entanto, se um verbo terminar com várias vogais + uma consoante ou vogal única + várias consoantes, basta adicionar
ed
.Ex:
look
→looked
,jump
→jumped
Existem mais regras, mas vamos cuidar apenas das regras. Por exemplo, de acordo com a regra acima, visit
→ visitted
.
Vencedora
Como esse é o código de golfe, o código mais curto que retorna corretamente os tempos passados vence.
Exemplo (JS, 127)
function f(x){return x.replace(/([^aeiouy])y$/,'$1i').replace(/([^aeiouy][aeiou])([^aeiouy])$/,'$1$2$2').replace(/e$/,'')+'ed'}
Respostas:
sed, 76 caracteres
Um script sed conta como uma função para esse problema?
fonte
Mathematica 43 chars
Uso:
Além disso:
fonte
Groovy - 111 caracteres
fonte
Perl 5 (82 caracteres):
Estou certo de que pode ser melhorado.
fonte
C -
120119 caracteresNo estilo C típico, a função f atualiza um buffer de sequência, assumindo que o chamador tenha reservado espaço suficiente para até três caracteres extras. O segundo argumento deve ser dado como 0. A declaração da variável de estado global
l
está incluída na contagem total de caracteres.Explicação: A função repete os caracteres recursivamente. O segundo argumento
i
codifica quais dos três caracteres anteriores eram consoantes em seus três bits inferiores. No final da cadeia, sei==5
os três últimos caracteres eram uma consoante, uma vogal e uma consoante e, portanto, o último caractere deve ser duplicado. Da mesma forma, se o bit 1 dei
indicar que o penúltimo caractere era uma consoante e o último caractere é 'y', o 'y' é substituído por 'i'.fonte
Scala 199
273charsInvocação:
Minha primeira abordagem foi muito mais longa, movendo a cascata if-else para uma lista => para uma função:
Talvez a abordagem seja interessante. Degolfado e explicado:
fonte
Ruby, 101 caracteres
Provavelmente pode ser menor.
Uso:
fonte
f=->(x){...}
para obter um código mais curto.aeiouy
IMHO também deve ser uma constante.Cocô - 72 caracteres
fonte
Python - 147
fonte