N番目の要素を繰り返します


18

しばらくの間(正確には5日間)質問がありませんでしたので、1つに行きましょう。

文字列sと正の整数を指定するとn、のすべてのn要素を取得しs、それをn繰り返し、に戻しsます。

たとえば、n = 3およびの場合、s = "Hello, World!"3文字ごとにですHl r!。次に、各文字を繰り返してnを生成しHHHlll rrr!!!ます。次に、元の文字を繰り返しバージョンに置き換えて、最終製品を作成しますHHHellllo, Worrrld!!!

あなたの言語で可能な限り短いコードでこのタスクを達成することです!

ルール

  • これはので、バイト単位の最短コードが勝ちます
  • nの長さより小さくs、0より大きいことが保証されています
  • の最初の文字sは、nth番目の文字の取得元であり、常に繰り返されnます
  • sのみ(コードポイントを、印刷可能なASCII文字からなるであろう0x20 (space)0x7E (~)

テストケース

s, n => output

"Hello, World!", 3 => "HHHellllo,   Worrrld!!!"
"Code golf", 1 => "Code golf"
"abcdefghijklm", 10 => "aaaaaaaaaabcdefghijkkkkkkkkkklm"
"tesTing", 6 => "ttttttesTingggggg"
"very very very long string for you to really make sure that your program works", 4 => "vvvvery    veryyyy verrrry loooong sssstrinnnng foooor yoooou toooo reaaaally    makeeee surrrre thhhhat yyyyour    proggggram    workkkks"

入力sを文字配列として取得できますか?
ケビンCruijssen

2
「」に戻しますs <-これは厳密な要件(元の文字列を上書きする)ですか、それとも最終結果を出力するだけでいいですか?
フェリックスパルメン

@KevinCruijssenはい、できます
ケアニアンコイリンガリング

1
@FelixPalmenそれは単に私がそれを説明した方法でした。任意の方法を使用できます
caird coinheringaahing

@cairdcoinheringaahing良い、ありがとう、すでにそれをしました。
フェリックスパルメン

回答:


10

ゼリー、3バイト

Ḣs×

入力はs、nとして取得されます。

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

使い方

Ḣs×  Main link. Argument: s, n

Ḣ    Head; yield s.
     This pops the list, leaving [n] as the main link's argument.
 s   Split s into chunks of length n.
  ×  Multiply each chunk by [n], repeating its first element n times.

UTF-8エンコーディングでは実際には6バイトではありませんか?E1 B8 A2 73 C3 97
CoDEmanX

5
UTF-8では、はい。ただし、Jellyはカスタムコードページを使用します。Jellyが理解する各文字は1バイトのみを使用します。
デニス

7

ゼリー 6  5 バイト

リーキーな修道女のおかげで-1バイト(Pythonの文字列乗算を使用します。)

×Jm¥¦

完全なプログラム。2つのコマンドライン引数、文字列と数値を受け入れ、結果を出力します。

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

どうやって?

×Jm¥¦ - Main link: list of characters, s; number, n   e.g. ['g','o','l','f','e','r'], 2
    ¦ - sparse application:
   ¥  - ...to indices: last two links as a dyad:
 J    -      range of length of s                          [1,2,3,4,5,6]
  m   -      modulo slicing by n (every nth entry)         [1,3,5]
×    - ...action: multiply  ["gg",'o',"ll",'f',"ee",'r']
      - implicit print                                 >>> ggollfeer


うんx忘れてしまった×; ありがとう。
ジョナサンアラン

UTF-8エンコーディングでは実際には8バイトではありませんか?C3 97 4A 6D C2 A5 C2 A6
CoDEmanX

2
@CoDEmanXはゼリーのカスタム使用コードページを
MD XF

@MDXF守備に感謝します!
ジョナサンアラン

4

JavaScript(ES6)、46バイト

カリー化構文の入力を受け取ります(s)(n)

s=>n=>s.replace(/./g,(c,i)=>c.repeat(i%n?1:n))

テストケース




3

05AB1E8 7バイト

@Emignaのおかげで-1バイト

ôʒć²×ì?

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

説明

ôʒć²×ì?    Arguments s, n  ("Hello, World!", 3)
ô          Split s into pieces of n  (["Hel", "lo,", ...])
 ʒ         Filter (used as foreach)
  ć          Extract head  ("Hel" -> "el", "H" ...)
   ²×ì       Repeat n times and prepend  ("el", "H" -> "HHHel" ...)
      ?      Print without newline

でバイトを保存ôʒć²×ì?
エミグナ

@Emignaありがとう、クロージングをなくす方法があるはずだと知っていました}
-kalsowerus

