Échelle à cordes plafonnée

12

Étant donné une chaîne set un entier positif N, dupliquez progressivement chaque caractère de plus en plus jusqu'à ce que des Ndoublons, puis restez en Ndouble jusqu'à ce que les Ncaractères soient éloignés de la fin, puis redescendez.

Par exemple, étant donné abaloneet 3:

a    we start with 1 copy
bb   then 2 copies
aaa  then 3 copies, which is our second parameter
lll  so we continue using 3 copies
ooo  until we reach the end
nn   where we use 2 copies
e    and then finally 1 copy

et le résultat serait abbaaalllooonne.

Il est garanti que la chaîne a une longueur supérieure à 2Net ne contient que des caractères de aà z.

Plus de tests:

N string       output
2 aaaaa        aaaaaaaa
3 abcdabcdabcd abbcccdddaaabbbcccdddaaabbbccd

C'est du . La réponse la plus courte en octets l'emporte. Des échappatoires standard s'appliquent.

Leaky Nun
la source

Réponses:

11

Gelée , 6 octets

JṡFṢị⁸

Essayez-le en ligne!

Comment ça fonctionne

JṡFṢị⁸  Main link. Arguments: s (string), n (integer)

J       Get the indices of s.
 ṡ      Split the indices into overlapping chunks of length n.
  F     Flatten the array of chunks.
   Ṣ    Sort the resulting array of indices.
    ị⁸   Get the characters of s at these indices.

Exemple d'exécution

JṡFṢị⁸  "abalone", 3

J       [1, 2, 3, 4, 5, 6, 7].
 ṡ      [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]]
  F     [1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7]
   Ṣ    [1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7]
    ị⁸  "abbaaalllooonne"
Dennis
la source
3
Cette méthode de division + aplatissement + tri est un pur génie. Agréable! :)
HyperNeutrino
7

Python 2 , 57 octets

f=lambda s,n,i=1:s and s[0]*len(s[:i][:n])+f(s[1:],n,i+1)

Essayez-le en ligne!

Aussi 57:

Python 2 , 57 octets

f=lambda s,n,i=1:s and s[0]*len(s[:i])+f(s[1:],n,i+(i<n))

Essayez-le en ligne!

xnor
la source
Pouvez-vous expliquer votre logique derrière len(s[:i][:n])? Je suis convaincu qu'il existe un moyen plus court d'obtenir ce chiffre, mais je ne sais pas comment.
musicman523
Tant pis, je l'ai! Mais c'est un octet plus court que min(len(s),i,n). Bon travail!
musicman523
6

JavaScript (ES6), 67 65 octets

-2 octets grâce à la méthode plus courte de Chas Brown à l' aide min().

s=>n=>s.replace(/./g,(c,i)=>c.repeat(Math.min(i+1,s.length-i,n)))

Prend entrée dans la syntaxe corroyage: f("abalone")(3).

Extrait de test

f=
s=>n=>s.replace(/./g,(c,i)=>c.repeat(Math.min(i+1,s.length-i,n)))
<div oninput="O.value=f(S.value)(+N.value)">String: <input id=S> N: <input id=N size=3></div>Out: <input id=O size=50 disabled>

Justin Mariner
la source
6

Gelée , 8 7 octets

J««U$⁸x

Essayez-le en ligne!

Comment ça fonctionne

J««U$⁸x - main link, input e.g. abalone
J        - range of length of letters: [1,2,3,4,5,6,7]
 «       - minimum of each term with second input: [1,2,3,3,3,3,3]
  «U$    - termwise minimum with the reverse: 
                    min([1,2,3,3,3,3,3],[3,3,3,3,3,2,1])=[1,2,3,3,3,2,1]
     ⁸x  - repeat each character of the input a number of times corresponding to elements:
                    a*1;b*2;a*3...e*1 = abbaaalllooonne

-1 octet grâce à @LeakyNun

