요다를 사용하는 문제입니다.


44

도전

글쎄, 나는 그것이 분명하다고 생각하지 않습니까? 문자열을 인수로 사용하여 해당 요다 연설을 출력하는 함수 나 프로그램을 만들어야합니다.

이것은 이므로 바이트 수가 가장 적습니다.

입력

입력은 될 수 있는 개행 문자가없는 문자열입니다. 다음과 같이 구성된 문자열을 번역 할 수 있습니다.

과목 + 동사 + 다른 것.

어디 주제는 개인의 대명사이다 (I, 당신이, 그, 그녀, 그것, 우리, 그들이). 두 번째 단어가 동사임을 인식 할 필요가 없습니다.

첫 단어가 대명사가 아닌 경우 입력은 유효하지만 출력은 Too difficult, this sentence is.

You have to win this code challenge -> Translatable
Luke has to win this code challenge -> Untranslatable

입력은 문자 a로 끝날 수 있습니다. 또는!가 아닌!

또한 문자열에는 비 ASCII, 괄호, 쉼표, 콜론이 포함될 수 있습니다 ...

출력

번역 가능한 문장의 경우, 결과는 문장의 끝에 주제와 동사가있는 동일한 문장입니다.

You have to win this code challenge -> To win this code challenge, you have.

대명사의 쉼표, 마침표 및 소문자는 필수입니다. (물론 대명사가 I 인 경우는 제외).

이전에 언급했듯이 번역 할 수없는 경우 문자열을 출력해야합니다 Too difficult, this sentence is.

You have to win this code challenge -> To win this code challenge, you have.
He won this code challenge -> This code challenge, he won.  (I know this is not yoda-speaking, but I don’t want to overcomplicate this challenge)
I ate an ice cream earlier! -> An ice cream earlier, I ate.
I liked the Star Wars original trilogy more than the prequel’s one. -> The Star Wars original trilogy more than the prequel’s one, I liked.
I find your lack of faith disturbing -> Your lack of faith disturbing, I find.
I think we are done with the examples -> We are done with examples, I think.
He is your son, Vader -> Your son, Vader, he is.
I think they’ll add new features -> They’ll add new features, I think.
I made a fantastic code challenge (I hope) -> A fantastic code challenge (I hope), I made.
I love constants like π -> Constants like π, I love.

I’ll be the next President, I swear! -> Too difficult, this sentence is.
This challenge is great! -> Too difficult, this sentence is.
Is this challenge great? -> Too difficult, this sentence is.
Luke is not ready for this task -> Too difficult, this sentence is.
Somebody loves constants like π -> Too difficult, this sentence is.
[Empty string] -> Too difficult, this sentence is.

9
의문의 여지가없는 관점에서, 부정사도 움직여서는 안됩니까? 예를 들어 You have to win this code challenge이어야합니다 This code challenge, you have to win.
Addison Crump

9
"이 코드 챌린지를이기려면 당신이 있습니다." 정말 이상하게 들린다.
nicael

3
입력에 쉼표가 포함될 수 있습니까? 입력 문자, 마침표 또는 !?로 끝나지 않으면 어떻게됩니까? 그런 일이 일어나지 않도록 보장해야합니까, 아니면 대명사가 없을 때와 똑같이 인쇄해야합니다. 입력에 줄 바꿈이 포함될 수 있습니까? 아포스트로피? 콜론 / 괄호 / 백틱? 비 ASCII 문자? "입력은 임의의 문자열 일 수 있습니다"라고 말하지만 테스트 사례는 매우 특정한 유형의 문자열 만 포함합니다.
Martin Ender

4
'해야한다'는 영어 특유의 이상한 도우미 동사 구성입니다. Yoda가 사용하지 않을 것입니다. "이 코드는 도전해야합니다. 승리해야합니다." 반면에 요다는 자신이 사용하는 도우미 동사 구조를 가지고 있습니다. "이 코드는 도전했습니다." Yoda가 "이 코드 챌린지에서 이겼습니다"또는 "이 코드 챌린지에서 이겼습니다."라고 말하는 것을 상상할 수 없습니다.
LindaJeanne

4
대답에 더 많은 '음'이 필요하지 않습니까?
Steve Ives

답변:


17

망막 162 137 145 134 131 129

여러 문장 부호가 올바르게 처리됩니다. 테스트 사례 :You will not win this challenge...! -> Not win this challenge..., you will.

온라인으로 사용해보십시오!

[.!]$

