代名詞操作


24

チャレンジ

引数として+記号で区切られた1つ以上の主観的な個人代名詞で構成される文字列を取る関数またはプログラムを記述します。出力は、次の段落で定義された関係の結果である単一の代名詞でなければなりません。

もちろん、確実に存在する文法エラーを修正したいので、自由に編集してください;)

これはコードとゴルフのチャレンジなので、最短のコードが優先されます。

関係

このタスクの目標は、私たちが日常的に使用するものを「数学で話す」ものに翻訳することです。「あなたと私」をどう思いますか?さて、「私たち」ですよね?したがって、入力がYou+I出力である場合、文字列である必要がありますWe。3つ以上の代名詞を使用すると、次のようになります。- You+He+They>You

関係は次の表として定義されます。

      I  You    He   We   You   They
I     I  We     We   We   We    We
You      You    You  We   You   You
He              He   We   You   They
We                   We   We    We
You                       You   You
They                            They

「あなた」の問題

さて、ご覧の通り、私はネイティブスピーカーではありません。私の言語(イタリア語)では、複数形you(イタリア語ではvoi)と単数形youtu)には違いがあります。この挑戦を考えたとき、私は英語で考えていなかったので、複数形と単数形のどちらを使用しているかを認識できないという問題があります。幸いなことに(または明らかに?)、入力/出力は両方の形式で変わらないので、どちらかを使用すれば両方のケースをカバーできます!

入力について

入力は常に「代名詞+代名詞+代名詞」という形式になります...代名詞の最初の文字は大文字で、残りは小文字になります。プラス記号はスペースで囲まれず、代名詞のみで囲まれます。空の入力が可能であり、結果は空の出力でなければなりません。

ボーナス

プログラムが2つの新しい代名詞:SheItを管理する場合、15%の小さなボーナス。彼らは明らかに彼と同じです。この関係は再帰的であるため、彼女->彼女とそれ->それ。したがって、She、He、またはItのみを含む組み合わせは、それらを出力する必要があります。

You+I          -> We
You+He+They    -> You
I+You+He+They  -> We
They           -> They
They+You       -> You
You+You+I+You  -> We

For Bonus
She            -> She
She+He         -> They
I+It+He        -> We
It+You         -> You

@Timwi、あなたが正しい例について話しているなら、いくつか追加します。彼+彼は彼、I + IがIである....あるので、とにかく、この「プラス」の関係は、反射的である
シモーネチェロ

5
特定のスピーカーからはI+I=I1つしか存在できないため、「」を受け取りIます。しかし、「He+He=They」できませんでしたか?一般的にHe、この構造で" "を2回言う場合、同じものを2回ではなく、2つの異なる男性の対象を指しています。
ダレルホフマン

英語の多くの方言にはvoiと同等のものがあります。私の場合はy'allで、正式な登録簿で使用されています。別の一般的なものはyousですが、正式なスピーチで実際に使用されるとは思いません。伝統的に、あなたはまた、持っているあなたがたには、特定の聖書の翻訳に共通なので、多くに知られているが、。あなたはこれらのいずれかに追加するかに投げる必要がありますあなたのほかには本当に物事を振ります。
-user0721090601

回答:


9

網膜、62 61 56 53 52バイト

(.+)\+(?=\1)

.*(W|.I|I.).*
We
.*Y.*
You
.{4,}
They

さらなるゴルフと説明については後で説明します。

4つの置換ステップは次のことを行います。

  • 何回もそれ自体が
  • WeまたはI + anyhingがある場合、結果はWe
  • あなたを含む他のものについては、結果はあなたです
  • まだ複数のパーツやソールがある場合、彼らは彼らだけであり、彼は彼らであり、彼らは残すことができます

こちらからオンラインでお試しください。

MartinBüttnerのおかげで3バイト節約されました。


最後のステージを除き、の.代わりにを使用できます。これ\+は、大文字の前または後に許可される唯一の文字であるためIです。
マーティンエンダー

6

JavaScript(ES6)、130バイト

s=>(a=",I,You,He,We,They".split`,`,m="012345014444042242042345044444042545",r=0,s.split`+`.map(p=>r=m[+m[a.indexOf(p)]+r*6]),a[r])

説明

s=>(

  // a = array of each pronoun (including an empty string at index 0)
  a=",I,You,He,We,They".split`,`,

  // m = 6 x 6 map of pronoun indices for each combination of pronouns
  m="012345014444042242042345044444042545",

  r=0,                        // r = index of result pronoun
  s.split`+`.map(p=>          // for each pronoun in the input string
    r=m[+m[a.indexOf(p)]+r*6] // combine each pronoun with the previous one
  ),
  a[r]                        // return the resulting pronoun
)

テスト


うわー、私はこのアプローチが好きです!私は非常に貧弱なボーナスを作ったと思います。ここに到達するには、配列に7バイト( "、She、It")と行列に28バイトを追加する必要があり、165 -15%= 140に到達します...
シモーヌチェロ

2

Perl 5、67バイト

本当に79バイトですが、15%のボーナスがあります。

$a{$_}=""for split/[+\s]/,<>;@_=%a;say@_<3?@_:I~~@_||We~~@_?We:You~~@_?You:They

2

Python 159 153バイト

編集:ありがとう@ Pietu1998

これは、Javascript ES6の答えを直接翻訳したものです。

a=",I,You,He,We,They".split(',')
m="012345014444042242042345044444042545"
r=0
for p in raw_input().split('+'):r=int(m[int(m[a.index(p)])+r*6])
print a[r]

ここで試してみてください


s変数である必要はありません。またforr=行と行の間の余分な行とスペースを削除できます。また、これが関数として短くなる可能性があるかどうかを確認することもできます。
PurkkaKoodari

1

ルビー、150の 136 131 119 111バイト

ARGV.each{|a|puts %w[We You I He They][a.bytes.inject(0){|m,c|m|({87=>15,73=>7,89=>11,84=>9,72=>8}[c]||0)}%5]}

ボーナス機能:同じコマンドラインで複数の式を処理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.