एक फ़ंक्शन लिखें जो दिए गए क्रिया के पिछले तनाव को वापस करता है


14

चुनौती

एक फ़ंक्शन लिखें जो एक तर्क लेता है जो एक क्रिया है, और क्रिया के पिछले तनाव को वापस करता है। (मान लें कि क्रिया नियमित है)

भूत काल

नोट: y को ना तो व्यंजन के रूप में मानते हैं और ना ही स्वर।

आम तौर पर, edक्रिया के अंत के बाद बस जोड़ने से क्रिया का भूत काल हो जाता है।

Ex: jumpjumped, askasked

हालांकि, अन्य नियम भी हैं।

  • यदि दिए गए क्रिया का अंतिम वर्ण है e, बस जोड़ें d

    Ex: loveloved, movemoved

  • यदि क्रिया एक व्यंजन + के साथ समाप्त हो जाती है y, तो परिवर्तित yकरें i, और जोड़ें ed

    Ex: studystudied, crycried

  • हालांकि, यदि क्रिया एक स्वर + के साथ समाप्त हो जाती है y, तो बस जोड़ें ed

    Ex: playplayed, staystayed

  • यदि एक क्रिया एक स्वर और एक व्यंजन के साथ समाप्त हो जाती है, तो व्यंजन को एक बार और लिखें, और जोड़ें ed

    Ex: stopstopped, planplanned

  • हालाँकि, यदि क्रिया कई स्वर + व्यंजन और एकल स्वर + एकाधिक व्यंजन के साथ समाप्त हो जाती है, तो बस जोड़ें ed

    Ex: looklooked, jumpjumped

और भी नियम हैं लेकिन केवल नियमों के ऊपर ध्यान दें। उदाहरण के लिए, ऊपर नियम के अनुसार, visitvisitted

विजेता

चूंकि यह कोड गोल्फ है, सबसे छोटा कोड जो सही ढंग से पिछले काल जीतता है।

उदाहरण (जेएस, 127)

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


अब यह एक अच्छी चुनौती है।
फू्रजएक्सएक्सएल

उलटा स्टेमिंग! दिलचस्प! मैं कोशिश करूँगा कि जब मैं घर वापस
आऊँ

1800 वर्णों से छोटा कोई भी समाधान गलत (अनियमित क्रिया) है।
क्वांडरी

@ भंडार इसीलिए मैंने कहा था '(यह मान लें कि क्रिया नियमित है)'
जेमिन पी

@ प्रश्न: बिलकुल सच नहीं ... देखिए बेलिसरियस का जवाब
साइमन

जवाबों:


6

sed, 76 वर्ण

क्या इस समस्या के लिए एक स्क्रिप्ट एक फ़ंक्शन के रूप में गिना जाता है?

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

4

गणितज्ञ 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
@ साइमन निश्चित रूप से नहीं। वर्डडेटा भाषा का हिस्सा है :)
डॉ। बेलिसियस

3

ग्रूवी - 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

पर्ल 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 अक्षर

विशिष्ट सी शैली में, फ़ंक्शन f जगह में एक स्ट्रिंग बफर को अपडेट करता है, यह मानते हुए कि कॉलर ने तीन अतिरिक्त वर्णों के लिए पर्याप्त स्थान आरक्षित किया है। दूसरा तर्क निम्न के रूप में दिया जाना चाहिए। वैश्विक राज्य चर की घोषणा 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

स्काला 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-cascade को स्थानांतरित करके =:

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"

f=->(x){...}छोटे कोड पाने के लिए रूबी 1.9 लैम्ब्डा सिंटैक्स का उपयोग करें । इसके अलावा aeiouyIMHO एक स्थिर होना चाहिए।
हौलेथ


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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.