Kapaklı dize merdiveni


12

Bir dize sve pozitif bir tamsayı göz önüne alındığında N, her bir karakteri Nyinelenene kadar giderek daha fazla çoğaltın ve sonra karakterler sondan uzaklaşana Nkadar yinelemelerde kalarak Ntekrar aşağı inin.

Örneğin, verilen abaloneve 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

ve sonuç olur abbaaalllooonne.

Dizenin uzunluğundan daha büyük olduğu 2Nve yalnızca - arasındaki karakterlere sahip olduğu garanti aedilir z.

Daha fazla testcases:

N string       output
2 aaaaa        aaaaaaaa
3 abcdabcdabcd abbcccdddaaabbbcccdddaaabbbccd

Bu . Bayt cinsinden en kısa cevap kazanır. Standart boşluklar geçerlidir.

Yanıtlar:


11

Jöle , 6 bayt

JṡFṢị⁸

Çevrimiçi deneyin!

Nasıl çalışır

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.

Örnek çalışma

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"

3
Bu split + flatten + sort yöntemi saf dahidir. Güzel! :)
HyperNeutrino

7

Python 2 , 57 bayt

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

Çevrimiçi deneyin!

Ayrıca 57:

Python 2 , 57 bayt

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

Çevrimiçi deneyin!


Arkasındaki mantığını açıklayabilir misin len(s[:i][:n])? Bu numarayı almanın daha kısa bir yolu olduğuna ikna oldum ama nasıl yapılacağından emin değilim.
musicman523

Boş ver, anladım! Ama bir bayt daha kısa min(len(s),i,n). İyi iş!
musicman523

6

JavaScript (ES6), 67 65 bayt

-2 sayesinde bayt Chas Brown'ın kısa yöntem kullanılarak min().

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

Tımar sözdiziminde girişi Alır: f("abalone")(3).

Test Parçacığı

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>


6

Jöle , 8 7 bayt

J««U$⁸x

Çevrimiçi deneyin!

Nasıl çalışır

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

@LeakyNun sayesinde -1 bayt


@LeakyNun bulmak iyi! Bu yönde en yakın J«¥@«U$x@9 bayt için var.
fireflame241

Açıklama lütfen?
SparklePony Yoldaş

@ fireflame241 genel olarak, ( burada kullandım ) x@⁸ile eşdeğerdir⁸x
Leaky Nun

2

Haskell , 61 60 bayt

@Laikoni'ye 1 baytın tıraş olmasına yardım ettiği için teşekkürler

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

Çevrimiçi deneyin!

Ungolfed:

(#) n string = do
    (i, char) <- zip [1..] string
    replicate (minimum [n, i, length(string)-i+1]) char

Büyük bir doblok kullanımı ! Parantezini bırakarak bir bayt kaydedin length(s).
Laikoni


1

J, 24 bayt

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

Parens - (<.&n<./(|.,:[)>:i.#s)- içindeki bit 1 2 ... n n n ... 2 1diziyi şu şekilde oluşturur:

                   #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

bir kez elimize geçtikten sonra, J #operatörü her bir elemanı belirtilen sayıda kopyalayarak otomatik olarak istenen şeyi yapar.

Bir J uzmanının bu konudaki gelişmesini görmek meraklı ...


23 bayt oldukça farklı bir yaklaşımla [#~#@[$([:>:<:,&:i.-)@](belki orada bir boşluk kalmış). Kancanın neden alamadığı xama bakım için çok fazla pozisyonda olmadığım için bir kayıptayım.
cole


1

Japt , 11 10 bayt

ËpVm°TEnUÊ

Dene


açıklama

Kapalı dize Uve tamsayı girişi V.

Ë

Eşleyin Uve her karakteri değiştirin.

Vm

Minimum olsun V, ...

°T

T(başlangıçta 0) 1 artırıldı, ...

EnUÊ

Ve geçerli karakterin ( E) dizini n, uzunluğundan ( Ê) çıkarılır U.

p

Mevcut karakteri birçok kez tekrarlayın.

Son dizgiyi dolaylı olarak çıktılar.



0

Python 2 68 bayt

f=lambda s,n:''.join(s[i]*min(i+1,len(s)-i,n)for i in range(len(s)))

Cevapta ihtiyacınız yok f=; işlev anonim olabilir. Bunu akılda tutarak, 3 bayt ile kaldırabilirsiniz lambda s,n:''.join(c*min(i+1,len(s)-i,n)for i,c in enumerate(s)).
notjagan

0

Kabuk , 10 9 bayt

₁₁ṀR
↔z↑N

Çevrimiçi deneyin!

İlk satır ana işlevdir, her harfi n kez tekrarlar ve sonra ikinci satırı iki kez çağırır.

İkinci satır, her yinelenen harf grubundan en fazla N harfi alır; burada N, grubun 1 tabanlı dizinidir, ardından listeyi tersine çevirir.



0

APL (Dyalog) , 15 bayt

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

{} Sol bağımsız değişken (cap) ve sağ bağımsız değişken (string) function :

≢⍵ dizedeki karakter sayısını say

 o kadar çok te nteger

i←bende  sakla

 ters

i⌊i  ile ikili minimum

⍺⌊ kapakla minimum çift olarak

⍵/⍨ dizenin harflerini çoğaltmak için bu sayıları kullanın

Çevrimiçi deneyin!




0

Abalone bir balık türüdür (kabuklu deniz hayvanı), bu yüzden…

> <> , 79 bayt

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

Çevrimiçi deneyin veya balık oyun alanında izleyin !

Dizeyi STDIN'den okur ve numaranın zaten yığın üzerinde olduğunu varsayar.

Açıklama: İkinci, dördüncü ve altıncı çizgiler ana döngülerdir. Ayrıntılar bazı çirkin yığın manipülasyonudur, ancak geniş satırlarda, ilk olarak, ikinci satır, bir giriş karakteri ve min ( in ) arasında değişen yığını doldurur; burada n , uzunluk sınırıdır ve i , karakterin dizinidir. giriş: "abalone", 3 için, yığın

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

Daha sonra, 4. satır sağ ucun düzgün bir şekilde kapatılmasını sağlamak için yığının tersi yönde aynı şekilde gider:

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

Sonra altıncı satır her karakter-sayı çiftini alır ve karakteri sayı kadar yazdırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.