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
other
sollte werden , sollteOTTTHHHEEERRR
abermother
werdenMOTTTHHHEEERRR
. - Verlängern Sie den letzten Vokal, indem Sie ihn verdreifachen.
- 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
- In beiden Fällen der Dehnung , wenn Sie Verdreifachung einen Brief, erste coalesce es mit doppelten Buchstaben auf beiden Seiten. Zum Beispiel
hill
sollHIIILLL
undbookkeeper
soll werdenBOOKKKEEPPPEEERRR
. - Für die Zwecke dieser Herausforderung gilt
y
als 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('> '))
Antworten:
APL (Dyalog) , 175 Bytes
Probieren Sie es online!
⍞
Eingabeaufforderung für Zeichen1(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: einebeliebige 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 wurdem←
assign dassm
2≠/
paarweise unterschiedlich aus3×
mehrfach durch drei1,
prepend einerm/⍨
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 lassenquelle
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 BytesWAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS. Enthält
AEIOU
3 Mal, aber ich kann diese nicht in einem Golf spielen.-4 Bytes dank HyperNeutrino
Ungolfed
Ich schreibe gerne, lese keinen Code.
quelle
s=>/[AEIOU]/.test(s)
mit/[AEIOU]/.test
?WAAAYYY TOOO MAAANNNYYY BYTEEESSS
(dh verlängern Sie den anfänglichen Cluster nichtBYT
).APL, 90 Bytes
Erläuterung:
1(819⌶)⍵
: In Großbuchstaben konvertierenw⊂⍨w=⊃w←' ',
: auf Leerzeichen aufgeteilt{
...}¨
: für jedes Wort ...s←{⍵⊂⍨1,2≠/⍵}
:s
ist 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.2×
: Multipliziere den Bitvektor mit zwei,1+
: und füge eins hinzu. Jetzt haben alle ausgewählten Charaktere3
und der Rest hat1
.⍵/⍨
: Repliziere jedes Zeichen⍵
mit der angegebenen Anzahlx←s
: Teilen Sie es in Zeichenfolgen mit übereinstimmenden Zeichen auf und speichern Sie diese inx
.(3⌈≢¨s⍵)
: Die Länge jeder Gruppe übereinstimmender Zeichen im Eingabewort mit maximal 3.⌊≢¨
: das Minimum davon und die Länge der Gruppen inx
.x↑⍨¨
: Jede Gruppe soll so lang sein1↓∊
: Reduziere das Ergebnis und lösche das erste Zeichen (das Leerzeichen, das am Anfang hinzugefügt wurde, um das Teilen zu erleichtern)quelle
1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Python, 417 Bytes
Hier ist eine Referenzimplementierung in Python. Nicht schrecklich golfen.
Testen Sie mit:
quelle
ss
umS
?Python 3 , 238 Bytes
Probieren Sie es online!
quelle
v
zu'AEIOU'
?v
.Perl 5 , 139 + 1 (-p) = 140 Bytes
Probieren Sie es online!
Behandelt sogar den Testfall "aaaabbbbc" gemäß Beispiel.
quelle