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,
other
harus menjadiOTTTHHHEEERRR
tetapimother
harus menjadiMOTTTHHHEEERRR
. - Rentangkan vokal terakhir dengan tiga kali lipat.
- Rentangkan setiap gugus konsonan dengan melipattigakan tiga huruf; kecuali, jika kata dimulai dengan gugus konsonan, jangan memanjang gugus itu. Misalnya,
- Dalam kedua kasus perpanjangan , jika Anda melipattigakan tiga surat, pertama satukan dengan surat duplikat di kedua sisi. Misalnya,
hill
harus menjadiHIIILLL
danbookkeeper
harus menjadiBOOKKKEEPPPEEERRR
. - Untuk keperluan tantangan ini,
y
dianggap 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('> '))
Jawaban:
APL (Dyalog) , 175 byte
Cobalah online!
⍞
meminta input karakter1(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 ditemukanm←
menetapkan bahwa untukm
2≠/
memasangkan secara bijak -dari3×
kalikan dengan tiga kali1,
pertamam/⍨
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)sumber
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⌶)⍞
JS (ES6),
138134129 byteWAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS. Berisi
AEIOU
3 kali, tapi saya tidak bisa memasukkannya menjadi satu.-4 byte berkat HyperNeutrino
Tidak disatukan
Saya suka menulis, bukan membaca kode.
sumber
s=>/[AEIOU]/.test(s)
dengan/[AEIOU]/.test
?WAAAYYY TOOO MAAANNNYYY BYTEEESSS
(yaitu jangan memanjang cluster awalBYT
).APL, 90 byte
Penjelasan:
1(819⌶)⍵
: konversikan ke huruf besarw⊂⍨w=⊃w←' ',
: berpisah pada spasi{
...}¨
: untuk setiap kata ...s←{⍵⊂⍨1,2≠/⍵}
:s
adalah 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 telah3
dan sisanya dimiliki1
.⍵/⍨
: mereplikasi setiap karakter dalam⍵
dengan jumlah yang diberikanx←s
: pisahkan menjadi string karakter yang cocok, dan simpan dix
.(3⌈≢¨s⍵)
: panjang setiap grup karakter yang cocok dalam kata input, dengan maksimum 3.⌊≢¨
: minimum dari itu dan panjang grup dix
.x↑⍨¨
: membuat setiap kelompok menjadi panjang itu1↓∊
: ratakan hasilnya dan letakkan karakter pertama (ruang yang ditambahkan di awal untuk membantu pemisahan)sumber
1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Python, 417 byte
Berikut implementasi referensi dalam Python. Tidak terlalu golf.
Tes dengan:
sumber
ss
keS
?Python 3 , 238 byte
Cobalah online!
sumber
v
ke'AEIOU'
?v
.Perl 5 , 139 + 1 (-p) = 140 byte
Cobalah online!
Bahkan menangani test case "aaaabbbbc" sesuai dengan contoh.
sumber