Die Herausforderung
Wenn Sie eine Eingabezeichenfolge und eine Ganzzahl n angeben, kürzen Sie alle aufeinander folgenden Zeichenfolgen auf ein Maximum von n Zeichen . Die Zeichen können alles sein, auch Sonderzeichen. Die Funktion sollte zwischen Groß- und Kleinschreibung unterscheiden und n kann von 0 bis unendlich reichen.
Beispiel Ein- / Ausgänge:
f("aaaaaaabbbccCCCcc", 2) //"aabbccCCcc"
f("aaabbbc", 1) //"abc"
f("abcdefg", 0) //""
f("aaaaaaabccccccccCCCCCC@", 4) //"aaaabccccCCCC@"
Wertung
Die Bewertung basiert auf der Anzahl der verwendeten Bytes. Somit
function f(s,n){return s.replace(new RegExp("(.)\\1{"+n+",}","g"),function(x){return x.substr(0, n);});}
wäre 104 Punkte.
Viel Spaß beim Golfen!
Bearbeiten: Spracheinschränkung entfernt, aber ich würde immer noch gerne Javascript-Antworten sehen
Antworten:
Python 2, 52 Bytes
Als Programm geschrieben (54 Bytes):
Durchläuft die Eingabezeichenfolge und hängt
s
jedes Zeichen an die Ausgabezeichenfolge an, esr
sei denn, die letztenn
Zeichen vonr
sind dieses Zeichen.Ich dachte, dies würde scheitern,
n==0
weilr[-0:]
nicht die letzten 0 Zeichen (leere Zeichenfolge), sondern die gesamte Zeichenfolge. Dies funktioniert jedoch, da die Zeichenfolge leer bleibt und daher weiterhin mit der Zeichenfolge mit 0 Zeichen übereinstimmt.Ein rekursiver
lambda
gab 56 wegen der WiederholungEine alternative Strategie, um einen Zähler
i
für die Wiederholungen des letzten Zeichens zu erstellen, hat sich auch als länger herausgestellt, als nur die letztenn
Zeichen direkt zu überprüfen .quelle
C
81,78Ändert die eingehende Zeichenfolge.
Testprogramm
Erfordert zwei Parameter, der erste ist die Zeichenfolge zum Abschneiden, der zweite ist die Längenbeschränkung.
Erläuterung:
Dies funktioniert, weil der Quellzeiger immer gleich oder größer als der Zielzeiger ist, sodass wir den String beim Parsen überschreiben können.
quelle
Haskell, 36 Bytes
Punktefreie Version von
\n s -> concatMap (take n) (group s)
.quelle
Javascript ES6,
60545543 Bytes-12 Bytes dank @ TestSubject06 und @Downgoat
Beispiel läuft:
quelle
RegExp("(.)\\1*","g")
zu/(.)\1*/g
(s,n)
zus=>n
und die Nutzung wirdf("aaaaaaabbbccCCCcc")(2)
MATL, 9 Bytes
Probieren Sie es online
Erläuterung
quelle
CJam, 12 Bytes
Probieren Sie es online!
Erläuterung
quelle
Pyth,
1612 BytesProbieren Sie es online!
quelle
Python 2, 56 Bytes
quelle
gs2, 6 bytes
In CP437 codiert :
Dies ist eine anonyme Funktion (Block), die eine Zahl oben auf dem Stapel und eine Zeichenfolge darunter erwartet.
Probieren Sie es online aus. (Der Code hier ist
lines, dump, read number, [the answer], run-block
.)quelle
Perl 6 ,
3836 BytesErläuterung:
Prüfung:
quelle
Javascript ES5, 73
Verwendet Lynns Regex aus ihrer Python-Antwort erneut .
quelle
new
Schlüsselwort auch für -4 Bytes löschen.Perl 5, 50 Bytes
46 Byte Code + 3 für
-i
und 1 für-p
Nimmt die Nummer, auf die über gekürzt werden soll
-i
.Verwendung
quelle
-p
nur ein Byte?-e
diesen Optionen kombiniert werden kann, verbrauchen nur 1 Byte. Wenn das Skript aus einer Datei ausgeführt werden muss, kostet es 3 für den Speicherplatz und er kennzeichnet sich selbst. Ich werde versuchen, einen Meta-Post zu finden, aber ich bin gerade auf dem Handy.Bash 46 Bytes
Verwendung: Geben Sie die Anzahl der Zeichen ein, die begrenzt werden sollen, drücken Sie die Eingabetaste und geben Sie die Zeichenfolge ein. Ctrl+ Dzum Beenden
sed
(EOF senden).quelle
Java 7,
107106 BytesVorherige alternative Inline-for-Schleife für die String-Verkettung (das ist 1 Byte mehr als
String s="";for(int i=-1;++i<j;)s+="$1";
unglücklicherweise):Ungolfed & Testfälle:
Probieren Sie es hier aus.
Ausgabe:
quelle
Javascript (mit externer Bibliothek) (115 Bytes)
Link zur Bibliothek: https://github.com/mvegh1/Enumerable
Codeerklärung: Laden Sie den String in die Bibliothek, die intern als char-Array analysiert. Wenden Sie einen Akkumulator auf die Sequenz an und übergeben Sie ein benutzerdefiniertes Objekt als Startwert. Eigenschaft a ist das aktuelle Element, b ist die akkumulierte Zeichenfolge und c ist die fortlaufende Anzahl des aktuellen Elements. Der Akkumulator prüft, ob der aktuelle Iterationswert n gleich dem letzten Elementwert ist. Wenn nicht, setzen wir den Zähler auf 1 zurück und setzen das aktuelle Element. Wenn die Anzahl des aktuellen Elements kleiner oder gleich der gewünschten Länge ist, addieren wir sie zur Rückgabezeichenfolge. Schließlich geben wir die Eigenschaft b zurück, die akkumulierte Zeichenfolge. Nicht der Golf-Code, aber glücklich, dass ich eine Lösung gefunden habe, die funktioniert ...
quelle
J,
31-30BytesGruppiert die Eingabezeichenfolge in Läufe (Teilzeichenfolgen) mit identischen Zeichen und verwendet die minimale Länge dieser Läufe und die maximale Länge, die zum Abschneiden der Zeichenfolge eingegeben wurde. Kopiert dann das erste Zeichen jedes Laufs so oft.
Verwendung
Erläuterung
quelle
Dyalog APL ,
2220 BytesEingabeaufforderungen für n Eingabe von und verwendet die Eingabezeichenfolge als Argument.
(
Die implizite Funktion ...∊
Reduziert⊢↑¨⍨
jedes Element des Arguments (dh jede Partition) auf⎕⌊⍴¨
das Minimum der numerischen Eingabe und die aktuelle Länge)
[Ende der impliziten Funktion], die auf⊢⊂⍨
die Eingabe angewendet wird, die an den vorangestellten ᴛʀᴜᴇ s von1,
ᴛʀᴜᴇ partitioniert ist erstes Zeichen ist nicht gleich dem nicht existierenden Vorgänger2≠/⊢
das paarweise ungleiche Zeichen in der Eingabe)quelle
Ruby, 32 Bytes
quelle
TCC,
75 BytesDie Eingabe ist eine durch Leerzeichen getrennte Zeichenfolge und Zahl.
Probieren Sie es online!
quelle
tcc.lua
Datei mit dem Zeitstempel 16-07-25 16:57 UTC, bei der nicht mehrere Eingaben gleichzeitig gelesen werden konnten. Wenn für Ihre Antwort eine Version der Sprache erforderlich ist, in der die Herausforderung nachgestellt ist, müssen Sie sie im Header als nicht konkurrierend kennzeichnen. Ich werde meine Ablehnung entfernen, wenn Sie dies tun.