주어진 동사의 시제를 지나는 함수를 작성


14

도전

동사 인 인수를 가져 와서 동사의 과거 시제를 반환하는 함수를 작성하십시오. (동사가 규칙적이라고 가정)

과거 시제

참고 : y를 자음이나 모음으로 간주하지 마십시오.

일반적으로 ed 동사 끝 뒤에 하면 동사의 과거 시제가됩니다.

예 : jumpjumped,askasked

그러나 다른 규칙이 있습니다.

  • 주어진 동사의 마지막 문자 인 경우 e, 단지 추가d .

    예 : loveloved, movemoved

  • 동사는 자음 +로 종료 된 경우 y, 다음 변경 yi하고, 추가ed .

    예 : studystudied, crycried

  • 동사는 모음 +로 종료 된 경우에는 y, 그럼 그냥 추가ed .

    예 : playplayed, staystayed

  • 동사가 모음과 자음으로 끝나는 경우 자음을 한 번 더 쓰고 ed .

    예 : stopstopped, planplanned

  • 그러나 동사가 여러 모음 + 자음 또는 단일 모음 + 여러 자음으로 끝나는 경우 ed .

    예 : looklooked, jumpjumped

더 많은 규칙이 있지만 위의 규칙 만주의합시다. 예를 들어 위의 규칙에 따라visitvisitted .

우승자

이것은 코드 골프이기 때문에 지난 시제를 올바르게 반환하는 가장 짧은 코드가 승리합니다.

예 (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

@Quandary 그래서 내가 '(동사가 규칙적이라고 가정)'
JiminP

@Quandary : 사실이 아닙니다 ... Belisarius의 답변을보십시오 .
사이먼

답변:


6

sed, 76 자

sed 스크립트가이 문제의 함수로 계산됩니까?

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

딕셔너리 조회가 다소 속임수라고 생각하지 않습니까? :-)
Simon

3
@Simon 확실히 아니. WordData는 언어의 일부입니다 :)
Dr. belisarius

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 자

일반적인 C 스타일에서, f 함수는 호출자가 최대 3 개의 추가 문자를위한 충분한 공간을 예약했다고 가정하여 문자열 버퍼를 제자리에 업데이트합니다. 두 번째 인수는 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는 이전 3 개의 문자 중 하위 3 비트의 자음 중 하나를 인코딩합니다. 문자열의 끝 i==5에서 마지막 세 문자는 자음, 모음 및 자음이므로 마지막 문자는 복제되어야합니다. 유사하게 비트 1이 i마지막에서 두 번째 문자가 자음이고 마지막 문자가 'y'인 경우 'y'는 'i'로 바뀝니다.


1

스칼라 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")))}

어쩌면 그 접근법은 흥미로울 것입니다. 디고 프드 및 설명 :

// 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){...}더 짧은 코드를 얻으려면 Ruby 1.9 람다 구문 을 사용하십시오 . 또한 aeiouyIMHO는 상수 여야합니다.
Hauleth


0

파이썬-147

데프 f (v) : T, x, m = 'aeiou', "ed", v [-1]; 반환 [[[[v + x, v + m + x] [v [-2] in T 및 m v [-3] not in T], [v + x, v [:-1] + "ied"] [v [-2] not in T]] [m == 'y'], v + "d "] [m == 'e']  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.