fireflame241
la source
Bonne trouvaille @LeakyNun! Le plus proche que j'ai obtenu dans cette direction était J«¥@«U$x@de 9 octets.
fireflame241
Explication s'il vous plait?
Camarade SparklePony
@ fireflame241 en général, x@⁸équivaut à ⁸x(j'ai utilisé ici)
Leaky Nun
2

Haskell , 61 60 octets

Merci à @Laikoni d'avoir aidé à raser 1 octet

n#s=do(i,c)<-zip[1..]s;replicate(minimum[n,i,length s-i+1])c

Essayez-le en ligne!

Non golfé:

(#) n string = do
    (i, char) <- zip [1..] string
    replicate (minimum [n, i, length(string)-i+1]) char
Julian Wolf
la source
Grande utilisation d'un dobloc! Enregistrez un octet en déposant la parenthèse dans length(s).
Laikoni
1

Haskell (Lambdabot), 74 octets

r=replicate
f x n=join$zipWith r([1..n]++r(length x-2*n)n++reverse[1..n])x

Essayez-le en ligne!

ბიმო
la source
Les importations comptent dans le score! Tu serais mieux avec>>=id
Bartavelle
Ouais, je l'ai fait aussi avant et ensuite j'ai vu ça (c'est pourquoi il y a Lambdabot entre parenthèses). Quelle est la bonne façon?
ბიმო
Je suis corrigé, je pense que ça va!
Bartavelle
Bon à savoir, il y a beaucoup d'importations très pratiques dans cette liste.
ბიმო
1

J, 24 octets

(<.&n<./(|.,:[)>:i.#s)#s

Le bit entre parenthèses - (<.&n<./(|.,:[)>:i.#s)- crée le 1 2 ... n n n ... 2 1tableau, comme suit:

                   #s    length of s, call it L
                 i.      numbers 0 1 ... L-1
               >:        increment by 1, now 1 2 ... L
        (|.,:[)          fork: |. = reverse, ,: = stack, [ = identity
                         resulting in  L ... 2 1
                                       1 2 ... L 
     <./                 min of each element of the top and bottom row
 <.&n                    min of each resulting elm and n

une fois que nous avons cela, l' #opérateur de J fait automatiquement exactement ce qui est demandé, en dupliquant chaque élément le nombre de fois spécifié.

Curieux de voir l'amélioration d'un expert J sur ce ...

Jonas
la source
23 octets avec une approche assez différente [#~#@[$([:>:<:,&:i.-)@](peut-être qu'un espace errant s'est coincé là-dedans). Je ne sais pas pourquoi l'hameçon ne prend xpas, mais pas trop en position de m'occuper.
cole
1

PHP> = 7.1, 75 octets

for([,$a,$n]=$argv;--$z?:($x=$a[$i]).$z=min($n,strlen($a)-$i,++$i);)echo$x;

PHP Sandbox Online

PHP> = 7.1, 78 octets

for([,$a,$n]=$argv;~$x=$a[$i];)for($z=min($n,strlen($a)-$i,++$i);$z--;)echo$x;

PHP Sandbox Online

PHP> = 7.1, 80 octets

for([,$a,$n]=$argv;$i<$l=strlen($a);)echo str_repeat($a[$i],min($n,$l-$i,++$i));

PHP Sandbox Online

Jörg Hülsermann
la source
1

Japt , 11 10 octets

ËpVm°TEnUÊ

Essaye-le


Explication

Saisie implicite de chaîne Uet d'entier V.

Ë

Mappez Uet remplacez chaque personnage.

Vm

Obtenez le minimum de V, ...

°T

T(initialement 0) incrémenté de 1, ...

EnUÊ

Et l'index du caractère actuel ( E) soustrait de ( n) la longueur ( Ê) de U.

p

Répétez le caractère actuel autant de fois.

Sortie implicite de la chaîne finale.

Hirsute
la source
1

R , 87 octets

function(N,s)paste(rep(strsplit(s,"")[[1]],c(1:N,rep(N,nchar(s)-2*N),N:1)),collapse="")

Essayez-le en ligne!

Giuseppe
la source
0

Python 2 68 octets

f=lambda s,n:''.join(s[i]*min(i+1,len(s)-i,n)for i in range(len(s)))
Chas Brown
la source
Vous n'avez pas besoin du f=dans la réponse; la fonction peut être anonyme. Dans cet esprit, vous pouvez supprimer 3 octets avec lambda s,n:''.join(c*min(i+1,len(s)-i,n)for i,c in enumerate(s)).
notjagan
0

Husk , 10 9 octets

₁₁ṀR
↔z↑N

Essayez-le en ligne!

La première ligne est la fonction principale, elle répète chaque lettre n fois et appelle ensuite la deuxième ligne deux fois.

La deuxième ligne prend au plus N lettres de chaque groupe de lettres répétées, où N est l'index basé sur 1 du groupe, puis inverse la liste.

Leo
la source
0

APL (Dyalog) , 15 octets

{⍵/⍨⍺⌊i⌊⌽i←⍳≢⍵}

{} Fonction où l'argument gauche (cap) est et l'argument droit (string) est :

≢⍵ compter le nombre de caractères dans la chaîne

 générer que beaucoup ɩ ntegers

i← stocker dans i

 sens inverse

i⌊ par paire minimum avec i

⍺⌊ par paire minimum avec le capuchon

⍵/⍨ utilisez ces chiffres pour répliquer les lettres de la chaîne

Essayez-le en ligne!

Adam
la source
0

Java (OpenJDK 8) , 101 97 octets

n->s->{int i=0,j;for(char c:s)for(j=s.length-i++,j=j<i?j:i,j=j<n?j:n;j-->0;)System.out.print(c);}

Essayez-le en ligne!

Tellement jouer avec les indices ...

Olivier Grégoire
la source
0

L'ormeau est un type de poisson (enfin un coquillage) donc…

> <> , 79 octets

&i1\
0(?\:1+:&::&@)?$~i:@
&~}\&~1
0(?\:&::1+&@)?$~}}:
 ~r\
?!v>l?!;:o$1-:@
~~<^

Essayez-le en ligne ou regardez-le au terrain de pêche !

Lit la chaîne dans STDIN et suppose que le numéro est déjà sur la pile.

Explication: Les deuxième, quatrième et sixième lignes sont les principales boucles. Les détails sont une mauvaise manipulation de la pile, mais à grands traits, d'abord, la deuxième ligne remplit la pile en alternant entre un caractère d'entrée et min ( in ), où n est la longueur maximale et i est l'index du caractère dans l'entrée: pour "ormeau", 3, la pile ressemble à

"a", 1, "b", 2, "a", 3, "l", 3, "o", 3, "n", 3, "e", 3, -1=EOF, 3

Ensuite, la ligne 4 parcourt la pile de la même manière en sens inverse, pour obtenir le bout droit correctement plafonné:

"a", 1, "b", 2, "a", 3, "l", 3, "o", 3, "n", 2, "e", 1, -1

Ensuite, la sixième ligne prend chaque paire caractère-numéro et imprime le caractère autant de fois que le nombre.

Pas un arbre
la source