ANNNOUNNNCCCEEERRR VOICCCEEE

18

Schreiben Sie eine Funktion, die eine Folge von Buchstaben und Leerzeichen benötigt (es ist nicht erforderlich, mit Nicht-Buchstaben umzugehen) und den Übersetzungsalgorithmus ANNOUNCER VOICE wie folgt ausführt:

  • Zuerst alles in Großbuchstaben.
  • Für jedes Wort
    • Verlängern Sie jeden Konsonantencluster, indem Sie jeden Buchstaben verdreifachen. Wenn das Wort jedoch mit einem Konsonantencluster beginnt , verlängern Sie diesen Cluster nicht. Zum Beispiel othersollte werden , sollte OTTTHHHEEERRRaber motherwerden MOTTTHHHEEERRR.
    • Verlängern Sie den letzten Vokal, indem Sie ihn verdreifachen.
  • In beiden Fällen der Dehnung , wenn Sie Verdreifachung einen Brief, erste coalesce es mit doppelten Buchstaben auf beiden Seiten. Zum Beispiel hillsoll HIIILLLund bookkeepersoll werden BOOKKKEEPPPEEERRR.
  • Für die Zwecke dieser Herausforderung gilt yals Konsonant.
  • Erläuterung / Vereinfachung: Sie können davon ausgehen, dass jedes Wortpaar durch ein einzelnes Leerzeichen getrennt ist und dass die Eingabe keine aufeinander folgenden Leerzeichen enthält und dass es sich bei der Eingabe nicht um eine leere Zeichenfolge handelt.
  • Kürzester Code gewinnt!

Testvektoren:

> 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

