Nth öğelerini tekrarla


18

Biz olmadı bir süre soruyu (5 gün kesin olarak), o yüzden biri için gidelim.

Bir dize sve pozitif bir tamsayı verildiğinde n, her nöğeyi alın s, tekrarlayınn ve yerleştirins .

Örneğin, eğer n = 3ve s = "Hello, World!"her üç karakterden biri Hl r!. Daha sonra nüretmek için her karakter zamanını tekrar edersinizHHHlll rrr!!! . Daha sonra orijinal harfleri tekrarlanan sürümlerle değiştirirsiniz.HHHellllo, Worrrld!!!

Bu görevi dilinizde mümkün olan en kısa kodda gerçekleştireceksiniz!

kurallar

  • Bu bir bu nedenle bayttaki en kısa kod kazanır
  • n uzunluğundan daha küçük olması garanti edilir s ve 0'dan büyük
  • İlk karakteri snerede ninci karakter alınır ve her zaman tekrarlanır nkez
  • syalnızca basılabilir ASCII (kod noktaları oluşur 0x20 (space)için 0x7E (~))

Test senaryoları

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"

Girdiyi skarakter dizisi olarak alabilir miyiz ?
Kevin Cruijssen

2
" ve geri koymaks " <- Bu katı bir gereksinim (orijinal dize üzerine yazma) mı yoksa sadece nihai sonucu çıkarmak için sorun yok mu?
Felix Palmen

@KevinCruijssen Evet yapabilirsiniz
caird coinheringaahing

1
@FelixPalmen bu şekilde açıkladım. İstediğiniz herhangi bir yöntemi kullanabilirsiniz
caird coinheringaahing

@cairdcoinheringaahing iyi, teşekkürler, zaten yaptı.
Felix Palmen

Yanıtlar:


10

Jöle , 3 bayt

Ḣs×

Giriş s, n olarak alınır .

Çevrimiçi deneyin!

Nasıl çalışır

Ḣ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 kodlamasında aslında 6 bayt değil mi? E1 B8 A2 73 C3 97
CoDEmanX

5
UTF-8'de evet. Ancak Jelly, anladığı karakterlerin her birinin yalnızca tek bir bayt içerdiği özel bir kod sayfası kullanır .
Dennis

7

Jöle ,  6  5 bayt

Sızan Nun sayesinde -1 bayt (Python'un dize çarpmasını kullanın.)

×Jm¥¦

Dize ve sayı olmak üzere iki komut satırı bağımsız değişkenini kabul eden ve sonucu yazdıran tam bir program.

Çevrimiçi deneyin!

Nasıl?

×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


Evet çalışıp xunuttum ×; Teşekkürler.
Jonathan Allan

UTF-8 kodlamasında aslında 8 bayt değil mi? C3 97 4A 6D C2 A5 C2 A6
CoDEmanX

2
@CoDEmanX Jelly'nin özel kod sayfasını
MD XF

@ MDXF saha için teşekkürler!
Jonathan Allan

4

JavaScript (ES6), 46 bayt

Körili sözdiziminde girdi alır (s)(n).

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

Test senaryoları




3

05AB1E , 8 7 bayt

@Emigna sayesinde -1 bayt

ôʒć²×ì?

Çevrimiçi deneyin!

açıklama

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

ôʒć²×ì?
İle

@Emigna teşekkürler, kapanıştan kurtulmanın bir yolu olması gerektiğini biliyordum}
kalsowerus

Sonucu kullanmıyor, ancak aslında bir fark yaratıyorsa filtrenin garip kullanımı ...
Magic Octopus Urn

@MagicOctopusUrn, yep filtresi 05AB1E'de hala daha iyi foreach
kalsowerus

@kalsowerus vybir foreach, εbir başka. İşin garibi, εişe yaramıyor.
Sihirli Ahtapot Urn

2

PowerShell , 51 bayt

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

Çevrimiçi deneyin!

