与えられた動詞の過去形を返す関数を書く


14

チャレンジ

動詞である引数を取り、動詞の過去形を返す関数を作成します。(動詞が規則的であると仮定します)

過去形

注:yは子音でも母音でもないと考えてください。

通常、追加するだけ ed動詞の終わりの後にで、動詞の過去時制が作成されます。

例:jumpjumpedaskasked

ただし、他のルールがあります。

  • 与えられた動詞の最後の文字がの場合e、単に追加しdます。

    例:lovelovedmovemoved

  • 動詞が子音+ yで終わる場合は、に変更yi、を追加しedます。

    例:studystudiedcrycried

  • ただし、動詞が母音+ yで終わる場合は、単に追加しedます。

    例:playplayedstaystayed

  • 動詞が母音と子音で終わる場合は、もう一度子音を書き、を追加しedます。

    例:stopstoppedplanplanned

  • ただし、動詞が複数の母音+子音または単一の母音+複数の子音で終了する場合は、単にを追加しedます。

    例:looklookedjumpjumped

他にもルールがありますが、上記のルールのみに注意しましょう。たとえば、上記のルールに従ってvisitvisitted

勝者

これはコードゴルフであるため、過去の時制を正しく返す最短のコードが優先されます。

例(JS、127)

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


今、それは素晴らしい挑戦です。
FUZxxl

逆ステミング!面白い!家に帰ってから試してみます:)
ダラロサ

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は言語の一部です:)
Dr. 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は、呼び出し側が最大3文字の追加文字用に十分なスペースを予約していると仮定して、所定の場所で文字列バッファーを更新します。2番目の引数には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;
}

説明:この関数は、文字を再帰的に繰り返します。2番目の引数iは、前の3つの文字のどれが下位3ビットで子音であったかをエンコードします。文字列i==5の最後で、最後の3文字が子音、母音、子音の場合、最後の文字を複製する必要があります。同様に、i最後の2番目の文字が子音で、最後の文字が「y」であることをビット1が示す場合、「y」は「i」に置き換えられます。


1

Scala 199273文字

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-cascadeをlist =>から関数に移動しました:

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

たぶん、アプローチは興味深いです。Degolfedと説明:

// 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

Ruby、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){...}を使用して、短いコードを取得します。また、aeiouyIMHOは定数でなければなりません。
-Hauleth


0

Python-147

def f(v):T、x、m = 'aeiou'、 "ed"、v [-1]; return [[[[v + x、v + m + x] [v [-2] in Tおよびmおよびv [-3] Tにない]、[v + x、v [:-1] + "ied"] [v [-2] Tにない]] [m == 'y']、v + "d "] [m == 'e']  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.