Annannounccceeerr VOICCEEEE


18

编写一个函数,该函数采用字母和空格字符串(无需处理非字母),并执行ANNOUNCER VOICE转换算法,如下所示:

  • 首先,全部大写。
  • 对于每个字,
    • 通过将每个字母增加三倍来延长每个辅音簇;除非单词辅音簇开头,否则不要拉长该簇。例如,other应该成为OTTTHHHEEERRRmother应该成为MOTTTHHHEEERRR
    • 将最终的元音加倍三倍,使其伸长
  • 在两种伸长情况下,如果您要使一个字母成三倍,请首先将其与两侧的重复字母合并。例如,hill应该成为HIIILLLbookkeeper应该成为BOOKKKEEPPPEEERRR
  • 就此挑战而言,应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
对未来的要求:请避免使用诸如辅音簇合并伸长之类的单词和短语。像我这样的非英语母语人士可能需要词典才能理解您的帖子。
丹尼斯,

应该是“拉长的”元音:(
魔鬼的代言人

什么是辅音簇?
MilkyWay90

Answers:


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≈大)

 将结果进一步传递(用于将字符串和1分开)

'$| |^'⎕R' '[R E放置:
 最后,任何空间,并开始
 →两个空间

 进一步传递结果(用于分离两组字符串)

'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'[R E放置:
 任何数量的相同元音和任意数量的非元音和一个空间
 →元音三次和未改性辅音
 的空间和元音
 →自己
 的空间和一个辅音簇
 →本身
 相同辅音的运行
 →3的那些元音

'[AEIOU][^AEIOU]+ '⎕R{... }[R E放置:
 非元音的运行和空格
 →与命名空间下的匿名函数的结果作为论据:
  ⍵.Match 所发现的文本
  m← 赋值给m
  2≠/ 成对的不同,从
   乘三名
  1, 前面加上一个
  m/⍨ 用它来复制m

 进一步传递结果(用于分隔两个字符串)

' +'⎕R' '[R E放置:
 一个或多个空格
 →用一个空格

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⌶)⍞
扎卡里

^保存两个字节,如果它的工作原理^
扎卡里

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 BYYYTTTEEESS。包含AEIOU3次,但我无法将它们合二为一。

-4个字节归功于HyperNeutrino

不打高尔夫球

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之前排在第一位。
扎卡里

我不知道JS,但你可以替换s=>/[AEIOU]/.test(s)使用/[AEIOU]/.test
musicman523

@ musicman523可悲的是,不,因为它是三元运算符语句中的条件。
大约

仅供参考,您对辅音簇的处理似乎有些不正确;正确的输出应该是WAAAYYY TOOO MAAANNNYYY BYTEEESSS(即不要拉长初始簇BYT)。
Quuxplusone

好吧,排在第一位。
扎卡里

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':标记元音
    • (... ):查看要重复的字符
      • ~∧∨\:第一个元音之后的所有辅音,
      • {⌽<\⌽⍵}:最后一个元音。
      • :将位向量乘以2,
      • 1+:并添加一个。现在所有选定的字符都有3,其余的都有1
    • ⍵/⍨按照给定数量复制每个字符
    • x←s:将其拆分为匹配字符的字符串,并将其存储在中x
    • (3⌈≢¨s⍵):输入单词中每组匹配字符的长度,最大为3。
    • ⌊≢¨:中的最小值和组中的长度x
    • x↑⍨¨:使每个组达到该长度
  • 1↓∊:展平结果并删除第一个字符(在开始时添加以帮助拆分的空格)

你打败了阿达姆...哇。
扎卡里

井井有条!如果您将其改组一下并作为程序编写(使用Adám提示的提示),则可以再剃掉15个字节:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
吉尔

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
扎卡里

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ý谢谢,但是不幸的是它并没有改变字节数。
HyperNeutrino

哦,第一个周围的空格v
扎卡里

0

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

$_=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

在线尝试!

甚至根据该示例处理“ aaaabbbbc”测试用例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.