Girişi bir chardizi $ave sayı olarak alır $n. İçinden döngüler $ave her yineleme , bir dizine dayalı olarak geçerli harfi $_veya geçerli harfi çarpımıyla $nbir sahte üçlü olarak verir. Endeks, ikisi artan $ive daha sonra modulo temelli olarak seçim yapar $n. Bu harfler daha sonra -jointekrar bir araya getirilir ve dizi boru hattında bırakılır; çıktı örtük.



2

Alice , 25 bayt

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

Çevrimiçi deneyin!

açıklama

/         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 bayt

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

Çevrimiçi deneyin!

Bir işlev; bir dize sve bir tam sayı alır ve nyinelenen sürümü stdout'a yazdırır.

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

Yukarıdaki ile aynı algoritma, ancak Sbireysel karakterlerin bir listesi olarak alınır.




1

Japt , 8 bayt

ËùDV*EvV

Çevrimiçi test edin!

açıklama

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

Kullanmak fikir kredi zorunda ùiçin @Shaggy 'ın cevabı burada . Bunu kendim düşünürdüm bilmiyorum ...


Şimdi neden dize dolgusu eklendiğini görmek için çok istekli olduğunu görüyorsunuz :) Güzel bir çözüm. Ben ëkakalar ve kıkırdıyor, ile çalışmak için bir şey almaya çalışıyordu , ama sefil başarısız oldu!
Shaggy

1

J, 17 bayt

