Zamir işlemi


24

Meydan okuma

Bir argüman olarak + işaretleriyle ayrılmış bir veya daha fazla öznel kişisel zamirden oluşan bir dize alan bir işlev veya program yazın . Çıktı, bir sonraki paragrafta tanımlanan ilişkinin sonucu olan tek bir zamir olmalıdır.

Tabii ki, kesinlikle mevcut olan gramer hatalarını düzeltmek istediğinizde düzenlemekten çekinmeyin;)

Bu bir kod golf mücadelesidir, bu yüzden en kısa kod kazanır.

İlişki

Bu görevin amacı, günlük kullandığımız bir şeyi "matematik konuşması" olarak çevirmektir. "Sen ve ben" hakkında nasıl düşünüyoruz? "Biz" değil mi? Yani, eğer girdi ise You+Içıktı dizge olmalıdır We. İkiden fazla zamir ile şöyle görünmelidir: You+He+They->You

İlişki bu tablo olarak tanımlanır:

      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

'Siz' Sorunu

Gördüğünüz gibi, anadili İngilizce değil. Benim dilinde (İtalyanca) çoğul arasında bir fark var sen ( voi İtalyanca) ve tekil sen ( tu ). Bu zorluğu düşündüğümde ingilizce düşünmedim, bu yüzden çoğul mu tekil mi kullandığımı fark etmem mümkün değil. Neyse ki (ya da belli ki?), Giriş / çıkış her iki biçimde de değişmez, bu yüzden bunlardan birini kullanabilir ve her iki durumu da kapsayacak!

Giriş hakkında

Girdi her zaman "Pronoun + Pronoun + Pronoun" biçiminde olacaktır ... Zamirler ilk harfleri büyük harf, geri kalanları küçük harflerdir. Artılar boşluklarla değil, sadece zamirler ile çevrelenmeyeceklerdir. Boş girdi mümkündür ve sonuç boş çıktı olmalıdır.

Bonus

% 15 küçük bir ikramiye programı iki yeni zamir yönetecek eğer: She ve It . Açıkçası, O'nun aynısı. Bu ilişkinin dönüşlü olduğunu hatırlayın, öyleyse O -> O ve O -> O. Bu nedenle, yalnızca Kendisini, Kendisini veya O'nu içeren herhangi bir kombinasyon, Bunları çıkarmalıdır.

Örnekler

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, haklı olduğunuz örnekler hakkında konuşuyorsanız, birkaç tane ekleyeceğim. Neyse, bu "artı" ilişki yansıtıcıdır, bu yüzden O + O O, Ben + Ben I ....
Simone Chelo

5
Belirli bir konuşmacıdan I+I=Isadece bir tane olabileceğinden " " alıyorum IAma " He+He=They" yapamadı ? Genel olarak He, bu yapımda iki kez " " derseniz , aynı olanı iki kez değil, iki farklı erkek denekten bahsediyorsunuz .
Darrel Hoffman,

İngilizce'nin birçok lehçesinde voi eşdeğeri vardır . Benimki, hepiniz ve resmi kayıt defterinde kullanılmış. Başka bir ortak biridir yous O gerçekten biçimsel konuşmada kullanılan alır sanmıyorum olsa. Geleneksel olarak, siz de ye de birçok bilinen, çünkü bazı İncil çevirilerinde 's yaygın. Bunlardan birinde ekleyebilir veya atmak gerekir thou sallamak gerçekten de keza öyle.
user0721090601

Yanıtlar:


9

Retina, 62 61 56 53 52 bayt

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

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

Daha fazla golf ve açıklama sonra gelir.

4 ikame adımı şunları yapar:

  • Birden çok kez bir şey kendisi
  • Herhangi Bir Biz veya Ben varsa + Sonuçta Biz
  • seni içeren başka bir şey için sonuç sensin
  • hala birden fazla parçamız veya bir tabanımız varsa, onlar sadece onlar o ve onlar kalabilirler

Burada çevrimiçi deneyin.

Martin Büttner sayesinde 3 bayt kurtarıldı.


Son aşama hariç, .yerine kullanabilirsiniz \+, çünkü büyük harfli harflerden önce veya sonra izin verilen tek karakter budur I.
Martin Ender

6

JavaScript (ES6), 130 bayt

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

açıklama

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
)

Ölçek


Vay, bu yaklaşımı sevdim! Sanırım çok kötü bir bonus kazandım, çünkü buraya ulaşmak için dizide 7 bayt (", O, O") ve matriste 28,% 165-15'e ulaşarak eklemek zorundasınız ...
Simone Chelo

2

Perl 5, 67 bayt

Gerçekten 79 bayt, ancak% 15 bonus var.

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

2

Python 159 153 bayt

EDIT : Teşekkürler @ Pietu1998

Bu Javascript ES6 cevabının doğrudan çevirisidir:

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]

Burada dene


sdeğişken olmak zorunda değildir ve forve r=çizgileri arasındaki fazladan çizgi ve boşluğu kaldırabilirsiniz . Ayrıca, bunun bir işlev olarak daha kısa olup olmadığını kontrol etmek isteyebilirsiniz.
PurkkaKoodari

1

Ruby, 150 136 131 119 111 bayt

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

Bonus özelliği: aynı komut satırında birden fazla ifadeyi ele alır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.