Ich mag keine Saiten mit mehr als drei Vokalen hintereinander. Können Sie ein Programm schreiben, das alle Vokale entfernt, die ich nicht aus Worten entfernen möchte?
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Die Eingabe ist eine Zeichenfolge, die nur druckbare ASCII-Zeichen enthält (einschließlich 0x20 bis 0x7E).
Die Ausgabe ist eine Zeichenfolge, die nur Reihen von höchstens 3 aufeinanderfolgenden Vokalen enthält. Wenn die Eingabezeichenfolge mehr als 3 aufeinanderfolgende Vokale enthält, sollte Ihr Programm eine Ausgabezeichenfolge erstellen, die die ersten drei Vokale enthält, die bei dieser Ausführung auftreten, und alle weiteren aufeinanderfolgenden Vokale verwerfen.
Y ist kein Vokal im Sinne dieser Herausforderung.
Das ist Code Golf, also gewinnt der kürzeste Code (in Bytes).
Testfälle
"Aeiou" => "Aei"
"screeeen" => "screeen"
"We're queueing up for the Hawaiian movie." => "We're queung up for the Hawaiin movie."
"Spaces break runs: aei iou." => "Spaces break runs: aei iou."
aaYYAAaaaAERGH
.Antworten:
Pyth, 21 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
Ich durchlaufe alle Zeichen und halte fest, wie viele Vokale ich mithilfe eines Zählers übergeben habe. Jedes Mal, wenn ich ein Zeichen übergebe, das kein Vokal ist, setze ich den Zähler auf 0 zurück. Ich entferne Zeichen, wenn der Zähler> 4 ist.
quelle
Nicht lesbar , 1647 Bytes
Erläuterung
Dieses Programm entspricht dem folgenden Pseudocode:
mit folgenden variablen Zuordnungen:
Wie Sie sehen, habe ich den variablen Steckplatz 0 vermieden, da
0
es sich um eine so lange zu schreibende Konstante handelt.Also lesen wir jedes Zeichen und speichern den Wert in
cp
undch
. Wir werden Änderungen vornehmen, diesecp
aber beibehalten,ch
damit wir sie bei Bedarf ausdrucken können. Wir subtrahieren nacheinander die Zahlen 65, 4, 4, 6 usw.cp
, um zu überprüfen, ob es sich um jedes der 10 möglichen Vokalzeichen in ASCII handelt (beachten Sie, dass das allerletzte keine Zuweisung sein muss).vs
Enthält immer 3 weniger als die Anzahl der Vokale, die noch gedruckt werden dürfen. Es fängt bei an0
, also können 3 Vokale gedruckt werden. Wenn es erreicht ist-3
, hören wir auf, Vokale zu drucken.Wenn wir auf einen Nicht-Vokal (einschließlich des Leerzeichens) stoßen , führen wir
print(ch)
gefolgt von ausvs = 0
. Wie Sie wahrscheinlich erraten haben, wird der Vokalzähler dadurch zurückgesetzt.Wenn wir auf einen Vokal stoßen , führen wir aus
((--vs)+4) ? print(ch) : (++vs)
. Lassen Sie uns das aufschlüsseln:vs
;-4
, sind wir zu weit gegangen, drucken Sie also nichts aus, sondern erhöhen Sie ihnvs
auf,-3
damit wir das Drucken von Vokalen weiterhin ablehnen.quelle
Retina , 25 Bytes
Probieren Sie es online aus.
Ziemlich unkomplizierte Regex-Substitution. Dies funktioniert auch für die gleiche Byteanzahl:
quelle
JavaScript (ES6), 42
Als anonyme Funktion
quelle
Perl, 27 Zeichen
(26 Zeichen Code + 1 Zeichen Befehlszeilenoption)
Keine große Sache, nur eine seltene Gelegenheit, an die ich mich erinnere
\K
.Probelauf:
quelle
\K
". :)s/([aeiou]{1,3})(?1)+/$1/gi
.Im Ernst, 34 Bytes
Hex Dump:
Probieren Sie es online aus
Es wird derselbe Algorithmus wie für die Pyth-Antwort verwendet. Dabei wird die Länge der aktuellen Vokallaufzeit in einem Register aufgezeichnet, die Länge jedes Mal erhöht, wenn das aktuelle Zeichen ein Vokal ist, und geprüft, ob die zulässige Länge überschritten wurde. Wenn dies der Fall ist, wird 0 zurückgegeben und die ursprüngliche Zeichenfolge mit diesem generierten Filter gefiltert. Es wird viel kürzer sein, wenn wir die Mengen-Subtraktion für Strings verwenden können. (Das
Ok
kann gelöscht werden und dasOkd
kann mit nur ersetzt werden@
). Ich habe gehört, dass diese Funktion im nächsten Update verfügbar ist.quelle
C 166 Bytes
bei weitem nicht die kürzeste Antwort, aber ich denke, schön golfen ..
Testfall:
quelle
Mathematica, 68 Bytes
Die Regex-Antwort wäre gleich lang, aber wer verwendet Regex?
quelle
Java, 115 Bytes
Erwartet die Eingabe als Programmparameter.
Unit-Test-Ausgang:
quelle
String[]
und entfernena
.String[]a
print
anstatt verwendenprintln
. Ich glaube nicht, dass die Spezifikation einen nachgestellten Zeilenumbruch erfordert.APL, 40 Zeichen
Auf Englisch:
'aeiouAEIOU'∊⍨' ',⍵
: finde die Vokale (und stelle ein Leerzeichen voran, um bei der Drehung zu brechen);(1-⍳4)⌽¨⊂
: 0, 1, 2, 3-mal drehen (mit Umlauf) und dabei den booleschen Vektor nach rechts drücken;⊃+/ sum
: die Drehungen und Unbox1↓4≠
: Finde den Unterschied zu 4 und entferne den ersten (um den Platz zu ersetzen, den wir vorangestellt haben)⍵/⍨
: Behalten Sie in dem Argument nur das Element bei, bei dem sich die Summe von 4 unterschied.quelle
Perl 6 ,
3635 BytesVerwendung:
quelle
C (205 Bytes)
(Ein Zeilenumbruch zur Verdeutlichung hinzugefügt)
quelle
Scala, 107 Bytes
quelle
Javascript ES6, 43 Zeichen
Prüfung:
quelle
x86 MS-DOS .COM-Datei ,
44 Byte,36 Byte.COM-Dateien werden von MS-DOS 1 bis heute weitgehend unterstützt. Ich verwende Dosemu nur mit 8086-Befehlen.
Reduziert von 44 auf 36 Byte durch Verwendung von REPNE SCASB zum Testen auf Vokale, anstatt einen separaten Befehl zum Testen jedes Vokals zu verwenden.
quelle
Matlab / Octave, 54 Bytes
Beispiel:
Probiere es bei ideone aus .
quelle
V , 21 Bytes (nicht konkurrierend)
Probieren Sie es online!
Erläuterung:
Dies ist kaum kürzer als die einfachere Lösung:
(22 Bytes)
quelle
Ruby, 44 Bytes
Beispiel:
quelle
$<.read
, um die mehrzeilige Eingabe (also das Zeichen 0x0a außerhalb des Bereichs) zu verarbeitengets
?