Hier ist eine Referenzimplementierung, auf die ich eine Antwort geben möchte, mit der Ausnahme, dass die Frage seit heute Morgen geschlossen ist. : 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('> '))
Quuxplusone
quelle
2
Eine Bitte für die Zukunft: Vermeiden Sie Wörter und Phrasen wie Konsonantencluster , Koaleszenz und Dehnung . Ein nicht-englischer Muttersprachler wie ich benötigt möglicherweise ein Wörterbuch, um Ihren Beitrag zu verstehen.
Dennis
Es sollten die Vokale sein, die "länglich" sind :(
Devil's Advocate
Was ist Konsonantencluster?
MilkyWay90

Antworten:

6

APL (Dyalog) , 175 Bytes

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

Probieren Sie es online!

 Eingabeaufforderung für Zeichen

1(819⌶) in Großbuchstaben konvertieren (819 ≈ groß)

 das Ergebnis weitergeben (dient zur Trennung der Zeichenketten und der 1)

'$| |^'⎕R' 'R eplace:
 das Ende, jeder Raum, und der Anfang
 → zwei Räume

 übergebe das Ergebnis weiter (dient dazu, zwei Gruppen von Strings zu trennen)

'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'R ePlace: eine
 beliebige Anzahl von identischen Vokale und eine beliebige Anzahl von nicht-Vokale und ein Raum
 → dem Vokal dreimal und die unmodifizierten Konsonanten
 ein Raum und ein Vokal
 → sich
 ein Raum und ein Konsonant cluster
 → sich
 ein Lauf von identischen Konsonanten
 → drei derjenigen Vokale

'[AEIOU][^AEIOU]+ '⎕R{... }R eplace:
 ein Lauf von nicht-Vokale und ein Raum
 → das Ergebnis der folgenden anonymen Funktion mit dem Namespace als Argument:
  ⍵.Match der Text, der gefunden wurde
  m← assign dass m
  2≠/ paarweise unterschiedlich aus
   mehrfach durch drei
  1, prepend einer
  m/⍨ Anwendung , das zu replizierenm

 übergebe das Ergebnis weiter (dient dazu, zwei Zeichenketten zu trennen)

' +'⎕R' 'R eplace:
 ein oder mehr Leerzeichen
 → mit einem Leerzeichen

1↓ den Anfangsbuchstaben (ein Leerzeichen) fallen lassen

Adam
quelle
Funktioniert das? 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ý
^ Speichert zwei Bytes, wenn es funktioniert ^
Zacharý
5

JS (ES6), 138 134 129 Bytes

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. Enthält AEIOU3 Mal, aber ich kann diese nicht in einem Golf spielen.

-4 Bytes dank HyperNeutrino

Ungolfed

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

Ich schreibe gerne, lese keinen Code.

ABot
quelle
1
"WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSSS" ... liegt vor APL an erster Stelle.
Zacharý
Ich weiß nicht , JS, aber können Sie ersetzen s=>/[AEIOU]/.test(s)mit /[AEIOU]/.test?
musicman523
@ musicman523 leider nein, denn es ist die Bedingung in einer ternären Operator-Anweisung.
ABot
Zu Ihrer Information, Ihr Umgang mit Konsonanten-Clustern scheint ein wenig falsch zu sein. Die richtige Ausgabe wäre WAAAYYY TOOO MAAANNNYYY BYTEEESSS(dh verlängern Sie den anfänglichen Cluster nicht BYT).
Quuxplusone
Nun, war an erster Stelle.
Zacharý
5

APL, 90 Bytes

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

Erläuterung:

  • 1(819⌶)⍵: In Großbuchstaben konvertieren
  • w⊂⍨w=⊃w←' ',: auf Leerzeichen aufgeteilt
  • {... : für jedes Wort ...
    • s←{⍵⊂⍨1,2≠/⍵}: sist eine Funktion, die eine Zeichenfolge in Gruppen zusammenhängender übereinstimmender Zeichen aufteilt
    • ⍵∊'AEIOU': Markiere die Vokale
    • (... ): sehen Sie, welche Zeichen zu verdreifachen sind
      • ~∧∨\: alle Konsonanten nach dem ersten Vokal,
      • {⌽<\⌽⍵}: der letzte Vokal.
      • : Multipliziere den Bitvektor mit zwei,
      • 1+: und füge eins hinzu. Jetzt haben alle ausgewählten Charaktere 3und der Rest hat 1.
    • ⍵/⍨: Repliziere jedes Zeichen mit der angegebenen Anzahl
    • x←s: Teilen Sie es in Zeichenfolgen mit übereinstimmenden Zeichen auf und speichern Sie diese in x.
    • (3⌈≢¨s⍵): Die Länge jeder Gruppe übereinstimmender Zeichen im Eingabewort mit maximal 3.
    • ⌊≢¨: das Minimum davon und die Länge der Gruppen in x.
    • x↑⍨¨: Jede Gruppe soll so lang sein
  • 1↓∊: Reduziere das Ergebnis und lösche das erste Zeichen (das Leerzeichen, das am Anfang hinzugefügt wurde, um das Teilen zu erleichtern)
Marinus
quelle
Du hast Adám besiegt ... wow.
Zacharý
sehr gepflegt! Wenn Sie es ein wenig mischen und es als Programm schreiben (unter Verwendung der von Adám vorgeschlagenen Eingabeaufforderung), können Sie weitere 15 Bytes abschneiden:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Gil
3

Python, 417 Bytes

Hier ist eine Referenzimplementierung in Python. Nicht schrecklich golfen.

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

Testen Sie mit:

while True:
 print a(raw_input('> '))
Quuxplusone
quelle
Sollten Sie nicht mindestens Golf es weiter nach unten ein wenig durch unnötigen Leerzeichen zu entfernen und zu ändern , ssum S?
Zacharý
2

Python 3 , 238 Bytes

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

Probieren Sie es online!

HyperNeutrino
quelle
Können Sie Bytes speichern , indem Sie vzu 'AEIOU'?
Zacharý
@ Zacharý Danke, aber das ändert leider nichts am bytecount.
HyperNeutrino
Oh, die Räume um den ersten v.
Zacharý
0

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

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

Probieren Sie es online!

Behandelt sogar den Testfall "aaaabbbbc" gemäß Beispiel.

Xcali
quelle