Ulangi elemen ke-N


18

Kami belum memiliki pertanyaan untuk sementara waktu (tepatnya 5 hari), jadi mari kita lanjutkan.

Diberikan string sdan bilangan bulat positif n, ambil setiap nelemen s, ulangi nkali, dan masukkan kembali s.

Misalnya, jika n = 3dan s = "Hello, World!", setiap karakter ketiga adalah Hl r!. Anda kemudian ulangi setiap karakter nkali untuk menghasilkan HHHlll rrr!!!. Anda kemudian mengganti huruf aslinya dengan versi yang diulang untuk menghasilkan produk akhirHHHellllo, Worrrld!!!

Anda harus menyelesaikan tugas ini dalam kode sesingkat mungkin dalam bahasa Anda!

Aturan

  • Ini adalah sehingga kode terpendek dalam byte menang
  • ndijamin lebih kecil dari panjang sdan lebih besar dari 0
  • Karakter pertama sadalah dari mana nkarakter th diambil, dan selalu berulang nkali
  • shanya akan terdiri dari ASCII yang dapat dicetak (kode menunjuk 0x20 (space)ke 0x7E (~))

Uji kasus

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"

Bisakah kita mengambil input ssebagai array karakter?
Kevin Cruijssen

2
" dan masukkan kembali ke dalams " <- apakah ini persyaratan yang ketat (menimpa string asli) atau apakah tidak apa-apa untuk hanya menampilkan hasil akhir?
Felix Palmen

@KevinCruijssen Ya Anda bisa
caird coinheringaahing

1
@ Feliksmen itu hanya bagaimana saya menjelaskannya. Anda dapat menggunakan metode apa pun yang Anda inginkan
caird coinheringaahing

@cairdcoinheringaahing bagus, terima kasih, sudah melakukannya.
Felix Palmen

Jawaban:


10

Jelly , 3 byte

Ḣs×

Input diambil sebagai s, n .

Cobalah online!

Bagaimana itu bekerja

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

Bukankah ini sebenarnya 6 byte dalam pengkodean UTF-8? E1 B8 A2 73 C3 97
CoDEmanX

5
Di UTF-8, ya. Namun, Jelly menggunakan halaman kode khusus , di mana masing-masing karakter yang dipahami hanya membutuhkan satu byte.
Dennis

7

Jelly ,  6  5 byte

-1 byte berkat Nun bocor (gunakan perkalian string Python.)

×Jm¥¦

Program lengkap, menerima dua argumen baris perintah, string dan nomor, dan mencetak hasilnya.

Cobalah online!

Bagaimana?

×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


Yap mencoba xlupa ×; Terima kasih.
Jonathan Allan

Bukankah ini sebenarnya 8 byte dalam pengkodean UTF-8? C3 97 4A 6D C2 A5 C2 A6
CoDEmanX

2
@CoDEmanX Menggunakan halaman kode
MD XF

@MDXF terima kasih telah menerjunkan!
Jonathan Allan

4

JavaScript (ES6), 46 byte

Mengambil input dalam sintaks currying (s)(n).

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

Uji kasus




3

05AB1E , 8 7 byte

-1 byte terima kasih kepada @Emigna

ôʒć²×ì?

Cobalah online!

Penjelasan

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

Simpan satu byte denganôʒć²×ì?
Emigna

@Emigna terima kasih, saya tahu pasti ada cara untuk menyingkirkan penutupan}
kalsowerus

Penggunaan filter yang aneh ketika tidak menggunakan hasilnya tetapi sebenarnya membuat perbedaan ...
Magic Octopus Mm

@ MagicOctopusUrn, filter yep masih lebih baik di 05AB1E
kalsowerus

@kalsowerus vyadalah satu foreach, εyang lain. Anehnya, εtidak berfungsi.
Magic Octopus Mm

2

PowerShell , 51 byte

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

Cobalah online!

