Écrire une fonction qui renvoie le passé du verbe donné

14

Défi

Écrivez une fonction qui prend un argument qui est un verbe et retourne le passé du verbe. (Supposons que le verbe soit régulier)

Passé

Remarque: considérez y comme ni consonne ni voyelle.

Normalement, il suffit d'ajouter ed après la fin du verbe fait le passé du verbe.

Ex: jumpjumped,askasked

Cependant, il existe d'autres règles.

  • Si le dernier caractère du verbe donné est e, ajoutez simplementd .

    Ex: loveloved,movemoved

  • Si le verbe se termine par une consonne + y, passez yà iet ajoutez ed.

    Ex: studystudied,crycried

  • Cependant, si le verbe se termine par une voyelle + y, ajoutez simplement ed.

    Ex: playplayed,staystayed

  • Si un verbe se termine par une voyelle et une consonne, écrivez la consonne une fois de plus et ajoutez ed .

    Ex: stopstopped,planplanned

  • Cependant, si un verbe se termine par plusieurs voyelles + une consonne ou une voyelle unique + plusieurs consonnes, ajoutez simplement ed .

    Ex: looklooked,jumpjumped

Il y a plus de règles mais attention aux règles ci-dessus uniquement. Par exemple, selon la règle ci-dessus, visitvisitted .

Gagnant

Puisqu'il s'agit de code golf, le code le plus court qui renvoie correctement les temps passés gagne.

Exemple (JS, 127)

function f(x){return x.replace(/([^aeiouy])y$/,'$1i').replace(/([^aeiouy][aeiou])([^aeiouy])$/,'$1$2$2').replace(/e$/,'')+'ed'}

JiminP
la source
Voilà un beau défi.
FUZxxl
stemming inverse! intéressant! J'essaierai de faire un essai quand je
rentrerai à la
Toute solution inférieure à 1800 caractères est incorrecte (verbes irréguliers).
Quandary
@Quandary C'est pourquoi j'ai dit '(supposons que le verbe est régulier)'
JiminP
@Quandary: Pas tout à fait vrai ... voir la réponse de Bélisaire .
Simon

Réponses:

6

sed, 76 caractères

Un script sed compte-t-il comme une fonction pour ce problème?

s/\([^aeiou]\)y$/\1i/
s/\([^aeiou][aeiou]\)\([^aeiouy]\)$/\1\2\2/
s/e\?$/ed/
migimaru
la source
4

Mathematica 43 caractères

f=WordData[#,"InflectedForms","List"][[1]]&

Usage:

f /@ {"call", "try", "use", "wash", "play", "stop", "look"}

{"called", "tried", "used", "washed", "played", "stopped", "looked"}

Aussi:

f /@ {"buy", "run", "swim"}

{"bought", "ran", "swam"}
Dr. belisarius
la source
Vous ne pensez pas qu'une recherche dans un dictionnaire triche un peu? :-)
Simon
3
@Simon Certainement pas. WordData fait partie du langage :)
Dr. belisarius
3

Groovy - 111 caractères

v={it==~'[aeiou]'};p={s->r=s[0..-2];a=s[-1];b=v s[-2];(a=='e'?r:a=='y'?!b?r+'i':s:v(s[-3])|!b|v(a)?s:s+a)+'ed'}

assert ['jump', 'ask', 'love', 'move', 'study', 'cry', 'play', 'stay', 'stop', 'plan', 'look'].collect { p(it) } == ['jumped', 'asked', 'loved', 'moved', 'studied', 'cried', 'played', 'stayed', 'stopped', 'planned', 'looked']
Armand
la source
2

Perl 5 (82 caractères):

sub f{$_=pop;$C='[^aeiouy]';s/($C)y$/$1i/;s/($C[aeiou])($C)$/$1$2$2/;s/e?$/ed/;$_}

Je suis sûr que cela peut être amélioré.

Prakash K
la source
2

C - 120 119 caractères

Dans le style C typique, la fonction f met à jour un tampon de chaîne en place, en supposant que l'appelant a réservé suffisamment d'espace pour jusqu'à trois caractères supplémentaires. Le deuxième argument doit être donné comme 0. La déclaration de la variable d'état globale lest incluse dans le nombre total de caractères.

