Lặp lại các yếu tố thứ N


18

Chúng tôi đã không có một câu hỏi trong một thời gian (chính xác là 5 ngày), vì vậy hãy đi cho một câu hỏi.

Cho một chuỗi svà một số nguyên dương n, lấy mọi nphần tử của s, lặp lại nlần đó và đặt lại vào s.

Ví dụ, nếu n = 3s = "Hello, World!", mỗi ký tự thứ ba là Hl r!. Sau đó, bạn lặp lại từng nlần nhân vật để sản xuất HHHlll rrr!!!. Sau đó, bạn thay thế các chữ cái ban đầu bằng các phiên bản lặp lại để tạo ra sản phẩm cuối cùng củaHHHellllo, Worrrld!!!

Bạn phải hoàn thành nhiệm vụ này với mã ngắn nhất có thể trong ngôn ngữ của bạn!

Quy tắc

  • Đây là một để mã ngắn nhất tính bằng byte sẽ thắng
  • nđược đảm bảo nhỏ hơn chiều dài svà lớn hơn 0
  • Ký tự đầu tiên slà nơi các nký tự được lấy từ và luôn được lặp lại nhiều nlần
  • ssẽ chỉ bao gồm ASCII có thể in (mã trỏ 0x20 (space)đến 0x7E (~))

Các trường hợp thử nghiệm

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"

Chúng ta có thể lấy đầu vào slà một mảng ký tự không?
Kevin Cruijssen

2
" Và đưa nó trở lại vàos " <- đây có phải là một yêu cầu nghiêm ngặt (ghi đè chuỗi gốc) hay không, chỉ cần xuất ra kết quả cuối cùng?
Felix Palmen

@KevinCruijssen Có bạn có thể
caird coinheringaahing

1
@FelixPalmen chỉ đơn giản là cách tôi giải thích nó. Bạn có thể sử dụng bất kỳ phương pháp nào bạn muốn
caird coinheringaahing

@cairdcoinheringaahing tốt, cảm ơn, đã làm điều đó.
Felix Palmen

Câu trả lời:


10

Thạch , 3 byte

Ḣs×

Đầu vào được lấy là s, n .

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ḣ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.

Nó không thực sự là 6 byte trong mã hóa UTF-8? E1 B8 A2 73 C3 97
CoDEmanX

5
Trong UTF-8, có. Tuy nhiên, Jelly sử dụng một trang mã tùy chỉnh , trong đó mỗi ký tự mà nó hiểu chỉ chiếm một byte duy nhất.
Dennis

7

Thạch ,  6  5 byte

-1 byte nhờ vào Nun bị rò rỉ (sử dụng phép nhân chuỗi của Python.)

×Jm¥¦

Một chương trình đầy đủ, chấp nhận hai đối số dòng lệnh, chuỗi và số và in kết quả.

Hãy thử trực tuyến!

Làm sao?

×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


Yep đã cố xquên ×; cảm ơn.
Jonathan Allan

Nó không thực sự là 8 byte trong mã hóa UTF-8? C3 97 4A 6D C2 A5 C2 A6
CoDEmanX

2
@CoDEmanX Sử dụng trang mã
MD XF

@MDXF cảm ơn vì đã bảo vệ!
Jonathan Allan

4

JavaScript (ES6), 46 byte

Đưa đầu vào theo cú pháp currying (s)(n).

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

Các trường hợp thử nghiệm




3

05AB1E , 8 7 byte

-1 byte nhờ @Emigna

ôʒć²×ì?

Hãy thử trực tuyến!

Giải trình

ôʒć²×ì?    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

Lưu một byte vớiôʒć²×ì?
Emigna

@Emigna cảm ơn, tôi biết phải có cách để thoát khỏi việc đóng cửa}
kalsowerus

Việc sử dụng bộ lọc kỳ lạ khi nó không sử dụng kết quả nhưng nó thực sự tạo ra sự khác biệt ...
Bạch tuộc ma thuật Urn

@MagicOctopusUrn, bộ lọc yep vẫn là bộ lọc tốt hơn trong 05AB1E
kalsowerus

@kalsowerus vylà một foreach, εlà một cái khác. Thật kỳ lạ, εkhông làm việc.
Bạch tuộc ma thuật Urn

2

PowerShell , 51 byte

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

Hãy thử trực tuyến!

Lấy đầu vào là một char-array $avà số $n. Các vòng lặp thông qua $avà mỗi lần lặp hoặc xuất ra chữ cái hiện tại $_hoặc chữ cái hiện tại nhân với $n, dựa trên một chỉ mục thành một giả ba chiều. Chỉ số chọn giữa hai dựa trên tăng dần $ivà sau đó modulo $n. Những chữ cái sau đó được -joined lại với nhau và chuỗi được để lại trên đường ống; đầu ra là ẩn.



