キャップ付きストリングラダー


12

文字列を考えるsと、正の整数N、徐々にまで、より多くの各文字を複製しN、重複した後に滞在Nするまで、重複N離れた端から文字、再びステップダウン。

例えば、与えられたabalone3

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

結果はになりますabbaaalllooonne

文字列の長さは以上で2N、からaまでの文字のみであることが保証されていますz

その他のテストケース:

N string       output
2 aaaaa        aaaaaaaa
3 abcdabcdabcd abbcccdddaaabbbcccdddaaabbbccd

これはです。バイト単位の最短回答が優先されます。標準の抜け穴が適用されます。

回答:


11

ゼリー、6バイト

JṡFṢị⁸

オンラインでお試しください!

使い方

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.

サンプル実行

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
そのsplit + flatten + sortメソッドは純粋な天才です。いいね!:)
HyperNeutrino

7

Python 2、57バイト

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

オンラインでお試しください!

また57:

Python 2、57バイト

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

オンラインでお試しください!


背後にあるロジックを説明できますlen(s[:i][:n])か?私はその数を得るためのより短い方法があると確信していますが、どうすればいいのか分かりません。
musicman523

気にしないで、私はそれを得た!しかし、それは1バイトよりも短いですmin(len(s),i,n)。よくやった!
musicman523

6

JavaScript(ES6)、67 65バイト

- を使用したChas Brownの短い方法のおかげで-2バイトmin()

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

カリー化構文の入力を受け取りますf("abalone")(3)

テストスニペット

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

ゼリー8 7バイト

J««U$⁸x

オンラインでお試しください!

使い方

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のおかげで-1バイト


@LeakyNunを見つけてください!その方向に最も近いのJ«¥@«U$x@は9バイトです。
fireflame241

説明してください?
同志SparklePony

@ fireflame241 genenrally、x@⁸equivallentであると⁸x(私が使用ここ)
漏れ修道女


1

Haskell(Lambdabot)、74バイト

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

オンラインでお試しください!


インポートはスコアにカウントされます!あなたがより良いだろう>>=id
-bartavelle

ええ、私も前にそれをやったので、これを見ました(そのため、括弧内にLambdabotがあります)。正しい方法は何ですか?
ბიმო

私は訂正します、これは大丈夫だと思います!
-bartavelle

そのリストには非常に便利なインポートがたくさんあります。
ბიმო

1

J、24バイト

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

括弧内のビットは、次のように配列を(<.&n<./(|.,:[)>:i.#s)作成1 2 ... n n n ... 2 1します。

                   #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

それが得られると、Jの#演算子は要求されたとおりに正確に自動的に実行し、指定された回数だけ各要素を複製します。

これに関するJ専門家の改善を見てみたい...


全く異なるアプローチで23バイト[#~#@[$([:>:<:,&:i.-)@](おそらくそこに浮遊スペースが入り込んだ)。フックが取ってxいないが、気にするほどの位置にない理由について私は途方に暮れています。
コール


1

Japt11 10バイト

ËpVm°TEnUÊ

試して


説明

string Uおよびintegerの暗黙的な入力V

Ë

マップしUてすべての文字を置き換えます。

Vm

の最小値を取得V...

°T

T(最初に0)1ずつ増加...

EnUÊ

そして現在の文字のインデックス(E)から(n)の長さ(Ê)を引いたU

p

現在の文字を何回も繰り返します。

最終的な文字列を暗黙的に出力します。



0

Python 2 68バイト

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

あなたはf=答えに必要はありません。関数は匿名にすることができます。それを念頭に置いて、で3バイトを削除できますlambda s,n:''.join(c*min(i+1,len(s)-i,n)for i,c in enumerate(s))
-notjagan

0

10 9バイト

₁₁ṀR
↔z↑N

オンラインでお試しください!

最初の行はメイン関数であり、各文字をn回繰り返し、2番目の行を2回呼び出します。

2行目は、繰り返される文字の各グループから最大でN文字を取ります。ここで、Nはグループの1から始まるインデックスで、リストを逆にします。



0

APL(Dyalog)、15バイト

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

{} 左引数(cap)がで右引数(string)がwhereである関数

≢⍵ 文字列の文字数を数えます

 多くのɩ整数を生成する

i←私に  保管

 逆

i⌊i  とのペアワイズ最小

⍺⌊ キャップ付きペアワイズ最小

⍵/⍨ これらの数字を使用して、文字列の文字を複製します

オンラインでお試しください!




0

アワビは魚の一種(まあ、貝)なので、…

> <>、79バイト

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

オンライン試してみるか、魚の遊び場で見てください

STDINから文字列を読み取り、番号が既にスタックにあると想定します。

説明:2行目、4行目、および6行目がメインループです。詳細はsomeいスタック操作ですが、大まかに言えば、最初に2行目が入力の文字とmini、  n)の間で交互にスタックを埋めます。ここで、nは長さのキャップで、iは文字のインデックスです入力:「アワビ」の場合、3、スタックは次のようになります

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

次に、4行目も同じようにスタックを逆方向に通過し、右端に適切なキャップが付けられます。

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

次に、6行目は各文字と数字のペアを取得し、数字と同じ回数だけ文字を出力します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.