それは結果を使用していないが、それは実際に違いを作るフィルタの奇妙な使用...
マジックタコ壺

@ MagicOctopusUrn、yepフィルターは05AB1E
kalsowerus

@kalsowerus vyはforeachでεあり、もう1つです。奇妙なことに、ε機能しません。
魔法のタコUr

2

PowerShell、51バイト

param($a,$n)-join($a|%{($_,("$_"*$n))[!($i++%$n)]})

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

入力をchar-array $aおよびnumber として受け取ります$n。ループし$a、各反復で、現在の文字$_または$n擬似文字列へのインデックスに基づいてを乗算した現在の文字を出力します。インデックスは、増分$iとモジュロに基づいて2つから選択します$n。これらの文字は-join一緒に戻され、文字列はパイプラインに残ります。出力は暗黙的です。



2

アリス、25バイト

/
KI /!Iw?&.?t&O?&wWOI.h%

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

説明

/         Switch to Ordinal.
I         Read first line of input (i.e. n).
/         Switch to Cardinal.
!         Convert input to its integer value and store it on the tape.
I         Read first character from input string.
w         Push current IP address onto the return address stack. This
          effectively marks the beginning of the main loop.

  ?         Retrieve n.
  &.        Duplicate current character n times (once more than we need,
            but who cares about a clean stack...).
  ?t        Retrieve n and decrement.
  &O        Output n-1 copies of the current character.
  ?         Retrieve n.
  &w        Push the current IP address onto the return address stack n
            times. This marks the beginning of a loop that is executed n 
            times.

    W         Discard one copy of the return address from the stack,
              effectively decrementing the loop counter.
    O         Output the last character. On the first iteration, this is
              the final copy of the repeated character, otherwise it's just
              the single character we read on the last iteration.
    I         Read a character for the next iteration.
    .h%       Compute c % (c+1) on that character, which is a no-op for
              for valid characters, but terminates the program at EOF when
              c becomes -1.

K         Jump to the address on top of the return address stack. As long
          as there are still copies of the address from the inner loop, we
          perform another iteration of that, otherwise we jump back to the
          beginning of the outer loop.

2

R82 76 75バイト

function(s,n)cat(rep(S<-el(strsplit(s,'')),c(n,rep(1,n-1))+!seq(S)),sep='')

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

機能; 文字列sと整数を受け取り、n繰り返しバージョンを標準出力に出力します。

説明:

function(s,n){
 S <- el(strsplit(s,""))                  # characters
 r     <- c(n,rep(1,n-1))                 # [n, 1, 1,...,1], length n
 repeats <- r+!seq(S)                     # extends R to length of S
 cat(rep(S, repeats), sep="")             # print out
}

R、55バイト

function(S,n)cat(rep(S,c(n,rep(1,n-1))+!seq(S)),sep="")

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

上記と同じアルゴリズムですがS、個々の文字のリストとして使用されます。




1

Japt、8バイト

ËùDV*EvV

オンラインでテストしてください!

説明

 Ë    ùDV*EvV
UmDE{DùDV*EvV}   Ungolfed
                 Implicit: U = s, V = n
UmDE{        }   Replace each char D and (0-)index E in U by this function:
          EvV      Take 1 if the index is divisible by V; 0 otherwise.
        V*         Multiply this by V. This gives V for every Vth index; 0 for others.
     DùD           Pad D with itself to this length. This gives V copies of D for every
                   Vth index; 1 copy of D for others.
                 Implicit: output last expression

ここで@Shaggyの答えに使用ùするアイデアを信用しなければなりません。私は自分でそれを考えたことがあるのか​​わかりません...


これで、文字列のパディングが追加されるのを見たいと思った理由がわかりました。私はë、うんちや笑いのために、何かを働かせようとしていましたが、惨めに失敗しました!
シャギー

1

J、17バイト

