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


14

Вызов

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

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

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

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

Пример: jump→ jumped, ask→asked

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

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

    Пример: love→ loved, move→moved

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

    Пример: study→ studied, cry→cried

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

    Пример: play→ played, stay→stayed

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

    Пример: stop→ stopped, plan→planned

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

    Пример: look→ looked, jump→jumped

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

победитель

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

Пример (JS, 127)

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


Теперь это хороший вызов.
— FUZxxl

обратный интересный! Я постараюсь попробовать, когда вернусь домой :)
— DallaRosa

Любое решение, которое короче 1800 символов, является неправильным (неправильные глаголы).
— затруднение

@Quandary Вот почему я сказал: «(Предположим, что глагол правильный)»
— JiminP

@Quandary: Не совсем верно ... см. Ответ Велисария .
— Симон

Ответы:


6

sed, 76 знаков

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

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

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']

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"

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


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 «] [м == 'е']  
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.