(#@]$[,1#~<:@[)#]
  • (...) # ]parens'teki her şey, J'nin yerleşik "copy" fiili için dize oluşturur. Bu nedenle, örneğin, sol argüman 3 ise, dizeyi içeren sağ argümandaki 3 1 1karakter sayısına eşit olması için gerektiği kadar yinelenen dize oluşturur ]. Ki, demek ki #biz bunu doğru sol argüman verebilir varsayarak doğrudan sorunu çözer: 4edilmelidir 4 1 1 1tekrarlanan, vb.
  • incelenmesi #@]$[,1#~<:@[ J'nin şekil fiilini kullandığını görüyoruz$ ortada - bu ifadenin ana fiili ...
  • Sol tarafta ait $olan #@]uzunluğu, yani #sağ arg] .
  • Sağında $IS [,1#~<:@[, trenin fiil, 5. Gerçekleştirilen ilk tren ...
  • 1#~<:@[bu , sol argümandan #~bir kopyadan daha az 1 kopyalanmış (pasif kopya biçimi) anlamına gelir . Bu sonuç son çatala aktarılır:<:[
  • [, ...yani sol argümanı alır ve yeni hesapladığımız sonucu ekleriz 1.

Çevrimiçi deneyin!


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

Bu oldukça zekice. Yayınlarımdaki iyileştirmeleriniz benim için bu sitenin en iyi kısmı.
Jonah


1

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

Tom'un yorumu sayesinde -8 bayt.

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

Çevrimiçi Deneyin


Şu anda daha iyi bir yaklaşım düşünüyorum, ama birkaç fikirler geliştirdim Can not: $n=<>;yerine BEGINblok ve sahip ngirişin sonraki satırda ve değiştirme $-[0]ile "@-"sadece ilk sayı kıyasla değerlendirilir beri. Ayrıca, nüzerinden girdi -ialırsanız, $^Ibeyan etmek ve kullanmak yerine kullanabilirsiniz $n, ancak bu standart dışı olduğu için uçmayabilir ... :)
Dom Hastings

1

6502 makine kodu rutini, 50 bayt

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

Bu giriş dizgeye bir işaretçi bekliyor bir konumdan bağımsız altprogram olan (diğer adıyla 0-ile-sonlanan Cı-string) $fb/ $fcçıkış için bir işaretçi tampon $fd/ $feve sayım ( n) 'de$ff . Basit indeksleme kullanır, bu nedenle 8 bit mimarisi nedeniyle maksimum 255 karakter (+ 0 bayt) çıkış uzunluğu ile sınırlıdır.

Açıklama (yorumlu sökme):

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

Bunu kullanan örnek C64 makine kodu programı :

Bu, bu rutini kullanan C64 için ca65 stili bir derleyicide (olarak içe aktarılır rep) bir programdır :

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

Çevrimiçi demo

Kullanım: sys49152,"[s]",[n] örn.sys49152,"Hello, World!",3

Önemli: Program diskten yüklendiyse (çevrimiçi demoda olduğu gibi), newönce bir komut verin! Bu, bir makine programının yüklenmesi bazı C64 BASIC göstergelerini çöpe attığından gereklidir.


1

Java 8, 100 76 bayt

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 sayesinde -24 bayt .

Açıklama:

Burada deneyin.

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

Hata, zaten bir sunum olduğunu görmedim, bu yüzden benimkini sildim. İşte, 76 bayta kısaltılmış: n->s->{int i,k=0;for(char c:s)for(i=k++%n<1?n:1;i-->0;)System.out.print(c);}( char[]yerine, yerine String.)
Olivier Grégoire

Başparmak kuralı, döndürülecek tam olarak bir Dize bildirmeniz gerekiyorsa, yazdırmak daha kısa olur.
Olivier Grégoire

@ OlivierGrégoire Hata! Evet, bu temel kuralı biliyorum, bu sefer uygulamayı unuttum .. Ve kaydedilen baytlar için teşekkürler!
Kevin Cruijssen

1

MATL , 10 7 bayt

Luis Mendo sayesinde -3 bayt!

tq:ghY"

Çevrimiçi deneyin!

Girdiyi önce nve sonra Sdize / karakter dizisi olarak alır.

    % (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 bayt

@Laikoni beni 5 bayt kurtardığın için teşekkürler!

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

Çevrimiçi deneyin!

Açıklama / Ungolfed

Operatör c <$ [a..b]listesinin her bir öğeyi değiştirir [a,a+1...b]tarafından c- bu sadece bir golfed yüzden 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 bayt

"aDJòylÀpÀll

Çevrimiçi deneyin!

Bu gerçekten aptalca bir çözüm. òlhÀälÀlÀ<M-->lçalışması gerekir, ancak beni hayat elle yapıyor, özellikle de anlayamıyorum için lhÀälÀlÀ<M-->lbir kaç kez tekrarlandı yapar işi.

HexDump:

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

Açıklama:

<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... sanırım bu bir Vim olayı mı? Aksi halde ... neden ?
AdmBorkBork

2
@AdmBorkBork evet vim'de ldoğru. dikey olarak geriye doğru olabilir, ancak geometrik olarak doğrudur: lorta satırın en sağdaki harf tuşudur.
Jonah

@DJMcMayhem Doğru. Ben doğru yaptım.
Jonah


0

Python 3 , 58 bayt

Aşağı golf üzerinde çalışıyor.

Zaten başka Python cevapları olduğunu biliyorum, ama bir lambda değil, tam bir işlev olmasına rağmen, diğerlerine kıyasla oldukça iyi puanlar olarak görüyorum bunu da göndereceğini düşündüm.

Girdiyi işlev parametreleri olarak alır ve yazdırır STDOUT.

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

Çevrimiçi deneyin!

Bir bayt daha az (57) için bir lambda kodladım, ancak benzer cevaplar zaten diğer kullanıcılar tarafından gönderildi:

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

0

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

Bunun çok uzun olduğundan eminim, ama bakarken epey zaman geçirdim ve herhangi bir gelişme bulamadım.

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

Çevrimiçi deneyin!


0

05AB1E , 12 11 bayt

vX‚RNIÖèy×?

Çevrimiçi deneyin!

açıklama

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 bayt

Çözüm:

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

Çevrimiçi deneyin!

Örnekler:

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

Açıklama:

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

Notlar:

  • Farklı yaklaşımla -4 bayt

0

Excel VBA, 71 Bayt

Aralık [A1:B1]ve çıkışlardan VBE anlık penceresine giriş alan anonim VBE anında pencere işlevi .

For i=1To[Len(A1)]:[C1]=i:?[Rept(Mid(A1,C1,1),B1^(Mod(C1,B1)=1))];:Next
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.