ANNNOUNNNCCCEEERRR VOICCCEEE


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 ≈ Великі)

 передайте результат далі (служить для розділення рядків і 1)

'$| |^'⎕R' 'R eplace:
 кінець, будь-який простір і початок
 → два пробіли

 передавати результат далі (служить для розділення двох груп рядків)

'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'R eplace:
 будь-яку кількість однакових голосних і будь-число не-голосних і простір
 → гласною тричі і немодифіковані приголосні
 простір і гласний
 → собі
 простір і згодної кластера
 → собою
 біг однакових приголосних
 → три з них голосні

'[AEIOU][^AEIOU]+ '⎕R{... }R eplace:
 пробіг не-голосні і простір
 → результат наступної анонімної функції з простором імен в якості аргументу:
  ⍵.Match текст , який був знайдений
  m← Присвоїти що m
  2≠/ попарний різним : від
   помножити на три
  1, препендом одного
  m/⍨ використання, для реплікаціїm

 передайте результат далі (служить для розділення двох рядків)

' +'⎕R' 'R eplace:
 один або кілька пробілів
 → з одним пробілом

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

^ Збереже два байти, якщо це працює ^
Zacharý

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 BYYYTTREEESSS. Міститься 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.
Zacharý

Я не знаю , JS, але ви можете замінити s=>/[AEIOU]/.test(s)з/[AEIOU]/.test ?
musicman523

@ musicman523, на жаль, ні, тому що це умовна заява про потрійний оператор.
О

FYI, поводження з приголосними кластерами здається дещо неправильним; правильний вихід буде WAAAYYY TOOO MAAANNNYYY BYTEEESSS(тобто не подовжувати початковий кластер)BYT ).
Квомплусон

Ну, був на першому місці.
Zacharý

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': позначте голосні
    • (... ): подивіться, які символи слід у трьох разів
      • ~∧∨\: всі приголосні, що минули першу голосну,
      • {⌽<\⌽⍵}: остання голосна.
      • : помножте бітовий вектор на два,
      • 1+: і додайте один. Тепер усі вибрані символи є3 а решта мають 1.
    • ⍵/⍨: повторити кожен символ у заданій кількості
    • x←s: розділіть його на рядки відповідних символів і збережіть це в x.
    • (3⌈≢¨s⍵): довжина кожної групи відповідних символів у введеному слові, максимум 3.
    • ⌊≢¨: мінімум цього і довжина груп у x.
    • x↑⍨¨: зробити кожну групу такою довжиною
  • 1↓∊: вирівняти результат і залишити перший символ (пробіл, який було додано на початку, щоб допомогти з розщепленням)

Ти побив Адама ... ух.
Zacharý

дуже акуратно! Якщо ви перетасувати його навколо трохи , і записати його у вигляді програми (використовуючи підказки як це було запропоновано адам) , ви можете збрити ще 15 байт:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Gil

3

Пітон, 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?
Zacharý

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ý

@ Zacharý Спасибі, але, на жаль, це не змінює рахунок.
HyperNeutrino

О, пробіли навколо першого v.
Zacharý

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" відповідно до прикладу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.