Tulis fungsi yang mengembalikan bentuk lampau dari kata kerja yang diberikan

14

Tantangan

Tulis fungsi yang mengambil argumen yang merupakan kata kerja, dan mengembalikan bentuk lampau kata kerja. (Asumsikan bahwa kata kerjanya teratur)

Waktu lampau

Catatan: anggap y bukan konsonan atau vokal.

Biasanya, hanya menambahkan edsetelah akhir kata kerja membuat bentuk lampau kata kerja.

Contoh: jumpjumped, askasked

Namun, ada aturan lain.

  • Jika karakter terakhir dari kata kerja yang diberikan e, hanya menambahkan d.

    Contoh: loveloved, movemoved

  • Jika kata kerja diakhiri dengan konsonan + y, maka ubah ymenjadi i, dan tambahkan ed.

    Contoh: studystudied, crycried

  • Namun, jika kata kerjanya diakhiri dengan vokal + y, maka tambahkan saja ed.

    Contoh: playplayed, staystayed

  • Jika kata kerja diakhiri dengan vokal dan konsonan, maka tulis konsonan sekali lagi, dan tambahkan ed.

    Contoh: stopstopped, planplanned

  • Namun, jika kata kerja diakhiri dengan banyak vokal + konsonan atau vokal tunggal + banyak konsonan, maka tambahkan saja ed.

    Contoh: looklooked, jumpjumped

Ada lebih banyak aturan, tetapi mari kita perhatikan aturan di atas saja. Misalnya, sesuai aturan di atas, visitvisitted.

Pemenang

Karena ini adalah kode golf, kode terpendek yang dengan benar mengembalikan bentuk lampau menang.

Contoh (JS, 127)

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

JiminP
sumber
Nah, itu tantangan yang bagus.
FUZxxl
batang terbalik! menarik! Saya akan mencoba memberikan ketika saya kembali ke rumah :)
DallaRosa
Solusi apa pun yang lebih pendek dari 1800 karakter salah (kata kerja tidak beraturan).
Quandary
@Quantum Itu sebabnya saya berkata '(Anggaplah kata kerjanya teratur)'
JiminP
@ Pertanyaan: Tidak sepenuhnya benar ... lihat jawaban Belisarius .
Simon

Jawaban:

6

sed, 76 karakter

Apakah skrip sed dianggap sebagai fungsi untuk masalah ini?

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

Mathematica 43 karakter

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

Pemakaian:

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

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

Juga:

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

{"bought", "ran", "swam"}
Belisarius
sumber
Anda tidak berpikir bahwa pencarian kamus agak curang? :-)
Simon
3
@Simon Jelas tidak. WordData adalah bagian dari bahasa :)
Dr. belisarius
3

Groovy - 111 karakter

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

Perl 5 (82 karakter):

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

Saya yakin itu bisa diperbaiki.

Prakash K
sumber
2

C - 120 119 karakter

Dalam gaya C yang khas, fungsi f memperbarui buffer string pada tempatnya, dengan asumsi bahwa pemanggil telah menyediakan ruang yang cukup untuk hingga tiga karakter tambahan. Argumen kedua harus diberikan sebagai 0. Deklarasi variabel keadaan global ltermasuk dalam jumlah total karakter.

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

Penjelasan: Fungsi ini berulang pada karakter secara rekursif. Argumen kedua imengkodekan yang mana dari tiga karakter sebelumnya adalah konsonan dalam tiga bit bagian bawahnya. Pada akhir string, jika i==5kemudian tiga karakter terakhir adalah konsonan, vokal dan konsonan, dan dengan demikian karakter terakhir harus diduplikasi. Demikian pula, jika bit 1 dari imenunjukkan bahwa karakter kedua-ke-terakhir adalah konsonan dan karakter terakhir adalah 'y', maka 'y' digantikan oleh 'i'.

han
sumber
1

Scala 199 273 karakter

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

Doa:

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

Pendekatan pertama saya jauh lebih lama, dengan memindahkan if-else-cascade ke daftar => ke suatu fungsi:

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

Mungkin pendekatannya menarik. Degolfed dan menjelaskan:

// 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")
  ))}
Pengguna tidak diketahui
sumber
0

Ruby, 101 karakter

Mungkin bisa lebih kecil.

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

Pemakaian:

f("try")  #=> "tried"
f"call"   #=> "called"
LBg
sumber
Gunakan sintaksis Ruby 1.9 lambda f=->(x){...}untuk mendapatkan kode yang lebih pendek. aeiouyIMHO juga harus berupa konstanta.
Hauleth
0

Kotoran - 72 karakter

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

Python - 147

def f (v): T, x, m = 'aeiou', "ed", v [-1]; return [[[v + x, v + m + x] [v [-2] dalam T dan m dan v [-3] tidak dalam T], [v + x, v [: - 1] + "ied"] [v [-2] tidak dalam T]] [m == 'y'], v + "d "] [m == 'e']  
Pria pengkodean
sumber