การดำเนินการสรรพนาม


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

ปัญหา 'คุณ'

อย่างที่คุณเห็นฉันไม่ใช่คนพูดภาษาอังกฤษ ในภาษาของฉัน (อิตาลี) มีความแตกต่างระหว่างพหูพจน์คุณ ( voi , ในอิตาลี) และเอกพจน์คุณ ( 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

@ Timwi ถ้าคุณกำลังพูดถึงตัวอย่างที่คุณพูดถูกฉันจะเพิ่มอีกสองสามอย่าง อย่างไรก็ตามความสัมพันธ์ "บวก" นี้สะท้อนกลับดังนั้นเขา + เขาคือเขาฉัน + ฉันคือฉัน ....
Simone Chelo

5
ฉันได้รับ " I+I=I" เนื่องจากอาจมีเพียงIลำโพงเดียวเท่านั้น " " แต่ไม่สามารถ " He+He=They"? โดยทั่วไปถ้าคุณพูดว่า " He" สองครั้งในการก่อสร้างนี้คุณจะหมายถึงทั้งสองแตกต่างกันอาสาสมัครชายไม่ได้เป็นคนเดียวกันสองครั้ง
Darrel Hoffman

ภาษาหลายภาษาอังกฤษมีเทียบเท่าVoi ในเหมืองก็y'allและใช้ในการลงทะเบียนอย่างเป็นทางการ อีกคนหนึ่งคือคุณแม้ว่าฉันจะไม่คิดว่ามันจะถูกใช้ในการพูดอย่างเป็นทางการจริงๆ ตามเนื้อผ้าคุณยังมีเจ้า , ที่รู้จักกันดีจำนวนมากเพราะเป็นเรื่องปกติในการแปลพระคัมภีร์บางอย่าง คุณควรเพิ่มในหนึ่งในเหล่านี้หรือโยนในพระองค์เช่นเดียวจริงๆเขย่า
0721090601

คำตอบ:


9

เรติน่า, 62 61 56 53 52 ไบต์

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

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

กอล์ฟเพิ่มเติมและคำอธิบายมาในภายหลัง

4 ขั้นตอนการทดแทนทำต่อไปนี้:

  • อะไรก็ได้หลายครั้งเป็นของตัวเอง
  • หากมีเราหรือฉัน + anyhing ผลลัพธ์ก็คือเรา
  • สำหรับสิ่งอื่นที่มีคุณผลลัพธ์คือคุณ
  • ถ้าเรายังมีหลายส่วนหรือเพียงอย่างเดียวพวกเขามันเป็นเพียงเขาและพวกเขาก็สามารถทิ้ง

ลองออนไลน์ได้ที่นี่

บันทึก 3 ไบต์ด้วย Martin Büttner


ยกเว้นขั้นตอนสุดท้ายคุณสามารถใช้.แทนเพราะนั่นเป็นเพียงตัวละครที่ได้รับอนุญาตในด้านหน้าของอักษรตัวใหญ่หรือหลัง\+ I
Martin Ender

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
)

ทดสอบ


ว้าวฉันชอบวิธีนี้! ฉันคิดว่าฉันทำโบนัสที่แย่มากทำให้ถึงที่นี่คุณจะต้องเพิ่ม 7 ไบต์ในอาร์เรย์ (", She, It") และ 28 ในเมทริกซ์ถึง 165 -15% = 140 ...
Simone Chelo

2

Perl 5, 67 ไบต์

79 ไบต์จริง ๆ แต่มีโบนัส 15%

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

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]

ลองที่นี่


sไม่จำเป็นต้องเป็นตัวแปรและคุณสามารถลบบรรทัด & ช่องว่างพิเศษระหว่างบรรทัดforและ r=นอกจากนี้คุณอาจต้องการตรวจสอบว่าฟังก์ชันนี้อาจสั้นกว่านี้หรือไม่
PurkkaKoodari

1

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

คุณสมบัติโบนัส: จัดการหลายนิพจน์ในบรรทัดคำสั่งเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.