Operação do pronome

24

O desafio

Escreva uma função ou um programa que use uma sequência composta por um ou mais pronomes pessoais subjetivos , separados por sinais de + , como argumento. A saída deve ser um pronome único, que é o resultado da relação definida no próximo parágrafo.

Obviamente, sinta-se à vontade para editar, pois você deseja corrigir os erros gramaticais que certamente estão presentes;)

Este é um desafio do código-golfe, portanto o código mais curto vence.

A relação

O objetivo desta tarefa é traduzir em "linguagem matemática" algo que usamos diariamente. Como pensamos em "você e eu"? Bem, "nós", não é? Portanto, se a entrada for You+Ia saída, deverá ser a sequência We. Com mais de dois pronomes, deve se parecer com: You+He+They->You

A relação é definida como esta tabela:

      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

O problema do 'você'

Bem, como você pode ver, eu não sou um falante nativo de inglês. Na minha língua (italiano) há uma diferença entre o plural você ( voi , em italiano) e o singular você ( tu ). Quando pensei nesse desafio, não pensei em inglês, então há o problema que é impossível reconhecer se estou usando a forma plural ou singular. Felizmente (ou obviamente?), A entrada / saída não muda nas duas formas; portanto, você pode usar uma delas e cobrir os dois casos!

Sobre a entrada

A entrada estará sempre na forma "Pronome + Pronome + Pronome" ... Os pronomes terão a primeira letra em maiúscula e o restante em minúscula. Vantagens não serão cercadas por espaços, apenas por pronomes. A entrada vazia é possível e o resultado deve ser uma saída vazia.

Bônus

Um pequeno bônus de 15% se o programa gerenciar dois novos pronomes: Ela e Ele . Eles são os mesmos que Ele, obviamente. Lembre-se de que essa relação é reflexiva, então ela -> ela e ela -> ela. Portanto, qualquer combinação que inclua apenas Ela, Ele ou Ela deve produzir Eles.

Exemplos

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
Simone Chelo
fonte
@ Timwi, se você está falando sobre os exemplos de que está certo, vou adicionar alguns. De qualquer forma, este "plus" relação é reflexiva, então Ele + Ele é Ele, I + I é eu ....
Simone Chelo
5
Recebo " I+I=I", pois só pode haver um " I" de um determinado orador. Mas não podia " He+He=They"? Geralmente, se você diz " He" duas vezes nesta construção, está se referindo a dois assuntos masculinos diferentes , não ao mesmo duas vezes.
Darrel Hoffman
Muitos dialetos do inglês têm equivalentes de voi . Na minha, são vocês , e usados ​​no registro formal. Outro comum é você , embora eu não ache que alguém se acostume a falar formalmente. Tradicionalmente, você também tem vós , bem conhecido por muitos porque é comum em algumas traduções bíblicas. Você deve adicionar em um destes ou atirar em tu , assim como para realmente mudar as coisas.
user0721090601

Respostas:

9

Retina, 62 61 56 53 52 bytes

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

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

Mais golfe e explicação vem mais tarde.

As 4 etapas de substituição fazem o seguinte:

  • qualquer coisa várias vezes é em si
  • se houver algum We ou I + anyhing o resultado é We
  • para qualquer outra coisa que contenha você, o resultado é você
  • se ainda tivermos várias partes ou uma sola Eles são Eles como somente Ele e Eles podem ser deixados

Experimente online aqui.

3 bytes salvos graças a Martin Büttner.

randomra
fonte
Exceto no último estágio, você pode usar em .vez de \+, pois esse é o único caractere permitido na frente de uma letra maiúscula ou depois I.
Martin Ender
6

JavaScript (ES6), 130 bytes

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])

Explicação

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
)

Teste

user81655
fonte
Uau, eu gosto dessa abordagem! Acho que fiz um bônus muito ruim, pois para alcançá-lo aqui, você teria que adicionar 7 bytes na matriz (", She, It") e 28 na matriz, atingindo 165 -15% = 140 ...
Simone Chelo
2

Perl 5, 67 bytes

79 bytes, na verdade, mas há um bônus de 15%.

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

Python 159 153 bytes

EDIT : Obrigado @ Pietu1998

Esta é uma tradução direta da resposta 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]

Experimente aqui

TanMath
fonte
snão precisa ser uma variável e você pode remover a linha e o espaço extras entre as linhas fore r=. Além disso, convém verificar se isso pode ser mais curto como uma função.
precisa saber é o seguinte
1

Ruby, 150 136 131 119 119 111 bytes

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]}

Recurso de bônus: lida com várias expressões na mesma linha de comando.

PellMell
fonte