ANNNOUNNNCCCEEERRR ข้อความเสียง


18

เขียนฟังก์ชั่นที่ใช้สตริงของตัวอักษรและช่องว่าง (ไม่จำเป็นต้องจัดการกับตัวอักษรที่ไม่ใช่) และดำเนินการอัลกอริทึมการแปลเสียง ANNOUNCER ดังต่อไปนี้:

  • ครั้งแรกทุกอย่างเป็นตัวพิมพ์ใหญ่
  • สำหรับแต่ละคำ
    • ยืดพยัญชนะแต่ละตัวโดยการเพิ่มตัวอักษรสามตัว; ยกเว้นถ้าคำขึ้นต้นด้วยกลุ่มพยัญชนะอย่ายืดออกคลัสเตอร์นั้น ยกตัวอย่างเช่นotherควรจะเป็นOTTTHHHEEERRRแต่ควรจะเป็นmotherMOTTTHHHEEERRR
    • ยืดเสียงสระสุดท้ายด้วยการเพิ่มเสียงสามเท่า
  • ในทั้งสองกรณีของการยืดตัวถ้าคุณกำลังสุ่มตัวอักษรสามตัวก่อนอื่นให้รวมเข้าด้วยกันด้วยตัวอักษรที่ซ้ำกันทั้งสองด้าน ยกตัวอย่างเช่นhillควรจะเป็นHIIILLLและควรจะเป็นbookkeeperBOOKKKEEPPPEEERRR
  • สำหรับจุดประสงค์ของการท้าทายนี้ให้yถือว่าเป็นพยัญชนะ
  • การทำให้ชัดเจน / การทำให้เข้าใจง่าย: คุณอาจสมมติว่าคำแต่ละคู่ถูกคั่นด้วยช่องว่างเดียวและอินพุตนั้นไม่มีช่องว่างต่อเนื่องและอินพุตนั้นจะไม่เป็นสตริงว่าง
  • รหัสที่สั้นที่สุดชนะ!

ทดสอบเวกเตอร์:

> sunday sunday
SUNNNDDDAAAYYY SUNNNDDDAAAYYY
> mia hamm
MIAAA HAAAMMM
> chester alan arthur
CHESSSTTTEEERRR ALLLAAANNN ARRRTTTHHHUUURRR
> attention please
ATTTENNNTTTIOOONNN PLEASSSEEE
> supercalifragilisticexpialidocious
SUPPPERRRCCCALLLIFFFRRRAGGGILLLISSSTTTICCCEXXXPPPIALLLIDDDOCCCIOUUUSSS
> moo
MOOO
> Aachen
AACCCHHHEEENNN
> Oooh
OOOHHH
> grifffest
GRIFFFEEESSSTTT
> k
K
> aaaabbbbc
AAAABBBBCCC

นี่คือการดำเนินการอ้างอิงซึ่งฉันจะย้ายไปที่คำตอบยกเว้นเมื่อเช้านี้คำถามถูกปิด : P

import itertools,re
def j(s):return re.match('^[AEIOU]+$',s)
def c(s):return ''.join(sum(([h,h,h]for h in[k for k,g in itertools.groupby(s)]),[]))
def v(s):
 while len(s)>=2 and s[-2]==s[-1]:s=s[:-1]
 return s+s[-1]+s[-1]
def a(n):
 r=''
 for w in n.split():
  if r:r+=' '
  ss=re.split('([AEIOU]+)', w.upper())
  for i,s in enumerate(ss):
   r += [v(s),s][any(j(t) for t in ss[i+1:])]if j(s)else[s,c(s)][i>0]
 return r
while 1:print a(raw_input('> '))

2
คำขอสำหรับอนาคต: คำที่หลีกเลี่ยงโปรดและวลีที่ชอบพยัญชนะกลุ่ม , รวมกันและการยืดตัว ผู้พูดภาษาอังกฤษที่ไม่ใช่เจ้าของภาษาอย่างฉันอาจต้องใช้พจนานุกรมเพื่อทำความเข้าใจกับโพสต์ของคุณ
Dennis

