Le défi
Étant donné une chaîne d'entrée et un entier n - tronquez toute série de caractères consécutifs jusqu'à une longueur maximale de n . Les caractères peuvent être n'importe quoi, y compris des caractères spéciaux. La fonction doit être sensible à la casse et n peut aller de 0 à l'infini.
Exemples d'entrées / sorties:
f("aaaaaaabbbccCCCcc", 2) //"aabbccCCcc"
f("aaabbbc", 1) //"abc"
f("abcdefg", 0) //""
f("aaaaaaabccccccccCCCCCC@", 4) //"aaaabccccCCCC@"
Notation
La notation est basée sur le nombre d'octets utilisés. Donc
function f(s,n){return s.replace(new RegExp("(.)\\1{"+n+",}","g"),function(x){return x.substr(0, n);});}
serait de 104 points.
Bon golf!
Edit: suppression de la restriction de langue, mais j'aimerais toujours voir les réponses javascript
Réponses:
Python 2, 52 octets
Écrit en tant que programme (54 octets):
Itère à travers la chaîne d'entrée
s
, en ajoutant chaque caractère à la chaîne de sortie,r
sauf si les derniersn
caractères der
sont ce caractère.Je pensais que cela échouerait
n==0
car cer[-0:]
n'est pas les 0 derniers caractères (chaîne vide), mais la chaîne entière. Mais, cela fonctionne parce que la chaîne reste vide, donc elle continue de correspondre à la chaîne de 0 caractères.Un récursif a
lambda
donné 56 à cause de la répétitionUne stratégie alternative pour garder un compteur
i
de répétitions du dernier caractère s'est également avérée plus longue que la simple vérificationn
directe des derniers caractères.la source
C,
8178Modifie la chaîne entrante.
Programme de test
Nécessite deux paramètres, le premier est la chaîne à tronquer, le second est la longueur limite.
Explication:
Cela fonctionne car le pointeur source sera toujours égal ou supérieur au pointeur de destination, nous pouvons donc écrire sur la chaîne pendant que nous l'analysons.
la source
Haskell, 36 octets
Version sans point de
\n s -> concatMap (take n) (group s)
.la source
Javascript ES6,
60545543 octets-12 octets grâce à @ TestSubject06 et @Downgoat
L'exemple s'exécute:
la source
RegExp("(.)\\1*","g")
vers/(.)\1*/g
(s,n)
ens=>n
, et l'utilisation devientf("aaaaaaabbbccCCCcc")(2)
MATL, 9 octets
Essayez-le en ligne
Explication
la source
CJam, 12 octets
Essayez-le en ligne!
Explication
la source
Pyth,
1612 octetsEssayez-le en ligne!
la source
Python 2, 56 octets
la source
gs2, 6 octets
Encodé en CP437 :
Il s'agit d'une fonction anonyme (bloc) qui attend un nombre en haut de la pile et une chaîne en dessous.
Essayez-le en ligne. (Le code ici est
lines, dump, read number, [the answer], run-block
.)la source
Perl 6 ,
3836 octetsExplication:
Tester:
la source
Javascript ES5, 73
Réutilise l'expression régulière de Lynn à partir de sa réponse Python .
la source
new
mot clé pour -4 octets.Perl 5, 50 octets
Code de 46 octets + 3 pour
-i
et 1 pour-p
Prend le nombre à tronquer à via
-i
.Usage
la source
-p
un seul octet?-e
ces options ne consomme que 1 octet. Si le script doit être exécuté à partir d'un fichier, il en coûte 3 pour l'espace et il se marque lui-même. Il y a une méta-publication que j'essaierai de trouver, mais je suis actuellement sur mobile.Bash 46 octets
Utilisation: Entrez le nombre de caractères à limiter, appuyez sur Entrée et entrez la chaîne. Ctrl+ Dpour quitter
sed
(envoyer EOF).la source
Java 7,
107106 octetsAlternative précédente pour la boucle en ligne pour la concaténation de chaînes (qui est 1 octet de plus que
String s="";for(int i=-1;++i<j;)s+="$1";
malheureusement):Cas non testés et testés:
Essayez-le ici.
Production:
la source
Javascript (en utilisant une bibliothèque externe) (115 octets)
Lien vers la bibliothèque: https://github.com/mvegh1/Enumerable
Explication du code: chargez la chaîne dans la bibliothèque, qui analyse en interne en tant que tableau de caractères. Appliquez un accumulateur sur la séquence, en passant un objet personnalisé comme valeur de départ. La propriété a est l'élément actuel, b est la chaîne accumulée et c est le nombre séquentiel de l'élément actuel. L'accumulateur vérifie si la valeur d'itération actuelle, n, est égale à la dernière valeur d'élément, ca Sinon, nous remettons le compte à 1 et définissons l'élément actuel. Si le compte de l'élément courant est inférieur ou égal à la longueur souhaitée, nous l'accumulons dans la chaîne de retour. Enfin, nous retournons la propriété b, la chaîne accumulée. Pas le code le plus golfique, mais heureux d'avoir une solution qui fonctionne ...
la source
J,
3130 octetsRegroupe la chaîne d'entrée en exécutions (sous-chaînes) de caractères identiques et prend le minimum de la longueur de cette exécution et la longueur maximale qui a été entrée pour tronquer la chaîne. Copie ensuite le premier caractère de chaque manche autant de fois.
Usage
Explication
la source
Dyalog APL ,
2220 octetsInvite pour n et prend la chaîne d'entrée comme argument.
(
la fonction tacite ...∊
aplatit⊢↑¨⍨
chaque élément de l'argument (c'est-à-dire chaque partition) tronqué au⎕⌊⍴¨
minimum de l'entrée numérique et la longueur actuelle)
[fin de la fonction tacite] appliquée à⊢⊂⍨
l'entrée partitionnée aux ᴛʀᴜᴇ s de1,
ᴛʀᴜᴇ précédée de (la le premier caractère n'est pas égal à son prédécesseur non existant)2≠/⊢
le couple non égal de caractères dans l'entréela source
Rubis, 32 octets
la source
TCC,
75 octetsL'entrée est une chaîne et un nombre, séparés par un espace.
Essayez-le en ligne!
la source
tcc.lua
fichier avec horodatage 16-07-25 16:57 UTC, qui n'avait pas la possibilité de lire plusieurs entrées à la fois. Si votre réponse nécessite une version de la langue postérieure au défi, vous devez la marquer comme non concurrente dans l'en-tête. Je supprimerai mon downvote quand vous le ferez.