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


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/

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

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

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.


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


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

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"

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

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']  
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.