2

Alice , 25 byte

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

Hãy thử trực tuyến!

Giải trình

/         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

R , 82 76 75 byte

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

Hãy thử trực tuyến!

Một chức năng; lấy một chuỗi svà một số nguyên nvà in phiên bản lặp lại thành thiết bị xuất chuẩn.

Giải trình:

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 byte

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

Hãy thử trực tuyến!

Thuật toán tương tự như trên, nhưng Sđược lấy làm danh sách các ký tự riêng lẻ.




1

Japt , 8 byte

ËùDV*EvV

Kiểm tra nó trực tuyến!

Giải trình

 Ë    ù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

Tôi phải ghi nhận ý tưởng sử dụng ùđể trả lời của @Shaggy ở đây . Tôi không biết rằng tôi đã từng nghĩ về nó ...


Bây giờ bạn thấy tại sao rất muốn xem phần đệm chuỗi được thêm vào :) Giải pháp hay. Tôi đã cố gắng để có được một cái gì đó để làm việc với ë, cho các nhà thơ và cười khúc khích, nhưng thất bại thảm hại!
Xù xì

1

J, 17 byte

(#@]$[,1#~<:@[)#]
  • (...) # ]mọi thứ trong parens tạo ra chuỗi cho động từ "copy" được xây dựng trong J. Vì vậy, ví dụ, nếu đối số bên trái là 3, nó tạo ra chuỗi được 3 1 1lặp lại khi cần để bằng số lượng ký tự trong đối số bên phải ], chứa chuỗi. Có nghĩa là, #giải quyết vấn đề trực tiếp, giả sử chúng ta có thể đưa ra cho nó đối số bên trái chính xác: 4nên được 4 1 1 1lặp lại, v.v.
  • Kiểm tra #@]$[,1#~<:@[, chúng tôi thấy nó sử dụng động từ hình dạng J $ở giữa - đó là động từ chính của cụm từ này ...
  • Ở phía bên trái của $#@], có nghĩa là độ dài #của arg đúng ].
  • Ở bên phải $[,1#~<:@[, một động từ 5 động từ. Chuyến tàu đầu tiên được thực hiện là ...
  • 1#~<:@[, có nghĩa là 1 bản sao #~(dạng bị động của bản sao) ít hơn một bản sao <:trái [. Kết quả này được chuyển đến ngã ba cuối cùng:
  • [, ...nghĩa là lấy đối số bên trái và nối kết quả mà chúng ta vừa tính, đó là một chuỗi 1s.

Hãy thử trực tuyến!


]#~[^0=(|i.@#)14 byte
dặm

Điều đó khá thông minh. Cải thiện của bạn cho bài viết của tôi là phần tốt nhất của trang web này đối với tôi.
Giô-na


1

Perl 5, 37 , 29 +1 (-p) byte

-8 byte nhờ bình luận của Tom.

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

Dùng thử trực tuyến


Không thể nghĩ ra một cách tiếp cận tốt hơn ngay bây giờ, nhưng tôi đã nảy ra một vài ý tưởng: $n=<>;thay vì BEGINkhối và có ndòng đầu vào tiếp theo và thay thế $-[0]bằng "@-"vì chỉ có số đầu tiên được đánh giá so sánh. Ngoài ra, nếu bạn nhận đầu vào nqua, -ibạn chỉ có thể sử dụng $^Ithay vì khai báo và sử dụng $n, nhưng vì điều này là không chuẩn nên nó có thể không bay ... :)
Dom Hastings

1

Mã máy 6502 trình , 50 byte

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

Đây là một chương trình con độc lập với vị trí mong đợi một con trỏ tới chuỗi đầu vào (0 chấm dứt hay còn gọi là chuỗi C) trong $fb/ $fc, một con trỏ tới bộ đệm đầu ra trong $fd/ $fevà đếm (n ) trong $ff. Nó sử dụng lập chỉ mục đơn giản, do đó, nó bị giới hạn ở độ dài đầu ra tối đa 255 ký tự (+ 0 byte) do kiến ​​trúc 8 bit.

Giải thích (nhận xét tháo gỡ):

 .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.

Ví dụ chương trình mã máy C64 sử dụng nó :

Đây là một chương trình trong trình biên dịch kiểu ca65 cho C64 bằng cách sử dụng thường trình này (được nhập dưới dạng 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

Bản demo trực tuyến

Sử dụng: sys49152,"[s]",[n] , ví dụ:sys49152,"Hello, World!",3

Quan trọng: Nếu chương trình được tải từ đĩa (như trong bản demo trực tuyến), newtrước tiên hãy ra lệnh! Điều này là cần thiết bởi vì tải một chương trình máy bỏ qua một số con trỏ C64 BASIC.


1

Java 8, 100 76 byte

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

-24 byte nhờ @ OliverGrégoire .

Giải trình:

Hãy thử nó ở đây.

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

Rất tiếc, tôi không thấy đã có một bài nộp nên tôi đã xóa bài của tôi. Đây là nó, rút ​​ngắn xuống còn 76 byte: n->s->{int i,k=0;for(char c:s)for(i=k++%n<1?n:1;i-->0;)System.out.print(c);}(với a char[], thay vì String.)
Olivier Grégoire

Quy tắc của ngón tay cái, nếu bạn phải khai báo chính xác một Chuỗi sẽ được trả về, thì ngắn hơn là chỉ in nó ra.
Olivier Grégoire

@ OlivierGrégoire Rất tiếc .. Vâng, tôi biết quy tắc đó, chỉ quên áp dụng nó lần này .. Và cảm ơn vì các byte đã lưu!
Kevin Cruijssen

1

MATL , 10 7 byte

-3 byte nhờ Luis Mendo!

tq:ghY"

Hãy thử trực tuyến!

Lấy đầu vào nvà sau đó Slà một chuỗi chuỗi / 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

Haskell , 51 46 byte

Cảm ơn @Laikoni đã tiết kiệm cho tôi 5 byte!

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

Hãy thử trực tuyến!

Giải thích / Ungolfed

Toán tử c <$ [a..b]thay thế từng yếu tố của danh sách [a,a+1...b]bằng c- vì vậy nó chỉ là một cú đánh gôn 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 byte

"aDJòylÀpÀll

Hãy thử trực tuyến!

Đây là một cách giải quyết thực sự ngu ngốc. òlhÀälÀlÀ<M-->lnên làm việc, nhưng tôi có thể không cho cuộc sống của tôi hiểu tại sao, đặc biệt là kể từ khi tay làm lhÀälÀlÀ<M-->llặp đi lặp lại một loạt các lần thực hiện hoạt động.

Hexdump:

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

Giải trình:

<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... Tôi đoán đó là một thứ Vim nắm giữ? Nếu không thì ... tại sao ?
admBorkBork

2
@AdmBorkBork yeah lđúng trong vim. nó có thể ngược về mặt hình học, nhưng nó đúng về mặt hình học: llà phím chữ cái ngoài cùng bên phải của hàng giữa.
Giô-na

@DJMcMayhem Đúng. Tôi đã làm cho nó đúng.
Giô-na


0

Con trăn 3 , 58 byte

Làm việc trên sân golf nó xuống.

Tôi biết đã có câu trả lời Python khác, nhưng tôi nghĩ tôi cũng sẽ đăng câu này vì nó đạt điểm khá tốt so với các câu trả lời khác, mặc dù là một chức năng đầy đủ và không phải là lambda.

Lấy đầu vào làm tham số chức năng và in ra STDOUT.

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

Hãy thử trực tuyến!

Đối với một byte ít hơn (57), tôi đã mã hóa lambda, tuy nhiên các câu trả lời tương tự đã được đăng bởi những người dùng khác:

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

0

Brain-Flak (BrainHack) , 122 + 3 (-A ) = 125 byte

Tôi chắc chắn rằng điều này quá dài, nhưng tôi đã dành khá nhiều thời gian để tìm kiếm và không thể tìm thấy bất kỳ cải tiến nào.

([]){{}([(([{}]<>)<{({}<<>(({})<>)>())}{}{}>)<{({}<<>({}<>)>())}{}>]<>)([][()])}({}{}<>){({}{(<()>)}{}[()])}{}{({}<>)<>}<>

Hãy thử trực tuyến!


0

05AB1E , 12 11 byte

vX‚RNIÖèy×?

Hãy thử trực tuyến!

Giải trình

v             # for each letter in the input string
       è      # index into
 X‚           # the list [input_int,1]
   R          # reversed
    NIÖ       # with letter_index % input_int == 0
        y×    # repeat the current letter this many times
          ?   # print


0

K (oK) , 23 19 byte

Giải pháp:

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

Hãy thử trực tuyến!

Ví dụ:

> {,/(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"

Giải trình:

{,/(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"

Ghi chú:

  • -4 byte với cách tiếp cận khác nhau

0

VBA Excel, 71 byte

Chức năng cửa sổ ngay lập tức VBE ẩn danh lấy đầu vào từ phạm vi [A1:B1]và đầu ra cho cửa sổ ngay lập tức VBE.

For i=1To[Len(A1)]:[C1]=i:?[Rept(Mid(A1,C1,1),B1^(Mod(C1,B1)=1))];:Next
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.