(#@]$[,1#~<:@[)#]
  • (...) # ]括弧内のすべてが、Jに組み込まれた「コピー」動詞の文字列を作成します。したがって、たとえば、左の引数が3の場合、文字列を含む3 1 1右のargの文字数に等しくなるように、必要に応じて繰り返される文字列を作成]します。つまり、#正しい左引数を与えることができると仮定して、問題を直接解決します:繰り返す4必要があります4 1 1 1
  • 調べてみる#@]$[,1#~<:@[$、真ん中にJの形の動詞が使われていることがわかります。これがこのフレーズの主な動詞です...
  • $is の左は#@]#右引数の長さを意味し]ます。
  • の右側に$[,1#~<:@[、5動詞列があります。最初に実行される列車は...
  • 1#~<:@[、左の引数#~より1つ少ない1つのコピー(コピーの受動形式)を意味します<:[ます。この結果は最終的なフォークに渡されます:
  • [, ...つまり、左の引数を取り、計算した結果を追加します1。これはsの文字列です。

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


]#~[^0=(|i.@#)14バイト
マイル

それは非常に賢いです。私の投稿に対するあなたの改善は、私にとってこのサイトの最高の部分です。
ジョナ


1

Perlの5、37、29 +1(-p)バイト

トムのコメントのおかげで-8バイト。

$n=<>;s/./"@-"%$n?$&:$&x$n/ge

オンラインで試す


今より良いアプローチを考えるが、私はいくつかのアイデアを思い付いたことはできません。$n=<>;代わりにBEGINブロックし、持っているn入力の次の行に置き換えると$-[0]して"@-"唯一の最初の数字は比較して評価されているので。また、nviaの入力を取る場合、宣言して-i使用する$^I代わりに使用することができます$nが、これは非標準なので飛ぶことはありません... :)
Dom Hastings

1

6502マシンコードルーチン、50バイト

A0 01 84 97 88 84 9E 84 9F B1 FB F0 20 A4 9F 91 FD C6 97 D0 10 A6 FF CA F0
05 C8 91 FD D0 F8 84 9F A5 FF 85 97 E6 9E A4 9E E6 9F D0 DC A4 9F 91 FD 60

これは位置に依存しないサブルーチンで、$fb/ の入力文字列(0で終わるC文字列)$fcへのポインタ、$fd/ の出力バッファへのポインタ、$feおよびのcount(n)を必要とし$ffます。単純なインデックスを使用するため、8ビットアーキテクチャにより、最大出力長が255文字(+ 0バイト)に制限されています。

説明(コメント付きの分解):

 .rep:
A0 01       LDY #$01            ; init counter to next repetition sequence
84 97       STY $97
88          DEY                 ; init read and write index
84 9E       STY $9E             ; (read)
84 9F       STY $9F             ; (write)
 .rep_loop:
B1 FB       LDA ($FB),Y         ; read next character
F0 20       BEQ .rep_done       ; 0 -> finished
A4 9F       LDY $9F             ; load write index
91 FD       STA ($FD),Y         ; write next character
C6 97       DEC $97             ; decrement counter to nex rep. seq.
D0 10       BNE .rep_next       ; not reached yet -> next iteration
A6 FF       LDX $FF             ; load repetition counter
 .rep_seqloop:
CA          DEX                 ; and decrement
F0 05       BEQ .rep_seqdone    ; if 0, no more repetitions
C8          INY                 ; increment write index
91 FD       STA ($FD),Y         ; write character
D0 F8       BNE .rep_seqloop    ; and repeat for this sequence
 .rep_seqdone:
84 9F       STY $9F             ; store back write index
A5 FF       LDA $FF             ; re-init counter to next ...
85 97       STA $97             ; ... repetition sequence
 .rep_next:
E6 9E       INC $9E             ; increment read index
A4 9E       LDY $9E             ; load read index
E6 9F       INC $9F             ; increment write index
D0 DC       BNE .rep_loop       ; jump back (main loop)
 .rep_done:
A4 9F       LDY $9F             ; load write index
91 FD       STA ($FD),Y         ; and write terminating0-byte there
60          RTS                 ; done.

それを使用したC64マシンコードプログラムの例

これは、このルーチンを使用したC64用のca65スタイルのアセンブラーのプログラムです(としてインポートされますrep)。

REP_IN          = $fb
REP_IN_L        = $fb
REP_IN_H        = $fc

REP_OUT         = $fd
REP_OUT_L       = $fd
REP_OUT_H       = $fe

REP_N           = $ff

.import         rep


.segment "LDADDR"
                .word   $c000

.code
                jsr     $aefd           ; consume comma
                jsr     $ad9e           ; evaluate expression
                sta     REP_IN_L        ; store string length
                jsr     $b6a3           ; free string
                ldy     #$00            ; loop over string
readloop:       cpy     REP_IN_L        ; end of string?
                beq     termstr         ; then jump to 0-terminate string
                lda     ($22),y         ; read next character
                sta     in,y            ; store in input buffer
                iny                     ; next
                bne     readloop
termstr:        lda     #$00            ; load 0 byte
                sta     in,y            ; store in input buffer

                jsr     $b79b           ; read 8bit unsigned int
                stx     REP_N           ; store in `n`
                lda     #<in            ; (
                sta     REP_IN_L        ;   store pointer to
                lda     #>in            ;   to input string
                sta     REP_IN_H        ; )
                lda     #<out           ; (
                sta     REP_OUT_L       ;   store pointer to
                lda     #>out           ;   output buffer
                sta     REP_OUT_H       ; )
                jsr     rep             ; call function

                ldy     #$00            ; output result