Mengambil input sebagai char-array $adan angka $n. Loop melalui $adan setiap iterasi menghasilkan huruf saat ini $_atau huruf saat ini dikalikan dengan $n, berdasarkan indeks ke pseudo-ternary. Indeks memilih antara keduanya berdasarkan incrementing $idan kemudian modulo $n. Surat-surat itu kemudian -joindisatukan kembali dan senarnya ditinggalkan di dalam pipa; output tersirat.



2

Alice , 25 byte

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

Cobalah online!

Penjelasan

/         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='')

Cobalah online!

Sebuah fungsi; mengambil string sdan integer n, dan mencetak versi yang diulang ke stdout.

Penjelasan:

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="")

Cobalah online!

Algoritma yang sama seperti di atas, tetapi dengan Sdiambil sebagai daftar karakter individu.




1

Japt , 8 byte

ËùDV*EvV

Uji secara online!

Penjelasan

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

Saya harus menghargai ide yang digunakan ùuntuk jawaban @ Shaggy di sini . Saya tidak tahu bahwa saya akan pernah memikirkannya sendiri ...


Anda lihat sekarang mengapa begitu tertarik untuk melihat string padding ditambahkan :) Solusi yang bagus. Saya mencoba untuk mendapatkan sesuatu untuk dikerjakan ë, untuk buang air besar & cekikikan, tetapi gagal total!
Shaggy

1

J, 17 byte

(#@]$[,1#~<:@[)#]
  • (...) # ]semua yang ada di parens menciptakan string untuk kata kerja "copy" bawaan J. Jadi, misalnya, jika argumen kiri adalah 3, itu menciptakan string yang 3 1 1diulang sesuai kebutuhan untuk sama dengan jumlah karakter dalam argumen kanan ], yang berisi string. Artinya, #selesaikan masalahnya secara langsung, dengan asumsi kita dapat memberikan argumen kiri yang benar: 4seharusnya4 1 1 1 diulang, dan seterusnya.
  • Meneliti #@]$[,1#~<:@[, kita melihatnya menggunakan bentuk kata kerja J$ di tengah - itulah kata kerja utama dari frasa ini ...
  • Di sebelah kiri $adalah #@], artinya panjang #arg yang tepat ].
  • Di sebelah kanan $adalah [,1#~<:@[, kereta 5 kata kerja. Kereta pertama yang dieksekusi adalah ...
  • 1#~<:@[, yang berarti 1 disalin #~(bentuk salinan pasif) satu kurang dari <:arg kiri [. Hasil ini diteruskan ke garpu final:
  • [, ...artinya ambil arg kiri, dan tambahkan hasil yang baru saja kita hitung, yang merupakan untaian 1s.

Cobalah online!


]#~[^0=(|i.@#) selama 14 byte
mil

Itu cukup pintar. Perbaikan Anda pada posting saya adalah bagian terbaik dari situs ini untuk saya.
Jonah


1

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

-8 byte berkat komentar Tom.

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

Cobalah secara Online


Tidak dapat memikirkan pendekatan yang lebih baik saat ini, tetapi saya datang dengan beberapa ide: $n=<>;alih-alih BEGINblok dan ada ndi baris input berikutnya dan ganti $-[0]dengan "@-"karena hanya angka pertama yang dievaluasi sebagai perbandingan. Juga, jika Anda mengambil input nvia -iAnda hanya dapat menggunakan $^Ialih-alih mendeklarasikan dan menggunakan $n, tetapi karena ini adalah non-standar mungkin tidak terbang ... :)
Dom Hastings

1

6502 rutin kode mesin , 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

Ini adalah subroutine posisi-independen yang mengharapkan pointer ke string input (0-dihentikan alias C-string) di $fb/ $fc, pointer ke buffer output di $fd/ $fedan jumlah ( n) di $ff. Ini menggunakan pengindeksan sederhana, sehingga terbatas pada panjang output maksimum 255 karakter (+ 0 byte) karena arsitektur 8bit.

Penjelasan (dikomentari pembongkaran):

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

Contoh program kode mesin C64 yang menggunakannya :

Ini adalah program assembler gaya- ca65 untuk C64 menggunakan rutin ini (diimpor sebagai 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

Demo online

Penggunaan:, sys49152,"[s]",[n] missys49152,"Hello, World!",3

Penting: Jika program dimuat dari disk (seperti dalam demo online), keluarkan newperintah terlebih dahulu! Ini diperlukan karena memuat program mesin menghancurkan beberapa pointer BASIC C64.


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 terima kasih kepada @ OliverGrégoire .

Penjelasan:

Coba di sini.

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

Ups, saya tidak melihat sudah ada kiriman jadi saya menghapus milik saya. Ini dia, disingkat menjadi 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);}(dengan a char[], alih-alih String.)
Olivier Grégoire