#include <stdio.h>
#include <string.h>

l;void f(b,i)char*b;{*b?f(b+1,i/2+4*!strchr("aeiouy",l=*b)):(i-5?*--b=l=='y'&i/2?'i':l:(*b=l),strcpy(b+=l!='e',"ed"));}

int main()
{
  char b[10000];
  while (gets(b)) {
    f(b,0);
    puts(b);
  }
  return 0;
}

Explication: La fonction parcourt les caractères récursivement. Le deuxième argument icode lequel des trois caractères précédents étaient des consonnes dans ses trois bits inférieurs. À la fin de la chaîne, si i==5alors les trois derniers caractères étaient une consonne, une voyelle et une consonne, et donc le dernier caractère doit être dupliqué. De même, si le bit 1 de iindique que l'avant-dernier caractère était une consonne et que le dernier caractère est «y», alors le «y» est remplacé par «i».

han
la source
1

Scala 199 273 caractères

def v(c:Char)="aeiouy" contains c
def p(o:String)={val s=o.reverse
if(s(0)=='e')o+"d"else
if(!v(s(1))&& s(0)=='y')o.replaceAll("y$","ied")else
if(!v(s(0))&& v(s(1))&& !v(s(2)))o+s(0)+"ed"else
o+"ed"}

Invocation:

val li = List ("move", "cry", "plan", "play", "look")
li map p

Ma première approche a été beaucoup plus longue, en déplaçant la cascade if-else vers une liste => vers une fonction:

type S=String
def f(l:List[(Boolean,S)]):S=if(l(0)._1)l(0)._2 else f(l.tail)
def v(c:Char)="aeiouy" contains c
def c(o:S)={val s=o.reverse
f(List((s(0)=='e',o+"d"),(!v(s(1))&& s(0)=='y',o.replaceAll("y$","ied")),(!v(s(0))&& v(s(1))&& !v(s(2)),o+s(0)+"ed"),(true,o+"ed")))}

Peut-être que l'approche est intéressante. Dégouliné et expliqué:

// just for shortening
type S=String
/* take a list of Booleans and Strings, and return early
   if a Boolean is true. This approach would work, 
   if there where much more conditions, I guess.
*/
def doFirst (list: List[(Boolean, S)]): S =
  if (list(0)._1) list(0)._2 else doFirst (list.tail)
// vocal - is it a vocal
def v(c:Char)="aeiouy" contains c
// here is the key function
def toPast(o:S)={
  // reversing the String allows easy access to the last elements, 
  // without considering how long the string is.
  val s=o.reverse
  doFirst (List (
    (s(0)=='e', o+"d"),
    (!v(s(1)) && s(0)=='y', o.replaceAll("y$","ied")),
    (!v(s(0)) && v(s(1)) && !v(s(2)), o+s(0)+"ed"),
    (true, o+"ed")
  ))}
Utilisateur inconnu
la source
0

Ruby, 101 caractères

Peut probablement être plus petit.

def f x;x.sub(/([^aeiouy])y$/,'\1i').sub(/([^aeiouy][aeiou])([^aeiouy])$/,'\1\2\2').sub(/e$/,'')+'ed';end

Usage:

f("try")  #=> "tried"
f"call"   #=> "called"
LBg
la source
Utilisez la syntaxe lambda de Ruby 1.9 f=->(x){...}pour obtenir un code plus court. Aussi à aeiouymon humble avis devrait être une constante.
Hauleth
0

Merde - 72 caractères

f[s]s^6pow>4<<last&8*(/"ed""id""eid"/|out|flush)+rep'y'1-2-3"aeiou"ord#s
Thomas Eding
la source
0

Python - 147

def f (v): T, x, m = 'aeiou', "ed", v [-1]; return [[[v + x, v + m + x] [v [-2] dans T et m et v [-3] pas en T], [v + x, v [: - 1] + "ied"] [v [-2] pas en T]] [m == 'y'], v + "d "] [m == 'e']  
Homme de codage
la source