Escriba una función que devuelva el tiempo pasado del verbo dado

14

Desafío

Escriba una función que tome un argumento que sea un verbo y devuelva el tiempo pasado del verbo. (Suponga que el verbo es regular)

Pasado

Nota: considere y como consonante ni vocal.

Normalmente, solo agregar eddespués del final del verbo hace que el verbo sea en tiempo pasado.

Ej: jumpjumped, askasked

Sin embargo, hay otras reglas.

  • Si el último carácter del verbo dado es e, simplemente agregue d.

    Ej: loveloved, movemoved

  • Si el verbo termina con una consonante + y, entonces cambie ya iy agregue ed.

    Ej: studystudied, crycried

  • Sin embargo, si el verbo termina con una vocal + y, entonces simplemente agregue ed.

    Ej: playplayed, staystayed

  • Si un verbo termina con una vocal y una consonante, entonces escríbela una vez más y suma ed.

    Ej: stopstopped, planplanned

  • Sin embargo, si un verbo termina con varias vocales + una consonante o una sola vocal + varias consonantes, entonces simplemente agregue ed.

    Ej: looklooked, jumpjumped

Hay más reglas, pero cuidemos solo las reglas anteriores. Por ejemplo, de acuerdo con la regla anterior, visitvisitted.

Ganador

Como se trata del código golf, gana el código más corto que devuelve correctamente los tiempos pasados.

Ejemplo (JS, 127)

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

JiminP
fuente
Ahora que es un buen desafío.
FUZxxl
¡stemming inverso! ¡interesante! Intentaré intentarlo cuando vuelva a casa :)
DallaRosa
Cualquier solución que tenga menos de 1800 caracteres es incorrecta (verbos irregulares).
Dilema el
@Quandary Es por eso que dije '(Suponga que el verbo es regular)'
JiminP
@Quandary: No es del todo cierto ... ver la respuesta de Belisarius .
Simon

Respuestas:

6

sed, 76 caracteres

¿Un script sed cuenta como una función para este problema?

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

Mathematica 43 caracteres

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

Uso:

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

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

También:

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

{"bought", "ran", "swam"}
Dr. belisario
fuente
¿No crees que una búsqueda en el diccionario es un poco trampa? :-)
Simon
3
@Simon Definitivamente no. WordData es parte del lenguaje :)
Dr. belisarius
3

Groovy - 111 caracteres

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
fuente
2

Perl 5 (82 caracteres):

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

Estoy seguro que puede ser mejorado.

Prakash K
fuente
2

C - 120 119 caracteres

En el estilo típico de C, la función f actualiza un búfer de cadena en su lugar, suponiendo que la persona que llama ha reservado suficiente espacio para hasta tres caracteres adicionales. El segundo argumento debe darse como 0. La declaración de la variable de estado global lse incluye en el recuento total de caracteres.

#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;
}

Explicación: La función itera sobre los caracteres de forma recursiva. El segundo argumento icodifica cuáles de los tres caracteres anteriores eran consonantes en sus tres bits inferiores. Al final de la cadena, si i==5los tres últimos caracteres eran una consonante, una vocal y una consonante, y por lo tanto el último carácter debe duplicarse. De manera similar, si el bit 1 de iindica que el penúltimo carácter era una consonante y el último carácter es 'y', entonces la 'y' se reemplaza por 'i'.

han
fuente
1

Scala 199 273 caracteres

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"}

Invocación:

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

Mi primer enfoque fue mucho más largo, moviendo la cascada if-else a una lista => a una función:

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")))}

Quizás el enfoque sea interesante. Degolfed y explicó:

// 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")
  ))}
usuario desconocido
fuente
0

Ruby, 101 caracteres

Probablemente puede ser más pequeño.

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

Uso:

f("try")  #=> "tried"
f"call"   #=> "called"
LBg
fuente
Use la sintaxis lambda Ruby 1.9 f=->(x){...}para obtener un código más corto. También en aeiouymi humilde opinión debería ser una constante.
Hauleth
0

Caca - 72 caracteres

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

Python - 147

def f (v): T, x, m = 'aeiou', "ed", v [-1]; devuelve [[[v + x, v + m + x] [v [-2] en T y m y v [-3] no en T], [v + x, v [: - 1] + "ied"] [v [-2] no en T]] [m == 'y'], v + "d "] [m == 'e']  
Coding man
fuente