Напишите функцию, которая принимает строку букв и пробелов (не нужно обрабатывать не-буквы) и выполняет алгоритм перевода 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
Вот эталонная реализация, на которую я бы перешел к ответу, за исключением того, что с сегодняшнего утра вопрос закрыт. :П
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('> '))
Ответы:
APL (Dyalog) , 175 байт
Попробуйте онлайн!
⍞
запрос на ввод символов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≠/
парное отличие от3×
умножения на три, а затем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⌶)⍞
JS (ES6),
138134129 байтWAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS. Содержит
AEIOU
3 раза, но я не могу играть в гольф в одном.-4 байта благодаря HyperNeutrino
Ungolfed
Я люблю писать, а не читать код.
источник
s=>/[AEIOU]/.test(s)
на/[AEIOU]/.test
?WAAAYYY TOOO MAAANNNYYY BYTEEESSS
(т.е. не удлинять начальный кластерBYT
).APL, 90 байт
Объяснение:
1(819⌶)⍵
: преобразовать в верхний регистрw⊂⍨w=⊃w←' ',
: разделить на пробелы{
...}¨
: за каждое слово ...s←{⍵⊂⍨1,2≠/⍵}
:s
это функция, которая разбивает строку на группы смежных совпадающих символов⍵∊'AEIOU'
: отметить гласные(
...)
: посмотреть, какие символы нужно дублировать~∧∨\
: все согласные после первого гласного,{⌽<\⌽⍵}
: последний гласный2×
: умножить битовый вектор на два,1+
: и добавить один. Теперь все выбранные персонажи имеют,3
а остальные имеют1
.⍵/⍨
: повторить каждый символ⍵
на заданную суммуx←s
: разбить его на строки совпадающих символов и сохранить вx
.(3⌈≢¨s⍵)
: длина каждой группы совпадающих символов во входном слове, максимум 3.⌊≢¨
: минимум этого и длина групп вx
.x↑⍨¨
: сделать каждую группу такой длины1↓∊
: сгладить результат и удалить первый символ (пробел, который был добавлен в начале, чтобы помочь с разбиением)источник
1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Python, 417 байт
Вот эталонная реализация в Python. Не ужасно гольф.
Тест с:
источник
ss
наS
?Python 3 , 238 байт
Попробуйте онлайн!
источник
v
в'AEIOU'
?v
.Perl 5 , 139 + 1 (-p) = 140 байт
Попробуйте онлайн!
Четный обрабатывает контрольный пример "aaaabbbbc" в соответствии с примером.
источник