outloop:        lda     out,y
                beq     done
                jsr     $ffd2
                iny
                bne     outloop
done:           rts


.bss
in:             .res    $100
out:            .res    $100

オンラインデモ

使用法: sys49152,"[s]",[n]、例えばsys49152,"Hello, World!",3

重要:プログラムがディスクからロードされた場合(オンラインデモのように)、new最初にコマンドを発行してください!これは、マシンプログラムをロードするとC64 BASICポインターが一部破壊されるために必要です。


1

Javaの8、100の、76バイト

s->n->{int i,k=0;for(char c:s)for(i=k++%n<1?n:1;i-->0;)System.out.print(c);}

@OliverGrégoireのおかげで-24バイト。

説明:

ここで試してみてください。

s->n->{                    // Method with char-array and int parameters and no return-type
  int i,k=0;               //  Index-integers
  for(char c:s)            //  Loop (1) over the characters of the input array
    for(i=k++%n<1?         //   If `k` is divisible by the input `n`:
         n                 //    Change `i` to `n`
        :                  //   Else:
         1;                //    Change `i` to 1
        i-->0;)            //   Inner loop (2) from `i` down to 0
      System.out.print(c); //    And print the current character that many times
                           //   End of inner loop (2) (implicit / single-line body)
                           //  End of loop (1) (implicit / single-line body)
}                          // End of method

