PENGUMUMAN VOICCCEEE

18

Tulis fungsi yang mengambil string huruf dan spasi (tidak perlu menangani non-huruf) dan melakukan algoritma terjemahan ANNOUNCER VOICE sebagai berikut:

  • Pertama, huruf besar semuanya.
  • Untuk setiap kata,
    • Rentangkan setiap gugus konsonan dengan melipattigakan tiga huruf; kecuali, jika kata dimulai dengan gugus konsonan, jangan memanjang gugus itu. Misalnya, otherharus menjadi OTTTHHHEEERRRtetapi motherharus menjadi MOTTTHHHEEERRR.
    • Rentangkan vokal terakhir dengan tiga kali lipat.
  • Dalam kedua kasus perpanjangan , jika Anda melipattigakan tiga surat, pertama satukan dengan surat duplikat di kedua sisi. Misalnya, hillharus menjadi HIIILLLdan bookkeeperharus menjadi BOOKKKEEPPPEEERRR.
  • Untuk keperluan tantangan ini, ydianggap sebagai konsonan.
  • Klarifikasi / penyederhanaan: Anda dapat mengasumsikan bahwa setiap pasangan kata dipisahkan oleh satu spasi, dan bahwa input tidak mengandung spasi berurutan, dan bahwa input tidak akan menjadi string kosong.
  • Kode terpendek menang!

Vektor uji:

> 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

Berikut adalah implementasi referensi yang saya akan pindah ke jawaban kecuali bahwa pada pagi ini pertanyaan sudah ditutup. : 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('> '))
Quuxplusone
sumber
2
Permintaan untuk masa depan: harap hindari kata-kata dan frasa seperti gugus konsonan , penggabungan , dan perpanjangan . Seorang penutur bahasa Inggris non-pribumi seperti saya mungkin perlu kamus untuk memahami posting Anda.
Dennis
Seharusnya vokal yang "memanjang" :(
Pengacara Setan
Apakah cluster konsonan itu?
MilkyWay90

Jawaban:

6

APL (Dyalog) , 175 byte

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⌶)⍞

Cobalah online!

 meminta input karakter

1(819⌶) dikonversi menjadi huruf besar (819 ≈ Besar)

 meneruskan hasilnya lebih lanjut (berfungsi untuk memisahkan string dan 1)

'$| |^'⎕R' 'R eplace:
 akhir, spasi apa saja, dan awal
 → dua spasi

 lanjutkan hasilnya (berfungsi untuk memisahkan dua kelompok string)

'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'R eplace:
 sejumlah vokal identik dan sejumlah non-vokal dan spasi
 → vokal tiga kali dan konsonan yang tidak dimodifikasi
 spasi dan vokal
 → sendiri
 spasi dan gugus konsonan
 → sendiri
 konsonan identik
 → tiga dari mereka vokal

'[AEIOU][^AEIOU]+ '⎕R{... }R eplace:
 serangkaian non-vokal dan spasi
 → hasil dari fungsi anonim berikut dengan namespace sebagai argumen:
  ⍵.Match teks yang ditemukan
  m← menetapkan bahwa untuk m
  2≠/ memasangkan secara bijak  -dari
   kalikan dengan tiga kali
  1,pertama
  m/⍨ gunakan itu untuk mereplikasim

 lanjutkan hasilnya (berfungsi untuk memisahkan dua string)

' +'⎕R' 'R eplace:
 satu ruang atau lebih
 → dengan satu ruang

1↓ letakkan huruf awal (spasi)

Adm
sumber
Apakah ini berhasil? 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ý
^ Menghemat dua byte jika berfungsi ^
Zacharý
5

JS (ES6), 138 134 129 byte

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. Berisi AEIOU3 kali, tapi saya tidak bisa memasukkannya menjadi satu.

-4 byte berkat HyperNeutrino

Tidak disatukan

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);
}

Saya suka menulis, bukan membaca kode.

Tidak
sumber
1
"WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS" ... pertama-tama, di depan APL.
Zacharý
Saya tidak tahu JS, tapi dapat Anda ganti s=>/[AEIOU]/.test(s)dengan /[AEIOU]/.test?
musicman523
@ musicman523 sayangnya, tidak, karena itu adalah syarat dalam pernyataan operator ternary.
ABot
FYI, penanganan kelompok konsonan Anda tampaknya sedikit salah; output yang tepat adalah WAAAYYY TOOO MAAANNNYYY BYTEEESSS(yaitu jangan memanjang cluster awal BYT).
Quuxplusone
Yah, ada di tempat pertama.
Zacharý
5

APL, 90 byte

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

Penjelasan:

  • 1(819⌶)⍵: konversikan ke huruf besar
  • w⊂⍨w=⊃w←' ',: berpisah pada spasi
  • {... : untuk setiap kata ...
    • s←{⍵⊂⍨1,2≠/⍵}: sadalah fungsi yang membagi string menjadi kelompok-kelompok karakter yang cocok yang berdekatan
    • ⍵∊'AEIOU': tandai vokal
    • (...) : lihat karakter mana yang akan rangkap tiga
      • ~∧∨\: semua konsonan melewati vokal pertama,
      • {⌽<\⌽⍵}: vokal terakhir.
      • : kalikan vektor bit dengan dua,
      • 1+: dan tambahkan satu. Sekarang semua karakter yang dipilih telah 3dan sisanya dimiliki1 .
    • ⍵/⍨: mereplikasi setiap karakter dalam dengan jumlah yang diberikan
    • x←s: pisahkan menjadi string karakter yang cocok, dan simpan di x .
    • (3⌈≢¨s⍵): panjang setiap grup karakter yang cocok dalam kata input, dengan maksimum 3.
    • ⌊≢¨: minimum dari itu dan panjang grup di x.
    • x↑⍨¨: membuat setiap kelompok menjadi panjang itu
  • 1↓∊: ratakan hasilnya dan letakkan karakter pertama (ruang yang ditambahkan di awal untuk membantu pemisahan)
marinus
sumber
Anda mengalahkan Adám ... wow.
Zacharý
sangat rapi! Jika Anda mengocoknya sedikit dan menuliskannya sebagai sebuah program (menggunakan prompt seperti yang disarankan oleh Adm), Anda dapat mencukur 15 byte lagi:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Gil
3

Python, 417 byte

Berikut implementasi referensi dalam Python. Tidak terlalu golf.

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

Tes dengan:

while True:
 print a(raw_input('> '))
Quuxplusone
sumber
Seharusnya tidak Anda setidaknya golf itu turun lebih lanjut sedikit dengan menghapus ruang yang tidak perlu dan berubah sske S?
Zacharý
2

Python 3 , 238 byte

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

Cobalah online!

HyperNeutrino
sumber
Dapatkah Anda menyimpan byte dengan menetapkan vke 'AEIOU'?
Zacharý
@ Zacharý Terima kasih, tapi sayangnya itu tidak mengubah bytecount.
HyperNeutrino
Oh, spasi di sekitar dulu v.
Zacharý
0

Perl 5 , 139 + 1 (-p) = 140 byte

$_=uc,s/^([^AEIOU]*)//,$s=$1,s/([^AEIOU])\1*/$1x(($q=length$&)>3?$q:3)/ge,s/.*?\K([AEIOU])\1*/$1x(($q=length$&)>3?$q:3)/e,print"$s$_ "for@F

Cobalah online!

Bahkan menangani test case "aaaabbbbc" sesuai dengan contoh.

Xcali
sumber