ลุงของคุณต้องการความช่วยเหลือในการเมา


10

Drunk Uncle (ขออภัย ME และ AUS สำหรับการล็อคภูมิภาค) เป็นตัวละครจาก Saturday Night Live เขามักจะสับสนคำพูดสำหรับคนอื่น ๆ ที่ฟังดูเหมือนพวกเขา สำหรับความท้าทายนี้คุณจะต้องแปลงคำพูดปกติให้เป็นดรัมสกิน

ขั้นตอนวิธี

การแปลไปเป็นแบบ Drunkspeak นั้นจำเป็นต้องสลับลำดับของคำในข้อความ การแลกเปลี่ยนจะขึ้นอยู่กับความคล้ายคลึงกันของคำสองคำที่มึนเมา ความคล้ายคลึงกันมึนเมาถูกกำหนดให้เป็นจำนวนตัวอักษรที่สองคำได้เกิดขึ้นที่ดัชนีเดียวกัน อย่างไรก็ตามคำสองคำที่เหมือนกันมีความคล้ายคลึงกันมึนเมา -1 ตัวอย่างเช่นtreeและfriendมีความคล้ายคลึงกันมึนเมา 2 เนื่องจากทั้งคู่มี 'r' ที่ดัชนี 1 และ 'e' ที่ดัชนี 3

สิ่งที่คุณต้องทำคือค้นหาสองคำในข้อความที่มีความคล้ายคลึงกันมึนเมาสูงสุดแล้วสลับคำเหล่านั้น เมื่อคุณสลับสองคำพวกเขาจะไม่ย้ายอีกต่อไป จากนั้นคุณดูคำศัพท์ที่ถอดเปลี่ยนได้ที่เหลืออยู่และสลับทั้งสองที่มีความคล้ายคลึงกันเมาสุราสูงสุด คุณทำเช่นนี้ต่อไปจนกว่าคุณจะไม่สามารถแลกเปลี่ยนได้อีกต่อไป จากนั้นคุณส่งออก (หรือส่งคืนสำหรับฟังก์ชัน) ข้อความที่อัปเดต

ข้อมูลจำเพาะ

  • เพื่อความเรียบง่ายอินพุตคือรายการคำที่ประกอบด้วยอักขระใน [A-Za-z]
  • ทุกอินพุตมีอย่างน้อยหนึ่งคำ
  • การจับคู่ตัวอักษรเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่: Aตรงกับa( หมายเหตุ:เนื่องจากกฎนี้Dogและdogเหมือนกันจึงมี DS เป็น -1)
  • หากหลายคู่มีความคล้ายคลึงกันมึนเมาสูงสุด:
    1. ในคำที่สามารถเพิ่มความคล้ายคลึงกันของมึนเมาสูงสุดให้เลือกคำที่มีดัชนีต่ำที่สุดในรายการ
    2. จับคู่คำนั้นกับคำที่ดัชนีต่ำสุดที่เพิ่มความคล้ายคลึงกันที่มึนเมาสูงสุด

ตัวอย่าง

  1. Drunk Uncle needs your help (หัวข้อ)

    • S 1 : เมา <=> ของคุณ (DS: 1)your Uncle needs Drunk help
    • S 2 : ต้องการความช่วยเหลือ <=> (DS: 1)your Uncle help Drunk needs
    • เอาท์พุท: your Uncle help Drunk needs
  2. I love fidget spinners (ตัวอย่างที่น่าเบื่อ)

    • S 1 : ฉัน <=> ความรัก (DS: 0)love I fidget spinners
    • S 2 : fidget <=> สปินเนอร์ (DS: 0)love I spinners fidget
  3. dog eat dog ear

    • S 1 : กิน <=> หู (DS: 2)dog ear dog eat
    • S 2 : สุนัข <=> สุนัข (DS: -1) dog ear dog eat(ขั้นตอนนี้เป็นทางการ)
  4. Let me tell you a story

    • S 1 : ให้ <=> ฉัน (DS: 1)me Let tell you a story
    • S 2 : บอก <=> คุณ (DS: 0)me Let you tell a story
    • S 3 : เรื่องราว <=> (DS: 0)me Let you tell story a
  5. Too many money and purple people

    • S 1 : สีม่วง <=> คน (DS: 4)Too many money and people purple
    • S 2 : เงินจำนวนมาก <=> (DS: 2)Too money many and people purple
    • S 3 : เกินไป <=> และ (DS: 0)and money many Too people purple

