Operación pronombre


24

El reto

Escriba una función o un programa que tome una cadena compuesta por uno o más pronombres personales subjetivos , separados por signos + , como argumento. La salida debe ser un pronombre único, que es el resultado de la relación definida en el siguiente párrafo.

Por supuesto, siéntase libre de editar, ya que desea corregir los errores gramaticales que seguramente están presentes;)

Este es un desafío de código de golf, por lo que gana el código más corto.

La relación

El objetivo de esta tarea es traducir en "lenguaje matemático" algo que usamos a diario. ¿Cómo pensamos en "Tú y yo"? Bueno, "nosotros", ¿no? Entonces, si la entrada es You+Ila salida, debería ser la cadena We. Con más de dos pronombres, debería verse así: You+He+They->You

La relación se define como esta tabla:

      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

El problema de "usted"

Bueno, como puedes ver, no soy un hablante nativo de inglés. En mi idioma (italiano) hay una diferencia entre el plural ( voi , en italiano) y el singular ( tu ). Cuando pensé en este desafío, no pensé en inglés, por lo que existe el problema de que es imposible reconocerlo si estoy usando una forma plural o singular. Afortunadamente (¿o obviamente?), La entrada / salida no cambia en ambas formas, por lo que puede usar una de ellas y cubrirá ambos casos.

Sobre la entrada

La entrada siempre estará en la forma "Pronombre + Pronombre + Pronombre" ... Los pronombres tendrán la primera letra en mayúscula y el resto en minúscula. Las ventajas no estarán rodeadas de espacios, solo de pronombres. La entrada vacía es posible y el resultado debe ser una salida vacía.

Prima

Una pequeña bonificación del 15% si el programa administrará dos nuevos pronombres: She and It . Son lo mismo que Él, obviamente. Recuerde que esta relación es reflexiva, entonces Ella -> Ella y Ella -> Ella. Por lo tanto, cualquier combinación que incluya solo Ella, Él o Él debería generarlos.

Ejemplos

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, si estás hablando de los ejemplos que tienes razón, agregaré algunos. De todos modos, esta relación "plus" es reflexiva, por lo que He + He es He, I + I es I ....
Simone Chelo

55
Obtengo " I+I=I", ya que solo puede haber uno " I" de un hablante dado. ¿Pero no pudo " He+He=They"? En general, si dice " He" dos veces en esta construcción, se refiere a dos sujetos masculinos diferentes , no al mismo dos veces.
Darrel Hoffman el

Muchos dialectos del inglés tienen equivalentes de voi . En el mío, son todos ustedes y se usan en el registro formal. Otro común es usted , aunque no creo que realmente se use en el discurso formal. Tradicionalmente, también tiene vosotros , bien conocido por muchos porque es común en ciertas traducciones bíblicas. Usted debe agregar en uno de ellos o tirar de , así que realmente cambiar las cosas.
user0721090601

Respuestas:


9

Retina, 62 61 56 53 52 bytes

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

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

Más golf y explicación viene más tarde.

Los 4 pasos de sustitución hacen lo siguiente:

  • cualquier cosa varias veces es en sí
  • si hay alguna We o I + anyhing el resultado es We
  • para cualquier otra cosa que lo contenga, el resultado es usted
  • si todavía tenemos múltiples partes o una suela Ellos son ellos como solo Él y ellos pueden quedar

Pruébelo en línea aquí.

3 bytes guardados gracias a Martin Büttner.


Excepto para la última etapa, puede usar en .lugar de \+, ya que ese es el único carácter permitido delante de una letra mayúscula o después 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])

Explicación

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
)

Prueba


Wow, me gusta este enfoque! Creo que obtuve un bono muy pobre, porque para llegar aquí tendrías que agregar 7 bytes en la matriz (", She, It") y 28 en la matriz, alcanzando 165-15% = 140 ...
Simone Chelo

2

Perl 5, 67 bytes

79 bytes realmente, pero hay un bono del 15%.

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

2

Python 159153 bytes

EDITAR : Gracias @ Pietu1998

Esta es una traducción directa de la respuesta 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]

Pruébalo aquí


sno necesita ser una variable, y puede eliminar la línea y el espacio extra entre las líneas fory r=. Además, es posible que desee comprobar si esto podría ser más corto como una función.
PurkkaKoodari

1

Ruby, 150 136 131 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]}

Característica adicional: maneja múltiples expresiones en la misma línea de comando.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.