ANNNOUNNNCCCEEERRR VOICCCEEE


18

Napisz funkcję, która pobiera ciąg liter i spacji (nie trzeba obsługiwać znaków innych niż litery) i wykonuje następujący algorytm tłumaczenia GŁOS ANNOUNCER:

  • Po pierwsze, wszystko wielkie litery.
  • Dla każdego słowa
    • Wydłuż każdą klaster spółgłoski poprzez potrojenie każdej litery; z wyjątkiem tego, że słowo zaczyna się gromadą spółgłoskową, nie wydłużaj tej gromady. Na przykład otherpowinien stać się, OTTTHHHEEERRRale motherpowinien się stać MOTTTHHHEEERRR.
    • Wydłuż ostatnią samogłoskę trzykrotnie.
  • W obu przypadkach wydłużenia , jeśli potroisz literę, najpierw połącz ją ze zduplikowanymi literami po obu stronach. Na przykład hillpowinien stać się HIIILLLi bookkeeperpowinien się stać BOOKKKEEPPPEEERRR.
  • Na potrzeby tego wyzwania yliczy się jako spółgłoska.
  • Wyjaśnienie / uproszczenie: Możesz założyć, że każda para słów jest oddzielona pojedynczą spacją i że dane wejściowe nie zawierają kolejnych spacji oraz że dane wejściowe nie będą ciągiem pustym.
  • Najkrótszy kod wygrywa!

Wektory testowe:

> 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

Oto implementacja referencyjna, na którą chciałbym przejść do odpowiedzi, z tym wyjątkiem, że od rana pytanie zostało zamknięte. : 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
Prośba o przyszłość: unikaj słów i wyrażeń, takich jak skupisko spółgłoski , łączenie i wydłużanie . Nieanglojęzyczny użytkownik języka angielskiego, taki jak ja, może potrzebować słownika, aby zrozumieć Twój post.
Dennis

Powinny być samogłoski, które są „wydłużone” :(
Adwokat diabła,

Co to jest klaster spółgłoskowy?
MilkyWay90,

Odpowiedzi:


6

APL (Dyalog) , 175 bajtów

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

Wypróbuj online!

 monit o wprowadzenie znaku

1(819⌶) konwertuj na wielkie litery (819 ≈ duże)

 przekazać wynik dalej (służy do oddzielenia ciągów i 1)

'$| |^'⎕R' 'R EUmieãæ:
 koniec, każda przestrzeń, a początek
 → dwoma pomieszczeniami

 przekazać wynik dalej (służy do oddzielenia dwóch grup ciągów)

'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'R EUmieãæ:
 dowolna liczba identycznych samogłosek i wielu innych niż samogłosek i przestrzenią
 → trzykroć samogłosek i niemodyfikowanych spółgłosek
 przestrzeń i samogłoska
 → siebie
 przestrzenią i spółgłosek
 → siebie
 bieg identycznych spółgłosek
 → trzy z tych samogłoski

'[AEIOU][^AEIOU]+ '⎕R{... }R EUmieãæ:
 run of non-samogłosek i przestrzeń
 → wyniku następującej anonimowej funkcji z przestrzeni nazw jako argumentu:
  ⍵.Match tekstu, który został znaleziony
  m← przypisać do m
  2≠/ parami różne-od
   pomnożyć przez trzy
  1, poprzedzić jednym
  m/⍨ wykorzystanie do replikacjim

 przekazać wynik dalej (służy do oddzielenia dwóch ciągów)

' +'⎕R' 'R EUmieãæ:
 jeden lub więcej obszarów
 → z jednym miejscem

1↓ upuść pierwszą literę (spację)


czy to działa? 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ý

^ Zapisuje dwa bajty, jeśli działa ^
Zacharý

5

JS (ES6), 138 134 129 bajtów

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. Zawiera AEIOU3 razy, ale nie mogę ich w golfa.

-4 bajty dzięki HyperNeutrino

Bez golfa

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

Lubię pisać, nie czytać kodu.


1
„WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSSS” ... jest na pierwszym miejscu, przed APL.
Zacharý

Nie wiem, JS, ale można zastąpić s=>/[AEIOU]/.test(s)z /[AEIOU]/.test?
musicman523,

@ musicman523 niestety nie, ponieważ jest to warunek w trójskładnikowej instrukcji operatora.
ABot

Do Twojej wiadomości, obsługa klastrów spółgłoskowych wydaje się nieco niepoprawna; właściwym wyjściem byłoby WAAAYYY TOOO MAAANNNYYY BYTEEESSS(tj. nie wydłużać początkowego skupienia BYT).
Quuxplusone

Cóż, był na pierwszym miejscu.
Zacharý

5

APL, 90 bajtów

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

Wyjaśnienie:

  • 1(819⌶)⍵: konwertuj na wielkie litery
  • w⊂⍨w=⊃w←' ',: podział na spacje
  • {... : dla każdego słowa ...
    • s←{⍵⊂⍨1,2≠/⍵}: sto funkcja, która dzieli ciąg na grupy przylegających do siebie pasujących znaków
    • ⍵∊'AEIOU': zaznacz samogłoski
    • (... ): zobacz, które znaki trzykrotnie
      • ~∧∨\: wszystkie spółgłosek za pierwszą samogłoską,
      • {⌽<\⌽⍵}: ostatnia samogłoska.
      • : pomnożyć wektor bitowy przez dwa,
      • 1+: i dodaj jeden. Teraz wszystkie wybrane postacie mają, 3a reszta ma 1.
    • ⍵/⍨: powtórz każdy znak o podaną kwotę
    • x←s: podziel go na ciągi pasujących znaków i zapisz w x.
    • (3⌈≢¨s⍵): długość każdej grupy pasujących znaków w słowie wejściowym, maksymalnie 3.
    • ⌊≢¨: minimum tego i długości grup w x.
    • x↑⍨¨: ustaw każdą grupę na taką długość
  • 1↓∊: spłaszcz wynik i upuść pierwszą postać (spację dodaną na początku, aby pomóc w dzieleniu)

Pokonałeś Adama ... wow.
Zacharý

bardzo schludny! Jeśli przetasujesz go trochę i napiszesz jako program (za pomocą monitu sugerowanego przez Adama), możesz zgolić kolejne 15 bajtów:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Gil

3

Python, 417 bajtów

Oto implementacja referencyjna w Pythonie. Nie strasznie golfa.

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

Testuj z:

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

Czy nie powinieneś choć trochę pograć w golfa, usuwając niepotrzebne miejsca i przechodząc ssna S?
Zacharý

2

Python 3 , 238 bajtów

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())))

Wypróbuj online!


Czy możesz zapisać bajty, ustawiając vna 'AEIOU'?
Zacharý

@ Zacharý Dzięki, ale niestety to nie zmienia liczby bajtów.
HyperNeutrino,

Och, przestrzenie wokół pierwszego v.
Zacharý

0

Perl 5 , 139 + 1 (-p) = 140 bajtów

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

Wypróbuj online!

Nawet obsługuje przypadek testowy „aaaabbbbc” zgodnie z przykładem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.