ANNNOUNNNCCCEEERRR VOICCCEEE


18

Viết hàm lấy một chuỗi các chữ cái và dấu cách (không cần xử lý các chữ cái không) và thực hiện thuật toán dịch ANNOUNCER VOICE như sau:

  • Đầu tiên, viết hoa mọi thứ.
  • Đối với mỗi từ,
    • Kéo dài từng cụm phụ âm bằng cách nhân ba chữ cái; ngoại trừ, nếu từ bắt đầu bằng cụm phụ âm, không kéo dài cụm đó. Ví dụ, othernên trở thành OTTTHHHEEERRRnhưng mothernên trở thành MOTTTHHHEEERRR.
    • Kéo dài nguyên âm cuối cùng bằng cách tăng gấp ba lần.
  • Trong cả hai trường hợp kéo dài , nếu bạn tăng gấp ba chữ cái, trước tiên hãy kết hợp nó với các chữ cái trùng lặp ở hai bên. Ví dụ, hillnên trở thành HIIILLLbookkeepernên trở thành BOOKKKEEPPPEEERRR.
  • Đối với mục đích của thử thách này, yđược tính là một phụ âm.
  • Làm rõ / đơn giản hóa: Bạn có thể giả sử rằng mỗi cặp từ được phân tách bằng một khoảng trắng và đầu vào không chứa khoảng trắng liên tiếp và đầu vào sẽ không phải là chuỗi trống.
  • Mã ngắn nhất sẽ thắng!

Các vectơ kiểm tra:

> 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

Đây là một triển khai tham chiếu mà tôi sẽ chuyển đến một câu trả lời ngoại trừ vào sáng nay câu hỏi đã được đóng lại. : 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
Một yêu cầu cho tương lai: vui lòng tránh các từ và cụm từ như cụm phụ âm , hợp âmkéo dài . Một người nói tiếng Anh không phải là người bản xứ như tôi có thể cần một từ điển để hiểu bài viết của bạn.
Dennis

Nó phải là các nguyên âm được "kéo dài" :(
Người ủng hộ của quỷ

Cụm phụ âm là gì?
MilkyWay90

Câu trả lời:


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

Hãy thử trực tuyến!

 nhắc nhở nhập ký tự

1(819⌶) chuyển đổi thành chữ hoa (819 Lớn)

 vượt qua kết quả hơn nữa (phục vụ để tách các chuỗi và 1)

'$| |^'⎕R' 'R eplace:
 kết thúc, bất kỳ
 khoảng trắng và bắt đầu → hai khoảng trắng

 vượt qua kết quả hơn nữa (phục vụ để tách hai nhóm chuỗi)

'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'R eplace:
 bất kỳ số nguyên âm giống hệt nhau và bất kỳ số lượng phi nguyên âm và một không gian
 → những ba lần nguyên âm và phụ âm chưa sửa đổi
 một không gian và một nguyên âm
 → mình
 một không gian và một cụm phụ âm
 → mình
 một hoạt động của phụ âm giống hệt
 → ba của những nguyên âm

'[AEIOU][^AEIOU]+ '⎕R{... }R eplace:
 một hoạt động của phi nguyên âm và một không gian
 → kết quả của hàm ẩn danh sau đây với không gian tên như là đối số:
  ⍵.Match văn bản mà đã được tìm thấy
  m← assign đó để m
  2≠/ khác nhau-từ cặp-khôn ngoan
   nhân với ba
  1, thêm vào trước một
  m/⍨ sử dụng mà để lặpm

 vượt qua kết quả hơn nữa (phục vụ để tách hai chuỗi)

' +'⎕R' 'R eplace:
 một hoặc nhiều khoảng trắng
 → với một khoảng trắng

1↓ thả chữ cái đầu (dấu cách)


Nó có hoạt động không? 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ý

^ Lưu hai byte nếu nó hoạt động ^
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 TUYỆT VỜI MAAANNNYYY BYYYTTTEEESSS. Chứa AEIOU3 lần, nhưng tôi không thể đánh chúng thành một.

-4 byte nhờ HyperNeutrino

Ung dung

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

Tôi thích viết, không đọc mã.


1
"WAAAYYY TUYỆT VỜI MAAANNNYYY BYYYTTTEEESSSS" ... ở vị trí đầu tiên, trước APL.
Zacharý

Tôi không biết JS, nhưng bạn có thể thay thế s=>/[AEIOU]/.test(s)bằng /[AEIOU]/.test?
sĩ523

@ musicman523 thật đáng buồn, không, bởi vì đó là điều kiện trong một tuyên bố toán tử ternary.
ABot

FYI, việc xử lý các cụm phụ âm của bạn có vẻ hơi không chính xác; đầu ra thích hợp sẽ là WAAAYYY TOOO MAAANNNYYY BYTEEESSS(nghĩa là không kéo dài cụm ban đầu BYT).
Quuxplusone

Vâng, đã ở vị trí đầu tiên.
Zacharý

5

APL, 90 byte

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

Giải trình:

  • 1(819⌶)⍵: chuyển thành chữ hoa
  • w⊂⍨w=⊃w←' ',: chia nhỏ
  • {... : cho mỗi từ ...
    • s←{⍵⊂⍨1,2≠/⍵}: slà một hàm phân tách một chuỗi thành các nhóm ký tự khớp nhau
    • ⍵∊'AEIOU': đánh dấu các nguyên âm
    • (... ): xem nhân vật nào ba lần
      • ~∧∨\: tất cả các phụ âm qua nguyên âm đầu tiên,
      • {⌽<\⌽⍵}: nguyên âm cuối cùng.
      • : nhân vectơ bit với hai,
      • 1+: và thêm một. Bây giờ tất cả các nhân vật được chọn có 3và phần còn lại có 1.
    • ⍵/⍨: sao chép từng ký tự theo số lượng đã cho
    • x←s: chia nó thành các chuỗi ký tự trùng khớp và lưu nó vào x.
    • (3⌈≢¨s⍵): độ dài của mỗi nhóm ký tự trùng khớp trong từ đầu vào, tối đa là 3.
    • ⌊≢¨: mức tối thiểu của điều đó và độ dài của các nhóm trong x.
    • x↑⍨¨: làm cho mỗi nhóm có độ dài đó
  • 1↓∊: làm phẳng kết quả và thả ký tự đầu tiên (khoảng trắng được thêm vào lúc đầu để giúp tách)

Bạn đánh bại Adám ... wow.
Zacharý

rât gọn gang! Nếu bạn xáo trộn xung quanh một chút và viết nó thành một chương trình (sử dụng lời nhắc theo đề xuất của Adám), bạn có thể tắt 15 byte khác:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Gil

3

Python, 417 byte

Đây là một triển khai tham chiếu trong Python. Không chơi golf khủng khiế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

Kiểm tra với:

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

Bạn có nên ít nhất chơi golf xuống một chút bằng cách loại bỏ các không gian không cần thiết và thay đổi ssthành 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())))

Hãy thử trực tuyến!


Bạn có thể lưu byte bằng cách đặt vthành 'AEIOU'?
Zacharý

@ Zacharý Cảm ơn, nhưng thật không may, nó không thay đổi bytecount.
HyperNeutrino

Oh, không gian xung quanh đầu tiên 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

Hãy thử trực tuyến!

Thậm chí xử lý trường hợp thử nghiệm "aaaabbbbc" theo ví dụ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.