แจ้งให้เราทราบหากมีตัวอย่างเพิ่มเติมที่คุณต้องการให้ฉันครอบคลุม


8
โปรดเปลี่ยน 'ฉันรักนักปั่นที่ได้รับ fid' เป็น 'ฉันเกลียดนักที่ได้รับ fid-get'
Okx

1
"ภาษาธรรมชาติ"
HyperNeutrino

คำตอบ:


3

JavaScript - 286 279 ไบต์

f=(a,n=(a=a.split` `).length)=>{for(d=n>>1;w=-2,d--;){for(i=n;i--;)for(j=n;j--;)s=((a,f,v=0)=>{for(u=s=a!=f;(r=a[v])&&(t=f[v++]);s+=(p=a=>a.toLowerCase())(r)==p(t));return u*s-1})(a[i],a[j]),!(f[i]|f[j])&&s>=w&&(w=s,x=i,y=j);f[x]=f[y]=1,[a[x],a[y]]=[a[y],a[x]];}return a.join` `}

คุณสามารถลองJSFiddle


ยินดีต้อนรับสู่ PPCG อีกครั้งการส่งครั้งแรกที่ดี!
HyperNeutrino

2

Python 3, 285 277 270 267 Bytes ไม่ทำงาน

i=input().split();r=range;l=len;t=y=z=-1;n=str.lower
for p in r(l(i)):
 for q in r(p):
  b=min(l(i[p]),l(i[q]));x=0
  for s in r(b):
   if n(i[p][s])==n(i[q][s]):
    x=x+1
  if n(i[p])==n(i[q]):
   x=-1
  if x>t:
   t=x;y=p;z=q
i[y],i[z]=i[z],i[y]
print(" ".join(i))

ฉันพยายามทำให้ผลลัพธ์ตรงกับความท้าทายไม่ใช่กรณีทดสอบเนื่องจากสองกรณีทดสอบขัดแย้งกับความท้าทาย

แก้ไข: golfy สิ่ง 'ต่ำ'

แก้ไข: เปลี่ยนการแยก ("") เพื่อแยก ()

แก้ไข: ฉันรู้ว่าสิ่งนี้ไม่ได้ทำให้ทุกสิ่งเสร็จสมบูรณ์และในขณะที่ฉันอาจจะได้คำตอบที่ใช้งานได้ทั้งหมดในขณะเดียวกันฉันก็อาจเพิ่มได้ว่าการทำซ้ำเพียงครั้งเดียว


1
คุณจำเป็นต้องกำหนดอย่างใดอย่างหนึ่งg = str.lowerหรือg = lambda s: s.lower()ซึ่งคุณสามารถใช้เช่นนี้
2560

@ บรูซ Forte ขอบคุณ! นี่เป็นการกำจัด 8 ไบต์ (มันลงไปที่ 270 เพียงเพราะฉันต้องแก้ไขสิ่งที่ต้องทำเพื่อที่จะสลับคำแม้ว่าความคล้ายคลึงกันสูงสุดคือ 0; สิ่งนี้เพิ่มไบต์)
ไม่เป็นอันตราย

1
ไม่มีปัญหาและยินดีต้อนรับสู่ PPCG! หากคุณยังไม่เคยเห็นโพสต์เหล่านี้มีประโยชน์มาก Btw จะถูกแทนที่ด้วย.split(' ') .split()
2560

รอคุณเปลี่ยนกรณีทดสอบอะไรและเกิดอะไรขึ้นกับพวกเขา
geokavel

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