มันควรเป็นเสียงสระที่ "ยืดออก" :(
Devil's Advocate

คลัสเตอร์พยัญชนะคืออะไร?
MilkyWay90

คำตอบ:


6

APL (Dyalog) , 175 ไบต์

1' +'R' ''[AEIOU][^AEIOU]+ 'R{m/⍨1,3×2≠/m←⍵.Match}'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'R'\1\1\1\2' '&' '&' '\1\1\1''$| |^'R'  '1(819⌶)⍞

ลองออนไลน์!

 พรอมต์สำหรับการป้อนอักขระ

1(819⌶) แปลงเป็นตัวพิมพ์ใหญ่ (819 ≈ Big)

 ผ่านผลลัพธ์เพิ่มเติม (ทำหน้าที่ในการแยกสตริงและ 1)

'$| |^'⎕R' 'R eplace:
 จุดสิ้นสุดช่องว่างใด ๆ และจุดเริ่มต้น
 →ช่องว่างสองช่อง

 ส่งผ่านผลลัพธ์เพิ่มเติม (ทำหน้าที่แยกสตริงสองกลุ่ม)

'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'R eplace:
 หมายเลขใด ๆ ของสระเหมือนกันและจำนวนที่ไม่ใช่สระ-ใด ๆ และพื้นที่
 →สระสามครั้งและพยัญชนะไม่แปร
 พื้นที่และสระ
 →ตัวเอง
 พื้นที่และพยัญชนะกลุ่ม
 →ตัวเอง
 วิ่งพยัญชนะเหมือน
 →สามของคนเหล่านั้น สระ

'[AEIOU][^AEIOU]+ '⎕R{}R eplace:
 การทำงานของ non-vowels และ a space
 →ผลลัพธ์ของฟังก์ชั่นนิรนามต่อไปนี้ที่มี namespace เป็นอาร์กิวเมนต์:
  ⍵.Match ข้อความที่พบว่า
  m← มอบหมายให้m
  2≠/ จับคู่ที่แตกต่างกัน - จากการ
   คูณด้วยสาม
  1, prepend หนึ่งการ
  m/⍨ ใช้ที่จะทำซ้ำm

 ผ่านผลลัพธ์เพิ่มเติม (ทำหน้าที่แยกสองสาย)

' +'⎕R' 'R eplace:
 หนึ่งช่องว่างหรือมากกว่า
 →ด้วยช่องว่างเดียว

1↓ ปล่อยตัวอักษรเริ่มต้น (ช่องว่าง)


มันใช้ได้ไหม? 1↓' +'⎕R' '⊢'[AEIOU][^AEIOU]+ '⎕R{m/⍨1,3×2≠/m←⍵.Match}'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R(s,'\2')'&' '&'(s←6⍴'\1')⊢'$| |^'⎕R' '⊢1(819⌶)⍞
Zacharý

^ บันทึกสองไบต์ถ้าใช้งานได้ ^
Zacharý

5

JS (ES6), 138 134 129 ไบต์

s=>s.toUpperCase()[r="replace"](/(\w)\1/g,"$1")[r](/[AEIOU](?=[^AEIOU]*( |$))/g,s=>s+s+s)[r](/\B./g,s=>/[AEIOU]/.test(s)?s:s+s+s)

WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS มีAEIOU3 ครั้ง แต่ฉันไม่สามารถตีกอล์ฟให้เป็นหนึ่งเดียวได้

-4 ไบต์ต้องขอบคุณ HyperNeutrino

Ungolfed

function v(str){
    return str.toUpperCase().replace(/(\w)\1/g,"$1").replace(/[AEIOU](?=[^AEIOU]*( |$))/g,s=>s+s+s).replace(/\B./g,s=>[..."AEIOU"].includes(s)?s:s+s+s);
}

ฉันชอบที่จะเขียนไม่อ่านรหัส


1
"WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSSS" ... อยู่ในสถานที่แรกหน้า APL
Zacharý

ฉันไม่รู้จัก JS แต่คุณสามารถแทนที่s=>/[AEIOU]/.test(s)ด้วยได้/[AEIOU]/.testหรือไม่
musicman523

@ musicman523 เศร้าไม่เพราะมันเป็นเงื่อนไขในคำสั่งประกอบการประกอบ
ABot

FYI การจัดการกลุ่มพยัญชนะของคุณดูเหมือนจะไม่ถูกต้องเล็กน้อย ผลลัพธ์ที่เหมาะสมจะเป็นWAAAYYY TOOO MAAANNNYYY BYTEEESSS(เช่นไม่ยืดคลัสเตอร์เริ่มต้นBYT)
Quuxplusone

ในตอนแรกก็คือ
Zacharý

5

APL, 90 ไบต์

{1↓∊{s←{⍵⊂⍨1,2≠/⍵}⋄x↑⍨¨(3⌈≢¨s⍵)⌊≢¨x←s⍵/⍨(1+2×{⌽<\⌽⍵}∨~∧∨\)⍵∊'AEIOU'}¨w⊂⍨w=⊃w←' ',1(819⌶)⍵}

คำอธิบาย:

  • 1(819⌶)⍵: แปลงเป็นตัวพิมพ์ใหญ่
  • w⊂⍨w=⊃w←' ',: แบ่งช่องว่าง
  • {... : สำหรับแต่ละคำ ...
    • s←{⍵⊂⍨1,2≠/⍵}: sเป็นฟังก์ชันที่แยกสตริงออกเป็นกลุ่มของอักขระที่ตรงกันที่ต่อเนื่องกัน
    • ⍵∊'AEIOU': ทำเครื่องหมายสระ
    • (... ): ดูว่าอักขระตัวไหนจะเพิ่มขึ้นสามเท่า
      • ~∧∨\: พยัญชนะทั้งหมดผ่านสระแรก
      • {⌽<\⌽⍵}: เสียงสระสุดท้าย
      • : คูณเวกเตอร์ bit by two
      • 1+: และเพิ่มหนึ่งรายการ ตอนนี้ตัวอักษรที่เลือกทุกคนมีและส่วนที่เหลือมี31
    • ⍵/⍨: ทำซ้ำอักขระแต่ละตัวด้วยจำนวนที่กำหนด
    • x←s: xแยกมันออกเป็นสายของตัวละครที่ตรงกันและจัดเก็บใน
    • (3⌈≢¨s⍵): ความยาวของแต่ละกลุ่มของอักขระที่ตรงกันในคำที่มีค่าสูงสุด 3
    • ⌊≢¨: xต่ำสุดของที่และความยาวของกลุ่มในการ
    • x↑⍨¨: ทำให้แต่ละกลุ่มมีความยาว
  • 1↓∊: แผ่ผลลัพธ์และวางอักขระตัวแรก (ช่องว่างที่ถูกเพิ่มที่จุดเริ่มต้นเพื่อช่วยในการแยก)

คุณชนะอดัม ... ว้าว
Zacharý

เรียบร้อยมาก! หากคุณสับเปลี่ยนกันสักครู่แล้วเขียนเป็นโปรแกรม (ใช้พรอมต์ตามที่Adámแนะนำ) คุณสามารถลบทิ้งอีก 15 ไบต์:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Gil

3

Python 417 ไบต์

นี่คือการใช้งานอ้างอิงใน Python ไม่กอล์ฟชะมัด

import itertools,re
def j(s):return re.match('^[AEIOU]+$',s)
def c(s):return ''.join(sum(([h,h,h]for h in[k for k,g in itertools.groupby(s)]),[]))
def v(s):
 while len(s)>=2 and s[-2]==s[-1]:s=s[:-1]
 return s+s[-1]+s[-1]
def a(n):
 r=''
 for w in n.split():
  if r:r+=' '
  ss=re.split('([AEIOU]+)',w.upper())
  for i,s in enumerate(ss):
   r+=[v(s),s][any(j(t) for t in ss[i+1:])]if j(s)else[s,c(s)][i>0]
 return r

ทดสอบกับ:

while True:
 print a(raw_input('> '))

อย่างน้อยคุณไม่ควรที่จะตีมันลงอีกซักหน่อยโดยการลบพื้นที่ที่ไม่จำเป็นออกและเปลี่ยนssเป็นS?
Zacharý

2

Python 3 , 238 ไบต์

def f(s):
 s=s.upper();k=[s[0]];s=''.join(k+[s[i]for i in range(1,len(s))if s[i]!=s[i-1]])
 for i in range(1,len(s)):k+=[s[i]]*(3-2*(s[i]in'AEIOU'and i!=max(map(s.rfind,'AEIOU'))))
 return''.join(k)
print(' '.join(map(f,input().split())))

ลองออนไลน์!


คุณสามารถบันทึกไบต์ด้วยการตั้งค่าvเป็น'AEIOU'?
Zacharý

@ Zacharýขอบคุณ แต่น่าเสียดายที่มันไม่เปลี่ยน bytecount
HyperNeutrino

vโอ้พื้นที่รอบแรก
Zacharý

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