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

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
  3× 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)


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.


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.
      • 2×: 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)

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

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!


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.