T`A-Z`a-z`^\w\w
G`^(I|we|you|s?he|it|they) \S+ \S
(\S+ \S+) (.*)
$2, $1.
T`a-z`A-Z`^.
^$
Too difficult, this sentence is.

기술:

끝에 구두점이있는 경우 삭제하십시오.

[.!]$

^empty line

대명사를 소문자로 변환합니다 (단, I는 제외).

T`A-Z`a-z`^\w\w

일치하지 않는 행을 필터링하십시오. <Pronoun><space><word><space><word>...

G`^(I|we|you|s?he|it|they) \S+ \S

로 분할 pronoun + verb, remainder. 그런 다음 재정렬하십시오.

(\S+ \S+) (.*)
$2, $1.

첫 번째 문자를 대문자로 변환하십시오.

T`a-z`A-Z`^.

결과가 비어 있으면 위의 필터를 통과하지 않은 것입니다. 오류 메시지를 인쇄하십시오.

^$
Too difficult, this sentence is.

음역 모드의 문자 클래스는 대괄호를 사용하지 않습니다.
Martin Ender

1
또한 [^ ]아마도 \S모든 곳 [^ ]+으로 대체 될 수 있으며 첫 번째 정규 표현식 은로 대체 될 수 있습니다 .+. 문자 클래스에서 당신은 탈출 할 필요가 없습니다 .너무 [.!]잘 작동합니다. 당신의 순서를 교환하지 않기 때문에 또한, $1그리고 $2세 번째 단계에서, 당신은 하나의 그룹으로 그들을 캡처하고 5 바이트를 저장할 수 있습니다.
Martin Ender

([^I]|It)단축 할 수 있습니다^\w\w
마틴 청산

와우, 얼마나 많은 개선. 감사.
Rainer P.

Retina가이를 지원한다면 나는 I|It될 수 있다고 생각 I?합니다
Conor O'Brien

7

ES6, 212

이것은 아마도 조금 더 골프를 칠 수 있습니다 :

i=>(r=/(you|s?he|it?|we|they)( \S+) ([^\.!?]+)/i.exec(i))?(c=(a,b)=>a[`to${['Low','Upp'][b]}erCase`]())(r[3].slice(0,1),1)+r[3].slice(1)+", "+c(r[1],+(/i/i.test(r[1])))+r[2]+".":"Too difficult, this sentence is."

JSFiddle (Chrome과 같은 최신 브라우저 필요) 또는 node.js를 통해 실행

언 골프 드 :

i=>{
    r=/(you|s?he|it?|we|they)( \S+) ([^\.!?]+)/i.exec(i); //Main RegExp
    c=(a,b)=>a[`to${['Low','Upp'][b]}erCase`](); //shortcut for toUpperCase/toLowerCase
    if (r)
        return c(r[3].slice(0,1),1)+r[3].slice(1) + ", " //the "something else", properly formated
             + c(r[1], +(/i/i.test(r[1]))) //The subject lowercased except for "i" or "I"
             + r[2] + "."; //The End
    else //no match, no sentence to translate
        return "Too difficult, this sentence is.";
}

깨진 테스트 : I think they’ll add new features-> They, I think.Chrome 47.0.2526.106 m에서 반환합니다 . 또한을 좋아하지 않습니다 I love constants like π. 그에 추가하려면, I made a fantastic code challenge (I hope)반환 A fantastic code challenge , I made.대신에A fantastic code challenge (I hope), I made.
이스마엘 미구엘

@IsmaelMiguel 수정되었지만 다른 버그로 인해 3
자도 줄었습니다

모든 문제를 해결했으며 모든 테스트가 정상적으로 보입니다. 잘 했어! 당신은 내 공감대를 얻었다.
Ismael Miguel

3
^정규식의 시작 부분 에 추가해야합니다. 그렇지 않으면 대명사 앞의 텍스트가있는 문장이 여전히 유효한 것으로 구문 분석됩니다.
user81655

6

자바 스크립트 (ES6), 164 바이트

s=>([,p,,i,r]=s.match`^(((I)|You|He|She|It|We|They) \\S+) (.*?)[.!]?$`)?r[0].toUpperCase()+r.slice(1)+`, ${i?p:p.toLowerCase()}.`:"Too difficult, this sentence is."

설명

JavaScript에서 문자열의 첫 문자를 사용하는 바이트 수는 거의 고통 스럽습니다 ...

s=>

  // Match and get specific parts of the input string
  ([,p,,i,r]=s.match`^(((I)|You|He|She|It|We|They) \\S+) (.*?)[.!]?$`)?

    r[0].toUpperCase()+r.slice(1)     // capitalise first letter
      +`, ${i?p:p.toLowerCase()}.`    // lower-case the pronoun (unless it is I)
  :"Too difficult, this sentence is."

