依田に言えば、これは


44

挑戦

まあ、それは非常に明確だと思いますよね?引数として文字列を取り、対応するヨーダ語を出力する関数またはプログラムを作成する必要があります。

これはなので、最小バイト数が勝ちます。

入力

入力には、改行なしの任意の文字列を使用できます。次のように構成されている場合、文字列を翻訳できます。

件名 +動詞+その他。

どこ件名(I、あなた、彼、彼女、それ、私たち、彼ら)人称代名詞です。2番目の単語が動詞であることを認識する必要はありません。

最初の単語が代名詞でない場合、入力は有効ですが、出力は Too difficult, this sentence is.

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

入力は文字aで終了できます。または!ではなく、?

さらに、文字列には非アスキー、括弧、コンマ、コロンを含めることができます...

出力

翻訳可能な文の場合、出力は同じ文で、文の最後に主語と動詞があります。

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
アディソンクランプ

9
「このコードチャレンジに勝つには、あなたが持っています。」本当に奇妙に聞こえます。
ニカエル

3
入力にカンマを含めることはできますか?入力文字、ピリオドまたはで終わっていない場合はどうなりますか!?それは起こらないことが保証されているか、それを処理し、主要な代名詞がないときと同じことを印刷する必要があります。入力に改行を含めることはできますか?アポストロフィ?コロン/括弧/バックティック?非ASCII文字?「入力には任意の文字列を使用できます」と言いますが、テストケースは非常に特定の種類の文字列のみを対象としています。
マーティンエンダー

4
「持っている」は、英語特有の奇妙なヘルパー動詞の構成です。ヨーダがそれを使用することはまずありません。「このコードは挑戦しなければならない、勝たなければならない。」一方、ヨーダは、使用する傾向がある独自のヘルパー動詞構造を持っています。ヨーダが「このコードチャレンジに勝った」とか「このコードチャレンジに勝つとは」と言って想像することはできません。
リンダジャンヌ

4
答えにはもっと「Mmmmm」が必要ではないですか?
スティーブアイブス

回答:


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 + verbremainder。その後、再配置します。

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

最初の文字を大文字に変換します。

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

結果が空の場合、上記のフィルターを通過しませんでした。エラーメッセージを出力します。

^$
Too difficult, this sentence is.

文字変換モードの文字クラスは角括弧を使用しません。
マーティンエンダー

1
また、[^ ]おそらく\Sどこにでも[^ ]+置き換えることができ、最初の正規表現ではに置き換えることができます.+。文字クラスでは、エスケープ.する必要がないため、[.!]正常に機能します。あなたが順序を入れ替えていないので、また、$1そして$2第三段階では、あなたが1つのグループにそれらをキャプチャし、5つのバイトを保存することができます。
マーティンエンダー

([^I]|It)短縮できます^\w\w
マーティン・エンダー

うわー、多くの改善。ありがとう。
レイナーP.

Retinaがそれをサポートすれば、I|Itなる可能性があると思いますI?
コナーオブライエン

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.Google 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文字少なくなりました
Helco

それはすべての問題を解決し、すべてのテストはうまくいくようです。よくやった!あなたは私の賛成を得た。
イスマエルミゲル

3
^正規表現の先頭に追加する必要があります。そうしないと、代名詞が有効なものとして解析される前にテキストを含む文が追加されます。
user81655

6

JavaScript(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ありがとう。ただし、残念ながら、正規表現はIt大文字のままであり、のShey代わりに一致しますShe
user81655

ああ、私のテストは不十分でした!はい、その理由がわかります。
ウォーリー

3

Python、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".!"誰も私に打ち負かさないなら、Pythonはマッチオブジェクトでもっと遊ぶでしょう


b=b[:-1]部品のスペースを削除できると思います。
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴありがとう!
ロバートグラント

3
b=b[:-1]行の最後に置くことができますif。最後の行に戻ってからスペースを削除できます。これは、タブとスペースとタブと3と2つのスペースを置き換えることでの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/[.!]$//

最初の2つの単語を文の残りの部分と交換し、新しい最初の単語を大文字にし、必要に応じて句読点を追加します。

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

プログラムは、入力が少なくとも3つの単語で構成されているかどうかをチェックしません。文はYou are1行目と2行目を通過しますが、最後の行は一致しないためyou are、エラーメッセージの代わりに出力されます。...|They) \S+ \S/\L&/最初の2行にチェックを追加します。
レイナーP.

@Rainer-そのとおりです(短い入力のテストケースがないことを非難します)。これをすぐに修正する方法を見ていきます。
トビー・スパイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.