Operacja zaimka

24

Wyzwanie

Napisz funkcję lub program, który jako argument przyjmuje ciąg złożony z jednego lub więcej subiektywnych zaimków osobowych , oddzielonych znakami + . Wynikiem musi być pojedynczy zaimek, który jest wynikiem relacji zdefiniowanej w następnym akapicie.

Oczywiście możesz edytować, ponieważ chcesz poprawić błędy gramatyczne, które z pewnością są obecne;)

To wyzwanie dla golfa, więc wygrywa najkrótszy kod.

Relacja

Celem tego zadania jest przetłumaczenie w języku „matematyki” czegoś, z czego korzystamy na co dzień. Jak myślimy o „Ty i ja”? „My”, prawda? Tak więc, jeśli wejście jest You+Iwyjściem, powinien to być ciąg We. Przy więcej niż dwóch zaimkach powinno to wyglądać następująco: You+He+They->You

Relacja jest zdefiniowana jako następująca 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

Problem „Ty”

Jak widać, nie jestem rodzimym językiem angielskim. W moim języku (włoskim) istnieje różnica między liczbą mnogą you ( voi , po włosku) a liczbą pojedynczą you ( tu ). Kiedy myślałem o tym wyzwaniu, nie myślałem po angielsku, więc jest problem, którego nie można rozpoznać, jeśli używam liczby mnogiej lub pojedynczej. Na szczęście (lub oczywiście?) Wejście / wyjście nie zmienia się w obu formach, więc możesz użyć jednego z nich i obejmiesz oba przypadki!

O wejściu

Dane wejściowe zawsze będą miały postać „Zaimek + zaimek + zaimek” ... Zaimki będą miały pierwszą literę dużymi literami, a pozostałe małe. Plusy nie będą otoczone spacjami, tylko zaimkami. Możliwe jest puste wejście i wynik musi być pusty.

Premia

Mała premia w wysokości 15%, jeśli program będzie zarządzał dwoma nowymi zaimkami: Ona i To . Są oczywiście takie same jak On. Pamiętaj, że ta relacja jest zwrotna, więc Ona -> Ona i To -> To. Dlatego każda kombinacja, która obejmuje tylko Ona, On lub To, powinna dać je.

Przykłady

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
źródło
@ Timwi, jeśli mówisz o przykładach, które masz rację, dodam kilka. W każdym razie ta relacja „plus” jest refleksyjna, więc On + On jest On, I + I is I ....
Simone Chelo
5
Dostaję „ I+I=I”, ponieważ Iz danego głośnika może być tylko jeden „ ”. Ale nie mógł „ He+He=They”? Zasadniczo, jeśli powiesz „ He” dwa razy w tej konstrukcji, masz na myśli dwa różne tematy mężczyzn, a nie ten sam dwa razy.
Darrel Hoffman
Wiele dialektów języka angielskiego ma odpowiedniki voi . W kopalni, to wszyscy, i stosowane w oficjalnym rejestrze. Innym powszechnym jest twój , choć nie sądzę, żeby naprawdę przyzwyczaił się do mowy formalnej. Tradycyjnie, masz również wy , dobrze znany wielu, ponieważ jest to powszechne w niektórych tłumaczeniach biblijnych. Należy dodać w jednej z nich lub wrzucić w ty również naprawdę wstrząsnąć rzeczy.
user0721090601

Odpowiedzi:

9

Siatkówka, 62 61 56 53 52 bajty

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

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

Dalsza gra w golfa i wyjaśnienia są dostępne później.

4 kroki podstawienia wykonują następujące czynności:

  • wszystko wiele razy jest samo w sobie
  • jeśli istnieje coś My lub I +, wynikiem jest My
  • dla wszystkiego, co zawiera Ciebie, wynikiem jest Ty
  • jeśli nadal mamy wiele części lub jedną podeszwę, to oni są, ponieważ tylko On i On mogą zostać

Wypróbuj online tutaj.

3 bajty zapisane dzięki Martinowi Büttnerowi.

randomra
źródło
Z wyjątkiem ostatniego etapu możesz użyć .zamiast \+, ponieważ jest to jedyny znak dozwolony przed wielką literą lub po niej I.
Martin Ender
6

JavaScript (ES6), 130 bajtów

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

Wyjaśnienie

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
)

Test

użytkownik 81655
źródło
Wow, podoba mi się to podejście! Myślę, że zrobiłem bardzo słabą premię, ponieważ aby ją osiągnąć, musisz dodać 7 bajtów w tablicy („She, It”) i 28 w macierzy, osiągając 165-15% = 140 ...
Simone Chelo
2

Perl 5, 67 bajtów

79 bajtów naprawdę, ale jest 15% bonus.

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

Python 159 153 bajtów

EDYCJA : Dzięki @ Pietu1998

To jest bezpośrednie tłumaczenie odpowiedzi 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]

Wypróbuj tutaj

TanMath
źródło
snie musi być zmienną i możesz usunąć dodatkową linię i odstęp między liniami fori r=. Możesz także sprawdzić, czy może to być krótsza funkcja.
PurkkaKoodari
1

Rubinowy, 150 136 131 119 111 bajtów

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

Funkcja bonusowa: obsługuje wiele wyrażeń w tym samym wierszu poleceń.

PellMell
źródło