Escada de corda nivelada

12

Dada uma sequência se um número inteiro positivo N, duplique cada caractere gradualmente mais e mais até Nduplicar e, depois, permaneça Nduplicado até os Ncaracteres afastarem-se do final e, em seguida, desça novamente.

Por exemplo, dado abalonee 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

e o resultado seria abbaaalllooonne.

É garantido que a cadeia tenha comprimento maior que 2Ne possua apenas caracteres de aaté z.

Mais casos de teste:

N string       output
2 aaaaa        aaaaaaaa
3 abcdabcdabcd abbcccdddaaabbbcccdddaaabbbccd

Isso é . A resposta mais curta em bytes vence. Aplicam-se brechas padrão .

Freira Furada
fonte

Respostas:

11

Gelatina , 6 bytes

JṡFṢị⁸

Experimente online!

Como funciona

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.

Execução de amostra

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
fonte
3
Esse método split + flatten + sort é puro gênio. Agradável! :)
HyperNeutrino 4/17/17
7

Python 2 , 57 bytes

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

Experimente online!

Também 57:

Python 2 , 57 bytes

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

Experimente online!

xnor
fonte
Você pode explicar sua lógica por trás len(s[:i][:n])? Estou convencido de que há uma maneira mais curta de obter esse número, mas não sei como.
musicman523
Não importa, eu entendi! Mas é um byte menor que min(len(s),i,n). Bom trabalho!
musicman523
6

JavaScript (ES6), 67 65 bytes

-2 bytes graças ao método mais curto de Chas Brown usando min().

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

Toma de entrada na sintaxe currying: f("abalone")(3).

Snippet de teste

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
fonte
6

Geléia , 8 7 bytes

J««U$⁸x

Experimente online!

Como funciona

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 byte graças a @LeakyNun

fireflame241
fonte
Boa descoberta @LeakyNun! O mais próximo que cheguei nessa direção foi J«¥@«U$x@de 9 bytes.
Fireflame241
Explicação, por favor?
precisa saber é o seguinte
@ fireflame241 genenrally, x@⁸é equivallent para ⁸x(eu usei aqui)
Leaky Nun
2

Haskell , 61 60 bytes

Obrigado a @Laikoni por ajudar a reduzir 1 byte

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

Experimente online!

Ungolfed:

(#) n string = do
    (i, char) <- zip [1..] string
    replicate (minimum [n, i, length(string)-i+1]) char
Julian Wolf
fonte
Ótimo uso de um dobloco! Salve um byte, soltando os parênteses length(s).
Laikoni 5/07
1

Haskell (Lambdabot), 74 bytes

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

Experimente online!

ბიმო
fonte
As importações contam na pontuação! Você seria melhor com>>=id
bartavelle 4/17/17
Sim, eu fiz isso também antes e vi isso (é por isso que há Lambdabot entre parênteses). Qual é o caminho certo?
ბიმო
Fico corrigido, acho que está tudo bem!
bartavelle
É bom saber que existem muitas importações muito úteis nessa lista.
ბიმო
1

J, 24 bytes

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

O bit em parens - (<.&n<./(|.,:[)>:i.#s)- cria a 1 2 ... n n n ... 2 1matriz da seguinte maneira:

                   #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

quando tivermos isso, o #operador de J fará automaticamente exatamente o que foi solicitado, duplicando cada elemento o número de vezes especificado.

Curioso para ver o aperfeiçoamento de um especialista em J ...

Jonah
fonte
23 bytes com uma abordagem bem diferente [#~#@[$([:>:<:,&:i.-)@](talvez um espaço perdido tenha sido pego lá). Estou sem saber por que o gancho não está pegando, xmas não estou em posição de me importar.
Cole
1

PHP> = 7.1, 75 bytes

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

Sandbox do PHP Online

PHP> = 7.1, 78 bytes

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

Sandbox do PHP Online

PHP> = 7.1, 80 bytes

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

Sandbox do PHP Online

Jörg Hülsermann
fonte
1

Japonês , 11 10 bytes

ËpVm°TEnUÊ

Teste-o


Explicação

Entrada implícita de sequência Ue número inteiro V.

Ë

Mapeie Ue substitua todos os personagens.

Vm

Obtenha o mínimo de V, ...

°T

T(inicialmente 0) incrementado por 1, ...

EnUÊ

E o índice do caractere atual ( E) subtraído de ( n) o comprimento ( Ê) de U.

p

Repita o caractere atual várias vezes.

Saída implícita da sequência final.

Shaggy
fonte
1

R , 87 bytes

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

Experimente online!

Giuseppe
fonte
0

Python 2 68 bytes

f=lambda s,n:''.join(s[i]*min(i+1,len(s)-i,n)for i in range(len(s)))
Chas Brown
fonte
Você não precisa f=da resposta; a função pode ser anônima. Com isso em mente, você pode remover 3 bytes com lambda s,n:''.join(c*min(i+1,len(s)-i,n)for i,c in enumerate(s)).
precisa saber é
0

Casca , 10 9 bytes

₁₁ṀR
↔z↑N

Experimente online!

A primeira linha é a função principal, repete cada letra n vezes e depois chama a segunda linha duas vezes.

A segunda linha pega no máximo N letras de cada grupo de letras repetidas, onde N é o índice baseado em 1 do grupo, e depois inverte a lista.

Leo
fonte
0

APL (Dyalog) , 15 bytes

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

{} Função em que o argumento esquerdo (cap) é e o argumento direito (string) é :

≢⍵ conte o número de caracteres na sequência

 gerar que muitas Ɩ ntegers

i← armazenar em i

 marcha ré

i⌊ mínimo pareado com i

⍺⌊ mínimo par a par com a tampa

⍵/⍨ use esses números para replicar as letras da string

Experimente online!

Adão
fonte
0

Java (OpenJDK 8) , 101 97 bytes

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);}

Experimente online!

Muito jogando com índices ...

Olivier Grégoire
fonte
0

Abalone é um tipo de peixe (bem, um marisco), portanto…

> <> , 79 bytes

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

Experimente online ou assista no playground de peixes !

Lê a string de STDIN e assume que o número já está na pilha.

Explicação: A segunda, quarta e sexta linhas são os loops principais. Os detalhes são uma manipulação feia da pilha, mas em linhas gerais, primeiro, a segunda linha preenche a pilha alternando entre um caractere de entrada e min ( in ), onde n é o limite de comprimento e i é o índice do caractere em a entrada: para "abalone", 3, a pilha parece

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

Em seguida, a linha 4 passa pela pilha da mesma maneira no sentido inverso, para obter a extremidade direita da tampa adequadamente:

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

A sexta linha pega cada par de caracteres e números e imprime o caractere tantas vezes quanto o número.

Não é uma árvore
fonte