おっと、提出物がすでにあるとは思わなかったので、削除しました。76バイトに短縮された:(。ではなく、n->s->{int i,k=0;for(char c:s)for(i=k++%n<1?n:1;i-->0;)System.out.print(c);}a char[]を使用String
オリビエグレゴワール

経験則として、返される文字列を1つだけ宣言する必要がある場合は、印刷するだけで短くなります。
オリビエグレゴワール

@OlivierGrégoireおっと。はい、私はその経験則を知っています。今回はそれを適用するのを忘れました。そして、保存されたバイトに感謝します!
ケビンCruijssen

1

MATL10 7バイト

ルイスメンドーのおかげで3バイト!

tq:ghY"

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

入力を受け取りn、次いで、Sストリング/ char配列として。

    % (implicit input)
    % stack: n
t   % duplicate
    % stack: n n
q   % decrement
    % stack: n n-1
:   % range
    % stack: n [1 2 ... n-1]
g   % convert to logical (nonzero->1, zero->0)
    % stack: n [1 1 ... 1]
h   % horizontal concatenate
    % stack: [n 1 1 ... 1]
Y"  % run-length decoding, taking the string as first input and recycling 
    % the lengths [n 1 1 ... 1] as needed
    % (implicit output as string)


1

Haskell51 46バイト

@ Laikoni、5バイト節約してくれてありがとう!

n&s=do(m,c)<-zip[0..]s;c<$[0..(n-1)*0^mod m n]

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

説明/ゴルフなし

オペレータはc <$ [a..b]、リストの各要素を置き換える[a,a+1...b]ことにより、c-それはちょうどgolfedですのでreplicate

do(m,c)<-zip[0..]s;                                  -- with all (m,c) in the enumerated ([(0,a),(1,b)..]) input string, replace with
                   replicate (1 + (n-1)*0^mod m n) c -- either n or 1 times the character c (note that the list begins with 0, that's where the 1+ comes from)


0

V、13バイト

"aDJòylÀpÀll

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

これは本当に馬鹿げた回避策です。òlhÀälÀlÀ<M-->l動作するはずですが、私は私の人生は、手動で行う、特に以来、理由を理解することができないためにlhÀälÀlÀ<M-->l時間の束を繰り返し行います仕事を。

Hexdump:

00000000: 1822 6144 4af2 796c c070 c06c 6c         ."aDJ.yl.p.ll

説明:

<C-x>               " Decrement the number
       D            " Delete that number...
     "a             "   Into register 'a'
        J           " Remove the blank line
         ò          " Recursively...
          yl        "   Yank the letter under the cursor
            Àp      "   And paste it 'a' times
              Àl    "   Move 'a' times to the right ('l' for right)
                l   "   Move to the right one more time
                    " (implicit) end the loop

'l' for right...それはVimの持ち越しだと思いますか?そうでなければ... なぜ
AdmBorkBork

2
@AdmBorkBorkええl、vimにぴったりです。正書法で逆向きの場合もありますlが、幾何学的には正しいです。これは中央の行の右端の文字キーです。
ジョナ

@DJMcMayhemそうです。私は正しかった。
ジョナ


0

Python 3、58バイト

ゴルフダウンに取り組んでいます。

他のPythonの回答が既にあることは知っていますが、ラムダではなく完全な機能であるにもかかわらず、他のPythonの回答に比べてかなり良いスコアを示しているので、この回答も投稿すると思いました。

入力を関数パラメーターとして受け取り、に出力しSTDOUTます。

def f(s,n,i=0):
 for c in s:print(end=[c,c*n][i%n<1]);i+=1

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

1バイト少ない(57)ために、ラムダをコーディングしましたが、他のユーザーによって同様の回答が既に投稿されています。

lambda s,n:''.join([c,c*n][i%n<1]for i,c in enumerate(s))




0

K(oK)23 19バイト

解決:

{,/(1|y*~y!!#x)#'x}

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

例:

> {,/(1|y*~y!!#x)#'x}["Hello, World!";3]
"HHHellllo,   Worrrld!!!"
> {,/(1|y*~y!!#x)#'x}["Code golf";1]
"Code golf"
> {,/(1|y*~y!!#x)#'x}["abcdefghijklm";10]
"aaaaaaaaaabcdefghijkkkkkkkkkklm"

説明:

{,/(1|y*~y!!#x)#'x} / the solution
{                 } / lambda function with x and y as implicit parameters
   (          )     / do everything in brackets together
            #x      / count x, #"Hello, World!" -> 13
           !        / til, !13 -> 0 1 2 3 4 5 6 7 8 9 10 11 12
         y!         / y modulo, 3!0 1 2 3 4 5 6 7 8 9 10 11 12 -> 0 1 2 0 1 2 0 1 2 0 1 2 0
        ~           / not, ~0 1 2 0 1 2 0 1 2 0 1 2 0 -> 1 0 0 1 0 0 1 0 0 1 0 0 1
      y*            / multiply by y, 3*1 0 0 1 0 0 1 0 0 1 0 0 1 -> 3 0 0 3 0 0 3 0 0 3 0 0 3
    1|              / min of 1 and, 1|3 0 0 3 0 0 3 0 0 3 0 0 3 -> 3 1 1 3 1 1 3 1 1 3 1 1 3
                #'x / take each parallel, 1 2 3#'"abc" -> "a", "bb", "ccc"
 ,/                 / flatten the list, "a", "bb", "ccc" -> "abbccc"

ノート:

  • 異なるアプローチで-4バイト

0

Excel VBA、71バイト

範囲から入力[A1:B1]を受け取り、VBEイミディエイトウィンドウに出力する匿名VBEイミディエイトウィンドウ関数。

For i=1To[Len(A1)]:[C1]=i:?[Rept(Mid(A1,C1,1),B1^(Mod(C1,B1)=1))];:Next
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.