Aturan praktisnya, jika Anda harus mendeklarasikan tepat satu String yang akan dikembalikan, lebih pendek hanya dengan mencetaknya.
Olivier Grégoire

@ OlivierGrégoire Ups .. Ya, saya tahu aturan praktis itu, hanya lupa untuk menerapkannya kali ini .. Dan terima kasih atas byte yang disimpan!
Kevin Cruijssen

1

MATL , 10 7 byte

-3 byte terima kasih kepada Luis Mendo!

tq:ghY"

Cobalah online!

Mengambil input sebagai ndan kemudian Ssebagai array string / 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

Terima kasih @Laikoni karena telah menyelamatkan saya 5 byte!

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

Cobalah online!

Penjelasan / Tidak Diundang

Operator c <$ [a..b]mengganti setiap elemen daftar [a,a+1...b]dengan c- jadi hanya golf 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

Arang , 14 byte

Nθ⪫ES⎇﹪κθι×ιθω

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input dalam urutan n, s.


0

V , 13 byte

"aDJòylÀpÀll

Cobalah online!

Ini adalah solusi yang sangat bodoh. òlhÀälÀlÀ<M-->lharus bekerja, tapi aku tidak bisa untuk kehidupan saya memahami mengapa, terutama karena secara manual melakukan lhÀälÀlÀ<M-->ldiulang beberapa kali melakukan pekerjaan.

Hexdump:

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

Penjelasan:

<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... Saya kira itu hal peninggalan Vim? Kalau tidak ... mengapa ?
AdmBorkBork

2
@ AdmBorkBork ya lbenar di vim. mungkin secara ortografis mundur, tetapi secara geometris benar: ladalah kunci huruf paling kanan dari baris tengah.
Jonah

@DJMcMayhem Benar. Saya membuatnya benar.
Jonah


0

Python 3 , 58 byte

Bekerja untuk bermain golf.

Saya tahu sudah ada jawaban Python lain, tapi saya pikir saya akan memposting yang satu ini juga karena skornya cukup baik dibandingkan dengan yang lain, meskipun berfungsi penuh dan bukan lambda.

Mengambil input sebagai parameter fungsi, dan mencetak ke STDOUT.

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

Cobalah online!

Kurang dari satu byte (57), saya memberi kode lambda, namun jawaban yang serupa telah diposting oleh pengguna lain:

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

Saya yakin ini terlalu lama, tetapi saya menghabiskan cukup banyak waktu mencari dan tidak dapat menemukan perbaikan.

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

Cobalah online!


0

05AB1E , 12 11 byte

vX‚RNIÖèy×?

Cobalah online!

Penjelasan

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

Mathematica, 71 byte

""<>s[[i]]~t~If[i~Mod~#2==1,#2,1]~(t=Table)~{i,Tr[1^(s=Characters@#)]}&

Cobalah online!

disimpan -2 byte dengan mendengarkan user202729


Saya pikir Maplebih Charactersmungkin lebih pendek.
user202729

@ user202729 ok! -2 byte
J42161217

0

K (oK) , 23 19 byte

Larutan:

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

Cobalah online!

Contoh:

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

Penjelasan:

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

Catatan:

  • -4 byte dengan pendekatan berbeda

0

Excel VBA, 71 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input dari jarak [A1:B1]dan keluaran ke jendela langsung VBE.

For i=1To[Len(A1)]:[C1]=i:?[Rept(Mid(A1,C1,1),B1^(Mod(C1,B1)=1))];:Next
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.