アノヌンヌッシーラーヴォイッシー


18

文字とスペースの文字列(非文字を処理する必要はありません)を受け取り、次のようにANNOUNCER VOICE変換アルゴリズムを実行する関数を作成します。

  • まず、すべてを大文字にします。
  • 単語ごとに、
    • 細長い各文字を三倍にすることにより、各子音クラスタを。ただし、単語子音クラスタで始まる場合は、そのクラスタを長くしないでください。たとえば、にotherなりますOTTTHHHEEERRRが、になるmotherはずMOTTTHHHEEERRRです。
    • 細長いそれを三倍にすることによって、最終母音を。
  • いずれの場合においても伸び、あなたはどちらかの側で重複した文字で、文字、最初の合体、それを三倍にしている場合。たとえば、にhillなりHIIILLL、にbookkeeperなり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

回答:


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

 結果をさらに渡します(文字列と1を分離するのに役立ちます)

'$| |^'⎕R' 'Rの eplace:
 最後、どんな空間、そして初め
 二つの空間→

 結果をさらに渡す(文字列の2つのグループを分離するのに役立つ)

'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'R eplace:
 任意の数の同一の母音と任意の数の非母音とスペース
 →母音3回と未変更の子音
 はスペースと母音
 →それ自体
 はスペースと子音クラスタ
 →それ自体
 は同一の子音の
 連続→それらのうち3つ母音

'[AEIOU][^AEIOU]+ '⎕R{... }Rの eplace:
 非母音の実行と空間
 の名前空間と、次の無名関数の結果→ 引数として:
  ⍵.Match 発見されたテキスト
  m← と割り当てをm
  2≠/ ペアワイズ異なる-からの
   乗算3つのによって
  1, 先頭に追加1
  m/⍨ 使用することを複製するためにm

 結果をさらに渡す(2つの文字列を分離するのに役立つ)

' +'⎕R' 'Rの eplace:
 1つ以上のスペース
 →単一のスペースで

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⌶)⍞
ザカリー

^動作する場合は2バイトを
節約

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 BYYYTTTEEESSS。AEIOU3回含まれていますが、それらを1つに入れることはできません。

HyperNeutrinoのおかげで-4バイト

非ゴルフ

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に先んじて1位です。
ザカリー

私はJSを知りませんが、代わりにs=>/[AEIOU]/.test(s)使用できます/[AEIOU]/.testか?
musicman523

@ musicman523悲しいことに、いや、それは三項演算子ステートメントの条件だからです。
ABOT

参考までに、子音クラスタの処理は少し間違っているようです。適切な出力は次のようになります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↓∊:結果を平坦化し、最初の文字(分割を支援するために最初に追加されたスペース)をドロップします

あなたはアダムを破った...すごい。
ザカリー

とてもきれい!あなたは少しのまわりでそれをシャッフルして(ADAMによって示唆されているように、プロンプトを使用して)プログラムとしてそれを書く場合は、別の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ýありがとう。ただし、残念ながらバイト数は変わりません。
ハイパーニュートリノ

ああ、最初の周りのスペース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」テストケースも処理します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.