Операція займенника


24

Змагання

Напишіть функцію або програму, яка приймає в якості аргументу рядок, що складається з одного або декількох суб’єктивних особових займенників , розділених знаками + . Вихід повинен бути єдиним займенником, тобто результатом відношення, визначеного в наступному абзаці.

Звичайно, сміливо редагуйте, як хочете виправити ті граматичні помилки, які, безумовно, є;)

Це завдання з гольф-кодом, тому виграє найкоротший код.

Відношення

Мета цього завдання - перекласти «математично говоріть» те, що ми використовуємо щодня. Як ми думаємо про "ти і я"? Ну, "ми", чи не так? Отже, якщо введенням є You+Iвихід, то повинен бути рядок We. Маючи більше двох займенників, це має виглядати так: 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

Проблема "Ти"

Ну, як ви бачите, я не є носієм англійської мови. У моїй мові (італійській) є різниця між множиною ви ( voi , італійською мовою) та одниною you ( tu ). Коли я думав про цей виклик, я не думав англійською мовою, тому існує проблема, яку неможливо розпізнати, використовуючи форму множини чи однини. На щастя (або очевидно?) Введення / вихід не змінюється в обох формах, тому ви можете використовувати одну з них, і ви покриєте обидва випадки!

Про вхід

Вхід завжди буде у формі "Займенник + Займенник + Займенник" ... У займенниках перша буква буде мати верхню, а решту - малу. Плюси не будуть оточені пробілами, лише займенниками. Порожній вхід можливий, а результат повинен бути порожнім.

Бонус

Невеликий бонус у розмірі 15%, якщо програма керуватиме двома новими займенниками: She and 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, якщо ви говорите про правильні приклади, я додам декілька. У будь-якому випадку це "плюс" відношення є рефлексивним, тому Він + Він - Він, Я + Я - Я ....
Симоне Чело

5
Я отримую " I+I=I", оскільки може бути лише один " I" від даного динаміка. Але не вдалося " He+He=They"? Як правило, якщо ви говорите " He" двічі в цій конструкції, ви маєте на увазі два різних чоловічих предмета, а не один і той же два рази.
Даррел Гофман

Багато діалектів англійської мови мають еквіваленти voi . У шахті, це y'all , і використовується в офіційному регістрі. Іншим поширеним є Yous , хоча я не думаю , що один звикає в формальної мови дійсно. Традиційно, у вас також є Ye , добре відомі багато , тому що це поширене в деяких біблійних перекладах. Ви повинні додати в одну з них або кинути в ти , а по - справжньому розворушити речі.
користувач0721090601

Відповіді:


9

Сітківка, 62 61 56 53 52 байт

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

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

Подальше гольф та пояснення приходять пізніше.

4 етапи заміни виконують наступним чином:

  • що-небудь багаторазове - це само собою
  • якщо є якісь ми або я + що-небудь, результат - це ми
  • для всього іншого, що містить вас, результат - це Ви
  • якщо у нас ще є кілька деталей або підошва. Це вони, як тільки Він, і вони можуть залишитися

Спробуйте його онлайн тут.

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 байтів у масив (", вона, це") та 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 байт

EDIT : Спасибі @ 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не повинно бути змінною, і ви можете видалити додатковий рядок та пробіл між рядками forта r=. Також ви можете перевірити, чи може ця функція бути коротшою як функція.
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]}

Функція бонусу: обробляє декілька виразів в одному командному рядку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.