Aufgabenbeschreibung
Manchmal müssen Sie wirklich etwas anbringen, das Sie auf kleinem Raum schreiben. Es mag verlockend sein, die Vokale fallen zu lassen und diese zu schreiben - und wenn das nicht gelingt, wer braucht dann wirklich Leerzeichen? Thssprfctlrdbl! †
Schreibe eine Funktion oder Programm , das entfernt Kleinbuchstaben Vokale aeiou
und dann Leerzeichen und dann alle Zeichen aus einem Eingabezeichenfolge . Außerdem muss jedes Mal, wenn Sie einen Charakter entfernen, dieser Charakter der am weitesten rechts stehende Charakter sein, der zum Entfernen berechtigt ist. Dieser Vorgang muss wiederholt werden, bis die Zeichenfolge nicht länger als eine bestimmte Eingabelänge ist .
† „Das ist perfekt lesbar!“ Aber wenn Sie diese Fußnote lesen, ist es wahrscheinlich nicht wirklich ... :)
Beispiele
Hier sehen Sie diesen Vorgang für sukzessive kleinere Eingabegrößen:
23: Hello, Code Golf World!
22: Hello, Code Golf Wrld!
21: Hello, Code Glf Wrld!
20: Hello, Cod Glf Wrld!
19: Hello, Cd Glf Wrld!
18: Hell, Cd Glf Wrld!
17: Hll, Cd Glf Wrld!
16: Hll, Cd GlfWrld!
15: Hll, CdGlfWrld!
14: Hll,CdGlfWrld!
13: Hll,CdGlfWrld
12: Hll,CdGlfWrl
11: Hll,CdGlfWr
(etc.)
Nachdem wir die Zeichenfolge auf 17 Zeichen reduziert haben, gehen uns die zu entfernenden Vokale aus, sodass das nächste Zeichen, das wir entfernen, das am weitesten rechts stehende Leerzeichen ist. Wenn wir 14 Zeichen erreicht haben, haben wir alle Vokale und Leerzeichen entfernt, sodass wir einfach anfangen, die Zeichenfolge von rechts nach links zu kauen.
Hier ist ein Pseudocode- Python-Code, der diese Herausforderung löst:
def crunch_string(string, to_length):
while len(string) > to_length:
# Store the best candidate index for deletion here.
best = None
# First, find the rightmost vowel's index.
for i in range(len(string)):
if string[i] in 'aeiou':
best = i
# If there were no vowels, find the rightmost space's index.
if best is None:
for i in range(len(string)):
if string[i] == ' ':
best = i
# If there were no spaces either, use the final index.
if best is None:
best = len(string) - 1
# Remove the selected character from the string.
string = string[:best] + string[best + 1:]
# Return the string once `len(string) <= to_length`.
return string
Regeln
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Die Eingabezeichenfolge besteht aus den druckbaren ASCII-Zeichen von Leerzeichen (
Dezimalzahl 32) bis einschließlich Tilde (
~
Dezimalzahl 126). Es werden keine Vokale in Großbuchstaben angezeigtAEIOU
Die Zeichenfolge enthält in . Insbesondere handelt es sich nicht um Unicode, Tabulatoren oder Zeilenumbrüche.Rufen Sie die Eingabezeichenfolge s und die Eingabe-Ziellänge t auf . Dann ist 0 <t ≤ Länge ( n ) ≤ 10000 garantiert. (Insbesondere wird die Eingabezeichenfolge niemals leer sein. Wenn t = Länge ( s ), sollten Sie die Zeichenfolge nur unverändert zurückgeben.)
Testfälle
Input: 50, Duis commodo scelerisque ex, ac consectetur metus rhoncus.
Output: Duis commodo scelerisque ex, ac cnscttr mts rhncs.
Input: 20, Maecenas tincidunt dictum nunc id facilisis.
Output: Mcnstncdntdctmnncdfc
Input: 150, golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf
Output: glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glfglfglfglfglfglfglfglfglfglf
y
ein Vokal?aeiou
sind Vokale undAEIOU
werden der Einfachheit halber nicht vorkommen. (Die ganze Groß- / Kleinschreibung ist nicht das, worauf ich mich konzentrieren möchte.) Ich fügte eine Klarstellung hinzu.w
(zum Beispiel in dem Wort co w ,w
ist ein Vokal!) Natürlich, die für diesen abgemacht, aber für , wo es nicht angegeben ist , dass der Satz von Vokalen istaeiou
, sollten Sie manchmal enthalteny
undw
. : -Ofor index, char in enumerate(string)
statt desrange(len(str))
KonstruktsAntworten:
MATL , 20 Bytes
Probieren Sie es online!
quelle
Perl,
484543 BytesBeinhaltet +4 für
-Xlpi
(-X kann weggelassen werden, hinterlässt aber hässliche Warnungen bei STDERR)Führen Sie mit der Nummer nach der
-i
Option und der Eingabe auf STDIN (unterstützt auch mehrere Zeilen). z.Bperl -Xlpi50 crunch.pl <<< "Duis commodo scelerisque ex, ac consectetur metus rhoncus."
crunch.pl
:quelle
/$+/
undwhile
JavaScript (ES6),
6661 Bytes5 Bytes dank @Neil gespart
Ich denke nicht, dass der Regex weiter Golf spielen kann. Überraschenderweise ist der kürzeste Zeitraum, in dem ich Front-to-Back entfernen kann, ein Byte länger:
Interessanter Versuch (ES7), 134 Bytes
Dies verwendet einen Ansatz ähnlich der MATL-Antwort.
quelle
|.$/,"$1$2"
5 Bytes sparen kann .sh + gnu sed,
7861Geben Sie den String an
STDIN
, die Länge als erstes Argument.quelle
Lua, 120 Bytes
Übernimmt Eingaben als Befehlszeilenargumente im Format
lua crunch.lua 10 "This is a string"
mit AusgabeThs sstrng
.Erläuterung:
quelle
Perl, 68
Durch Entfernen von rechts werden eine Menge Zeichen hinzugefügt. Vielleicht gibt es einen besseren Weg, dies zu tun.
Verwenden Sie,
-i
um die Nummer einzugeben. Es ist 65 Zeichen plus 3 für dasi
,p
undl
in der Befehlszeile.Laufen mit:
quelle
y///c
anstelle von verwendenlength
und Sie können die while-Schleife an das Ende verschieben:s///||s///||s///while$^I<y///c
Java 8, 303 Bytes
Das ist viel zu lang. Ich versuche es bald zu verkürzen. Es wäre viel kürzer, wenn Java eine Methode zum Umkehren von Zeichenfolgen und zum Ersetzen in Rückwärtsrichtung hätte.
Testen Sie mit den folgenden:
quelle
s->j->{...}
). Ich denke, entweder unterstützt Java es nicht sehr gut oder ich richte es falsch ein.C #, 180 Bytes
Prüfer:
quelle
Scala, 160 Bytes
Prüfer:
quelle
Dyalog APL,
774542 Bytest[
...]
Buchstaben t mit den Indizes ...t←⌽⍞
t wird reversed Texteingabei←⍳⍴t
i Indizes der Länge bekommt t/¨⊂i
mehrere (3) boolean Auswahlen von Elementen der i :1.
(t∊'aeiou')
boolean wo Vokal2.
(' '=t)
boolean , wo der Platz3.
1
alle∪∊
einzigartig des eingetragen ( abgeflacht) 3 Auswahlen⌽⎕↓⌽
lassen die zuletzt eingegebenen Zeichen fallen (wie(-⎕)↓
)⌽i~
kehren die verbleibenden Indizes um, nachdem einige entfernt wurdenUrsprüngliche Antwort:
Ähm, ja, das ist ein bisschen schwer zu lesen. Grundsätzlich die direkte Übersetzung von OP in APL:
quelle
Mathematica, 201 Bytes
Es muss einen besseren Weg geben als diesen.
quelle
R,
169143 Bytes* Bearbeiten Sie gespeicherte 36 Byte durch Umschreiben mit
utf8ToInt
->intToUtf8
Konvertierungen nichtstrstplit
undpaste0(...,collapse)
ungolfed mit erklärung
quelle