테스트

테스트는 브라우저 간 호환성을 높이기 위해 구조화 할당을 사용하지 않습니다.


162 자 : var solution = s => (p = s.match ^(((It?)|You|[HW]e|[ST]hey) \\S+) (.*?)[.!]?$)? p [4] [0] .toUpperCase () + p [4] .slice (1) + , ${p[3]?p[1]:p[1].toLowerCase()}.: "이 문장은 너무 어렵습니다."
wally

@wally 고맙지 만 불행히도 정규 표현식은 It대문자로 유지하고 Shey대신에 일치 합니다 She.
user81655

아, 내 테스트가 충분하지 않았다! 예, 왜 그런지 알 수 있습니다 ... 아.
wally

3

파이썬, 261 바이트

import re
def a(b):
 if b[-1:]in".!":
  b=b[:-1]
 if re.match('(I|YOU|S?HE|IT|WE|THEY) \w+ \S+',b.upper()):
  b=(b+',').split()
  if b[0]!="I":
   b[0]=b[0].lower()
  b=" ".join(b[2:]+b[:2])
  return b[0].upper()+b[1:]
 return "Too difficult, this sentence is."

파이썬이 b[-1]in".!"다음 과 같은 것을 신경 쓰지 않는 것으로 나타났습니다.


b=b[:-1]부분 에서 공백을 제거 할 수 있다고 생각합니다 .
Conor O'Brien

트윗 담아 가기
Robert Grant

3
으로 b=b[:-1]줄 끝에 넣을 수 있습니다 if. 마지막 줄에서 돌아온 후 공백을 제거 할 수 있습니다. 이것은 2 개의 공백을 탭으로 바꾸고 3을 탭과 공백으로 바꾸어 python3 호환성을 떨어 뜨립니다
undergroundmonorail

2

파이썬 218 217 204 바이트

이것이 더 골프화 될 수 있는지 확실하지 않습니다.

def f(s):t=s.split();u=' '.join(t[2:]).rstrip('!.');return['Too difficult, this sentence is.','%s, %s %s.'%(u[0].upper()+u[1:],['I',t[0].lower()][t[0]!='I'],t[1])][t[0]in'I We You He She It They'.split()]

언 골프 드 :

def f(s):
    t = s.split()
    u = ' '.join(t[2:]).rstrip('!.')
    return [
        'Too difficult, this sentence is.',
        '%s, %s %s.' % (u[0].upper() + u[1:],
                        ['I', t[0].lower()][t[0] != 'I'],
                        t[1])
    ][t[0] in 'I We You He She It They'.split()]

당신은 변경할 수 있습니다 s.split(' ')s.split()'I|We|You|He|She|It|They'.split('|')'I We You He She It They'.split()을 대체, if...else다른 곳에서 사용되는 것과 동일한 부울 목록, 변화 t[0]int[0]in, 반환 주위 spawce을 제거
블루

1

GNU sed, 129 바이트

-r플래그에 +1 바이트를 포함시키고 있습니다.

#!/bin/sed -rf

/^I /b
s/^(You|[HW]e|She|It|They) /\L&/
t
s/.*/Too difficult, this sentence is./p
d
:
s/[.!]$//
s/^([^ ]+ [^ ]+) (.*)/\u\2, \1./

설명

우리가 선두와 일치 I하면 레이블로 이동합니다.

/^I /b

다른 대명사 중 하나와 일치하면 소문자로 바꾸고 레이블로 이동하십시오.

s/^(You|[HW]e|She|It|They) /\L&/
t

그렇지 않으면 실패 메시지를 인쇄하고 다음 입력 줄로 이동합니다.

s/.*/Too difficult, this sentence is./p
d

라벨로 이동하면 마지막 구두점을 제거합니다.

:
s/[.!]$//

첫 두 단어를 나머지 문장과 바꾸어 새 첫 단어를 대문자로 바꾸고 필요한 문장 부호를 추가합니다.

s/^([^ ]+ [^ ]+) (.*)/\u\2, \1./

프로그램은 입력이 최소한 세 단어로 구성되어 있는지 확인하지 않습니다. You are첫 번째와 두 번째 줄을 통과하지만 마지막 줄과 일치하지 않는 문장 you are은 오류 메시지 대신 출력 됩니다. ...|They) \S+ \S/\L&/처음 두 줄에 체크 표시를 추가하십시오 .
Rainer P.

@Rainer-당신이 맞습니다 (짧은 입력에 대한 테스트 사례가 부족하다고 비난합니다). 곧 재 작업하는 방법을 살펴 보겠습니다.
Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.