Drabinka ze sznurkiem

12

Biorąc pod uwagę ciąg si dodatnią liczbę całkowitą N, stopniowo duplikuj każdy znak coraz bardziej aż do Nduplikowania, a następnie pozostając w Nduplikatach aż do Nznaków oddalających się od końca, a następnie ponownie zejdź na dół.

Na przykład dane abalonei 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

i wynik byłby abbaaalllooonne.

Jest gwarantowane, że łańcuch ma długość większą niż 2Ni ma tylko znaki od ado z.

Więcej przypadków testowych:

N string       output
2 aaaaa        aaaaaaaa
3 abcdabcdabcd abbcccdddaaabbbcccdddaaabbbccd

To jest . Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki .

Leaky Nun
źródło

Odpowiedzi:

11

Galaretka , 6 bajtów

JṡFṢị⁸

Wypróbuj online!

Jak to działa

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.

Przykładowy przebieg

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
źródło
3
Ta metoda dzielenia + spłaszczania + sortowania jest genialna. Ładny! :)
HyperNeutrino,
7

Python 2 , 57 bajtów

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

Wypróbuj online!

Również 57:

Python 2 , 57 bajtów

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

Wypróbuj online!

xnor
źródło
Czy potrafisz wyjaśnić swoją logikę len(s[:i][:n])? Jestem przekonany, że istnieje krótszy sposób na uzyskanie tej liczby, ale nie jestem pewien, jak to zrobić.
musicman523
Nieważne, mam to! Ale jest o jeden bajt krótszy niż min(len(s),i,n). Dobra robota!
musicman523
6

JavaScript (ES6), 67 65 bajtów

-2 bajty dzięki krótszym sposób Chás Browna użyciem min().

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

Trwa wejście w składni currying: f("abalone")(3).

Test Snippet

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
źródło
6

Galaretka , 8 7 bajtów

J««U$⁸x

Wypróbuj online!

Jak to działa

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 bajt dzięki @LeakyNun

fireflame241
źródło
Dobre znalezisko @LeakyNun! Najbliżej znalazłem się w tym kierunku J«¥@«U$x@dla 9 bajtów.
fireflame241
Wyjaśnienie proszę?
Towarzysz SparklePony,
@ fireflame241 genenrally, x@⁸jest ekwiwalentny ⁸x(użyłem tutaj)
Leaky Nun
2

Haskell , 61 60 bajtów

Dzięki @Laikoni za pomoc w goleniu 1 bajtu

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

Wypróbuj online!

Nie golfowany:

(#) n string = do
    (i, char) <- zip [1..] string
    replicate (minimum [n, i, length(string)-i+1]) char
Julian Wolf
źródło
Świetne wykorzystanie dobloku! Zapisz bajt, upuszczając nawias w length(s).
Laikoni
1

Haskell (Lambdabot), 74 bajty

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

Wypróbuj online!

ბიმო
źródło
Import liczy się w wyniku! Lepiej byłoby z>>=id
bartavelle,
Tak, zrobiłem to zbyt wcześniej i wtedy zobaczyłem to (dlatego nie Lambdabot w nawiasach). Jaka jest właściwa droga?
ბიმო
Poprawiłem się, myślę, że to w porządku!
bartavelle,
Warto wiedzieć, że na tej liście znajduje się bardzo poręczny import.
ბიმო
1

J, 24 bajty

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

Bit w parens - (<.&n<./(|.,:[)>:i.#s)- tworzy 1 2 ... n n n ... 2 1tablicę w następujący sposób:

                   #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

gdy już to mamy, #operator J automatycznie robi dokładnie to, o co prosił, duplikując każdy element określoną liczbę razy.

Ciekawe, jak udoskonalił się ekspert J w tym ...

Jonasz
źródło
23 bajty z zupełnie innym podejściem [#~#@[$([:>:<:,&:i.-)@](być może złapano tam zbłąkane miejsce). Nie wiem, dlaczego haczyk nie bierze, xale nie jest w stanie za bardzo się tym przejmować.
cole
1

PHP> = 7,1, 75 bajtów

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

PHP Sandbox Online

PHP> = 7,1, 78 bajtów

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 bajtów

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
źródło
1

Japt , 11 10 bajtów

ËpVm°TEnUÊ

Sprawdź to


Wyjaśnienie

Domniemane wprowadzanie ciągu Ui liczby całkowitej V.

Ë

Zamapuj Ui zamień każdą postać.

Vm

Uzyskaj minimum V...

°T

T(początkowo 0) zwiększany o 1, ...

EnUÊ

Indeks bieżącego znaku ( E) odjął od ( n) długości ( Ê) z U.

p

Powtórz obecną postać wiele razy.

Niejawnie wyprowadza ostatni ciąg.

Kudłaty
źródło
1

R , 87 bajtów

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

Wypróbuj online!

Giuseppe
źródło
0

Python 2 68 bajtów

f=lambda s,n:''.join(s[i]*min(i+1,len(s)-i,n)for i in range(len(s)))
Chas Brown
źródło
Nie potrzebujesz f=odpowiedzi; funkcja może być anonimowa. Mając to na uwadze, możesz usunąć 3 bajty za pomocą lambda s,n:''.join(c*min(i+1,len(s)-i,n)for i,c in enumerate(s)).
notjagan
0

Łuska , 10 9 bajtów

₁₁ṀR
↔z↑N

Wypróbuj online!

Pierwszy wiersz jest główną funkcją, powtarza każdą literę n razy, a następnie wywołuje drugi wiersz dwukrotnie.

Drugi wiersz zajmuje najwyżej N liter z każdej grupy powtarzanych liter, gdzie N jest indeksem grupy opartym na 1, a następnie odwraca listę.

Lew
źródło
0

APL (Dyalog) , 15 bajtów

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

{} Funkcja, w której lewy argument (cap) to ⍺, a prawy argument (string) to :

≢⍵ policzyć liczbę znaków w ciągu

 wygenerować tyle liczb całkowitych

i← przechowywać w i

 rewers

i⌊ minimum parowe z i

⍺⌊ minimum w parach z czapką

⍵/⍨ użyj tych liczb, aby powielić litery ciągu

Wypróbuj online!

Adám
źródło
0

Java (OpenJDK 8) , 101 97 bajtów

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

Wypróbuj online!

Tyle zabawy z indeksami ...

Olivier Grégoire
źródło
0

Abalone to rodzaj ryby (cóż, skorupiaki), dlatego…

> <> , 79 bajtów

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

Wypróbuj online lub obejrzyj na placu zabaw dla ryb !

Odczytuje ciąg ze STDIN i zakłada, że ​​liczba jest już na stosie.

Objaśnienie: Druga, czwarta i szósta linia to główne pętle. Szczegółami są niektóre brzydkie manipulacje na stosie, ale w szerokich pociągnięciach, po pierwsze, druga linia wypełnia stos na przemian między znakiem wejścia i min ( in ), gdzie n jest ograniczeniem długości, a i jest indeksem znaku w wejście: dla „abalone”, 3, wygląda stos

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

Następnie linia 4 przechodzi przez stos w ten sam sposób w odwrotnej kolejności, aby poprawnie zakryć prawy koniec:

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

Następnie szósta linia pobiera każdą parę znak-liczba i wypisuje znak tyle razy, ile liczba.

Nie drzewo
źródło