Напишите функцию, которая возвращает прошедшее время данного глагола

14

Вызов

Напишите функцию, которая принимает аргумент, который является глаголом, и возвращает прошедшее время глагола. (Предположим, что глагол правильный)

Прошедшее время

Примечание: не считайте y согласным или гласным.

Обычно простое добавление edпосле глагола делает прошедшее время глагола.

Пример: jumpjumped, askasked

Однако есть и другие правила.

  • Если последний символ данного глагола e, просто добавьте d.

    Пример: loveloved, movemoved

  • Если глагол заканчивается согласной + y, тогда измените yна iи добавьте ed.

    Пример: studystudied, crycried

  • Однако, если глагол заканчивается гласной + y, тогда просто добавьте ed.

    Пример: playplayed, staystayed

  • Если глагол заканчивается гласной и согласной, то напишите согласную еще раз и добавьте ed.

    Пример: stopstopped, planplanned

  • Однако, если глагол заканчивается несколькими гласными + согласной или одной гласной + несколькими согласными, тогда просто добавьте ed.

    Пример: looklooked, jumpjumped

Есть больше правил, но давайте позаботимся только над правилами. Например, согласно вышеуказанному правилу visitvisitted.

победитель

Поскольку это кодовый гольф, выигрывает самый короткий код, который правильно возвращает прошедшие времена.

Пример (JS, 127)

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

JiminP
источник
Теперь это хороший вызов.
FUZxxl
обратный интересный! Я постараюсь попробовать, когда вернусь домой :)
DallaRosa
Любое решение, которое короче 1800 символов, является неправильным (неправильные глаголы).
затруднение
@Quandary Вот почему я сказал: «(Предположим, что глагол правильный)»
JiminP
@Quandary: Не совсем верно ... см. Ответ Велисария .
Симон

Ответы:

6

sed, 76 знаков

Считается ли сценарий sed функцией этой проблемы?

s/\([^aeiou]\)y$/\1i/
s/\([^aeiou][aeiou]\)\([^aeiouy]\)$/\1\2\2/
s/e\?$/ed/
migimaru
источник
4

Mathematica 43 символа

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

Использование:

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

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

Также:

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

{"bought", "ran", "swam"}
Доктор Велизарий
источник
Вы не думаете, что поиск по словарю - это обман? :-)
Симон
3
@ Симон Определенно нет. WordData является частью языка :)
д-р belisarius
3

Groovy - 111 символов

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
источник
2

Perl 5 (82 символа):

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

Я уверен, что это может быть улучшено.

Пракаш К
источник
2

C - 120 119 знаков

В типичном стиле C функция f обновляет строковый буфер на месте, предполагая, что вызывающая сторона зарезервировала достаточно места для трех дополнительных символов. Второй аргумент должен быть задан как 0. Объявление глобальной переменной состояния lвключено в общее количество символов.

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

Объяснение: Функция рекурсивно перебирает символы. Второй аргумент iкодирует, какие из предыдущих трех символов были согласными в его младших трех битах. В конце строки, если i==5тогда последние три символа были согласными, гласными и согласными, и, следовательно, последний символ должен быть продублирован. Точно так же, если бит 1 iуказывает, что второй-последний символ был согласной, а последний символ - «y», то «y» заменяется на «i».

хань
источник
1

Scala 199 273 символа

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

Призвание:

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

Мой первый подход был намного длиннее, переместив каскад if-else в список => в функцию:

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

Может быть, подход интересен. Дегольфед и объяснил:

// 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")
  ))}
Пользователь неизвестен
источник
0

Рубин, 101 персонаж

Вероятно, может быть меньше.

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

Использование:

f("try")  #=> "tried"
f"call"   #=> "called"
Lbg
источник
Используйте лямбда-синтаксис Ruby 1.9, f=->(x){...}чтобы получить более короткий код. Также aeiouyИМХО должно быть постоянным.
Хаулет
0

Корма - 72 символа

f[s]s^6pow>4<<last&8*(/"ed""id""eid"/|out|flush)+rep'y'1-2-3"aeiou"ord#s
Томас Эдинг
источник
0

Питон - 147

def f (v): T, x, m = 'aeiou', "ed", v [-1]; возврат [[[v + x, v + m + x] [v [-2] в T и m и v [-3] не в T], [v + x, v [: - 1] + "ied"] [v [-2] не в T]] [m == 'y'], v + "d «] [м == 'е']  
Кодирующий человек
источник