Tangga tali tertutup

12

Diberikan string sdan bilangan bulat positif N, secara bertahap menduplikasi setiap karakter lebih banyak dan lebih banyak hingga Nduplikat, dan kemudian tinggal di Nduplikat hingga Nkarakter menjauh dari akhir, lalu mundur lagi.

Misalnya, diberikan abalonedan 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

dan hasilnya akan menjadi abbaaalllooonne.

Dijamin bahwa string memiliki panjang lebih besar dari 2Ndan hanya memiliki karakter dari ahingga z.

Lebih banyak testcases:

N string       output
2 aaaaa        aaaaaaaa
3 abcdabcdabcd abbcccdddaaabbbcccdddaaabbbccd

Ini adalah . Jawaban terpendek dalam byte menang. Celah standar berlaku.

Biarawati Bocor
sumber

Jawaban:

11

Jelly , 6 byte

JṡFṢị⁸

Cobalah online!

Bagaimana itu bekerja

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.

Contoh dijalankan

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
sumber
3
Metode split + flatten + sort itu jenius murni. Bagus! :)
HyperNeutrino
7

Python 2 , 57 byte

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

Cobalah online!

Juga 57:

Python 2 , 57 byte

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

Cobalah online!

Tidak
sumber
Bisakah Anda menjelaskan logika Anda di belakang len(s[:i][:n])? Saya yakin ada cara yang lebih pendek untuk mendapatkan nomor itu tetapi saya tidak yakin bagaimana caranya.
musicman523
Sudahlah, saya mengerti! Tapi satu byte lebih pendek dari min(len(s),i,n). Kerja bagus!
musicman523
6

JavaScript (ES6), 67 65 byte

-2 byte berkat metode Chas Brown yang lebih pendek menggunakan min().

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

Mengambil input dalam sintaks currying: f("abalone")(3).

Cuplikan Tes

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

Jelly , 8 7 byte

J««U$⁸x

Cobalah online!

Bagaimana itu bekerja

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 terima kasih kepada @LeakyNun

fireflame241
sumber
Temukan @LeakyNun! Yang paling dekat saya ke arah itu adalah J«¥@«U$x@untuk 9 byte.
fireflame241
Penjelasannya tolong?
Kamerad SparklePony
@ fireflame241 genenrally, x@⁸sama dengan ⁸x(saya gunakan di sini)
Leaky Nun
2

Haskell , 61 60 byte

Terima kasih kepada @Laikoni karena membantu mengurangi 1 byte

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

Cobalah online!

Tidak Disatukan:

(#) n string = do
    (i, char) <- zip [1..] string
    replicate (minimum [n, i, length(string)-i+1]) char
Julian Wolf
sumber
Penggunaan doblok! Simpan byte dengan menjatuhkan tanda kurung di length(s).
Laikoni
1

Haskell (Lambdabot), 74 byte

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

Cobalah online!

ბიმო
sumber
Impor dihitung dalam skor! Anda akan lebih baik dengan>>=id
bartavelle
Ya, saya pernah melakukan itu sebelumnya dan kemudian saya melihat ini (itu sebabnya ada Lambdabot di dalam kurung). Apa jalan yang benar?
ბიმო
Saya berdiri dengan benar, saya pikir ini baik-baik saja!
bartavelle
Baik untuk diketahui, ada banyak impor yang sangat berguna dalam daftar itu.
ბიმო
1

J, 24 byte

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

Bit dalam parens - (<.&n<./(|.,:[)>:i.#s)- membuat 1 2 ... n n n ... 2 1array, sebagai berikut:

                   #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

begitu kita memilikinya, #operator J secara otomatis melakukan apa yang diminta, menduplikasi setiap elemen berapa kali ditentukan.

Penasaran ingin melihat perbaikan pakar J tentang ini ...

Jonah
sumber
23 byte dengan pendekatan yang sangat berbeda [#~#@[$([:>:<:,&:i.-)@](mungkin ruang yang tersangkut di sana). Saya bingung mengapa kait tidak mengambil xtetapi tidak dalam posisi yang terlalu peduli.
cole
1

PHP> = 7.1, 75 byte

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

PHP Sandbox Online

PHP> = 7.1, 78 byte

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 byte

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
sumber
1

Japt , 11 , 10 byte

ËpVm°TEnUÊ

Menguji


Penjelasan

Input string Udan integer tersirat V.

Ë

Memetakan Udan mengganti setiap karakter.

Vm

Dapatkan minimum V, ...

°T

T(awalnya 0) bertambah 1, ...

EnUÊ

Dan indeks karakter saat ini ( E) dikurangkan dari ( n) panjang ( Ê) dari U.

p

Ulangi karakter saat ini yang berkali-kali.

Keluarkan string terakhir secara tersirat.

Shaggy
sumber
1

R , 87 byte

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

Cobalah online!

Giuseppe
sumber
0

Python 2 68 byte

f=lambda s,n:''.join(s[i]*min(i+1,len(s)-i,n)for i in range(len(s)))
Chas Brown
sumber
Anda tidak membutuhkan f=jawabannya; fungsinya bisa anonim. Dengan mengingat hal itu, Anda dapat menghapus 3 byte dengan lambda s,n:''.join(c*min(i+1,len(s)-i,n)for i,c in enumerate(s)).
notjagan
0

Sekam , 10 9 byte

₁₁ṀR
↔z↑N

Cobalah online!

Baris pertama adalah fungsi utama, ia mengulangi setiap huruf n kali dan kemudian memanggil baris kedua dua kali.

Baris kedua mengambil paling banyak N huruf dari setiap kelompok huruf yang diulang, di mana N adalah indeks berbasis 1 grup, kemudian membalikkan daftar.

Leo
sumber
0

APL (Dyalog) , 15 byte

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

{} Berfungsi di mana argumen kiri (batas) adalah dan argumen kanan (string) adalah :

≢⍵ hitung jumlah karakter dalam string

 menghasilkan banyak ɩ ntegers

i← simpan di i

 membalikkan

i⌊ berpasangan minimum dengan i

⍺⌊ minimal berpasangan dengan tutupnya

⍵/⍨ gunakan angka-angka itu untuk mereplikasi huruf-huruf string

Cobalah online!

Adm
sumber
0

Java (OpenJDK 8) , 101 97 byte

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

Cobalah online!

Begitu banyak bermain dengan indeks ...

Olivier Grégoire
sumber
0

Abalon adalah jenis ikan (yah, kerang), karena itu ...

> <> , 79 byte

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

Cobalah online , atau tonton di taman bermain ikan !

Membaca string dari STDIN, dan menganggap nomor tersebut sudah ada di tumpukan.

Penjelasan: Baris kedua, keempat dan keenam adalah loop utama. Detailnya adalah beberapa manipulasi tumpukan jelek, tetapi dalam goresan lebar, pertama, baris kedua mengisi tumpukan bergantian antara karakter input dan min ( in ), di mana n adalah tutup panjang dan i adalah indeks karakter di input: untuk "abalone", 3, susunannya terlihat seperti

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

Selanjutnya, baris 4 melewati tumpukan dengan cara yang sama secara terbalik, untuk mendapatkan ujung kanan tertutup dengan benar:

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

Kemudian baris keenam mengambil setiap pasangan karakter-angka dan mencetak karakter sebanyak jumlah tersebut.

Bukan pohon
sumber