Местоимение операция

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

Проблема «Вы»

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

О входе

Ввод всегда будет в форме «Местоимение + Местоимение + Местоимение» ... Местоимения будут иметь первую букву в верхнем регистре, а остальные в нижнем регистре. Плюсы не будут окружены пробелами, только местоимениями. Возможен пустой ввод, а результатом должен быть пустой вывод.

бонус

Небольшой бонус в 15%, если программа справится с двумя новыми местоимениями: Она и Она . Они такие же, как Он, очевидно. Помните, что это отношение рефлексивно, поэтому Она -> Она и Это -> Это. Следовательно, любая комбинация, которая включает только Она, Он или Она, должна выводить Они.

Примеры

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
Симона Чело
источник
@ Тимви, если вы говорите о примерах, которые вы правы, я добавлю несколько. Во всяком случае, это «плюс» отношение рефлексивно, поэтому Он + Он есть Он, я + Я есть Я…
Симона Чело
5
Я получаю " I+I=I", так как может быть только один " I" от данного оратора. Но не мог " He+He=They"? Вообщем если скажешьHe » дважды в этой конструкции, вы имеете в виду два разных мужских предмета, а не один и тот же дважды.
Даррел Хоффман
Многие диалекты английского языка имеют эквиваленты вуа . По моему это вы , и используется в официальном реестре. Другой распространенный - это ты , хотя я не думаю, что он действительно используется в официальной речи. Традиционно у вас есть и вы , хорошо известные многим, потому что это часто встречается в некоторых библейских переводах. Вы должны добавить в одну из них или бросить в ты , а по - настоящему встряхнуть вещи.
user0721090601

Ответы:

9

Retina, 62 61 56 53 52 байта

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

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

Дальнейшее игра в гольф и объяснение придет позже.

4 шага замены делают следующее:

  • что-нибудь несколько раз само по себе
  • если есть какие-либо Мы или Я + что-нибудь в результате мы
  • для всего, что содержит Вас, результат - Вы
  • если у нас все еще есть несколько частей или единое целое

Попробуйте это онлайн здесь.

3 байта сэкономлено благодаря Мартину Бюттнеру.

randomra
источник
За исключением последнего этапа, вы можете использовать .вместо \+, так как это единственный символ, разрешенный перед заглавной буквой или после 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
)

Тест

user81655
источник
Вау, мне нравится этот подход! Я думаю, что получил очень плохой бонус, потому что для его достижения вам нужно было бы добавить 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
msh210
источник
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]

Попробуй здесь

TanMath
источник
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]}

Бонусная функция: обрабатывает несколько выражений в одной командной строке.

PellMell
источник