Повторіть N-й елементи


18

У нас протягом певного часу не виникало питання (якщо бути точним 5 днів), тож давайте продовжимо його.

Давши рядок sі додатне ціле число n, візьміть кожен nелемент елемента s, повторіть його nраз і вставте його назад s.

Наприклад, якщо n = 3і s = "Hello, World!", кожен третій символ є Hl r!. Потім ви повторюєте кожен nраз, щоб створити символ HHHlll rrr!!!. Потім ви замінюєте оригінальні букви повторними версіями, щоб отримати кінцевий продуктHHHellllo, Worrrld!!!

Ви повинні виконати це завдання якомога коротшим кодом на вашій мові!

Правила

  • Це з кодом, тому виграє найкоротший код у байтах
  • nгарантовано буде меншою, ніж довжина sта більше 0
  • Перший символ sє де nй символи взяті з і завжди повторюється 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як масив символів?
Кевін Кройсейсен

2
" і повернути його вs " <- це сувора вимога (перезапис вихідного рядка) чи це нормально, щоб просто вивести кінцевий результат?
Фелікс Палмен

@KevinCruijssen Так, можна
caird coinheringaahing

1
@FelixPalmen саме так я пояснив це. Ви можете скористатися будь-
яким потрібним

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

Чи насправді це 6 байт у кодуванні UTF-8? E1 B8 A2 73 C3 97
CoDEmanX

5
У UTF-8 так. Однак Jelly використовує користувальницьку кодову сторінку , де кожен з зрозумілих символів займає лише один байт.
Денніс

7

Желе ,  6  5 байт

-1 байт завдяки нещільній монашці (використовуйте множення рядків Python.)

×Jm¥¦

Повна програма, яка приймає два аргументи командного рядка, рядок та число та друкує результат.

Спробуйте в Інтернеті!

Як?

×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забути ×; Спасибі.
Джонатан Аллан

Це насправді 8 кодувань у кодуванні UTF-8? C3 97 4A 6D C2 A5 C2 A6
CoDEmanX

2
@CoDEmanX Використовує спеціальну кодову сторінку
MD XF

@MDXF спасибі за поле!
Джонатан Аллан

4

JavaScript (ES6), 46 байт

Здійснює введення в синтаксис currying (s)(n).

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

Тестові справи




3

05AB1E , 8 7 байт

-1 байт завдяки @Emigna

ôʒć²×ì?

Спробуйте в Інтернеті!

Пояснення

ôʒć²×ì?    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- це один провід , εінший. Як не дивно, εне працює.
Magic Octopus Urn

2

PowerShell , 51 байт

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

Спробуйте в Інтернеті!

charВводиться як вхід- масив $aта число $n. Проводиться цикл $aі кожна ітерація або виводить поточну літеру $_або поточну букву, помножену на $n, на основі індексу в псевдотермінал. Індекс вибирає між двома на основі приросту, $iа потім за модулем $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

R , 82 76 75 байт

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

Спробуйте в Інтернеті!

Функція; приймає рядок sі ціле число nі друкує повторну версію до stdout.

Пояснення:

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 відповіді «s тут . Я не знаю, що я коли-небудь подумав би про це сам ...


Тепер ви бачите, чому так захоплювався додаванням струнних накладок :) Приємне рішення. Я намагався змусити щось попрацювати ëдля Poops & хихикань, але не вдалося!
Shaggy

1

J, 17 байт

(#@]$[,1#~<:@[)#]
  • (...) # ]все в паренах створює рядок для вбудованого J у дієслово "copy". Так, наприклад, якщо лівий аргумент дорівнює 3, він створює рядок, 3 1 1повторений у міру необхідності, щоб дорівнювати кількості символів у правому аргументі ], який містить рядок. Що означає, #вирішує проблему безпосередньо, припускаючи, що ми можемо дати правильний лівий аргумент: 4слід4 1 1 1 повторити тощо.
  • Вивчення #@]$[,1#~<:@[ , ми бачимо, що він використовує дієслово форми J $посередині - ось головне дієслово цієї фрази ...
  • Ліворуч від $- #@]означає довжину #правого аргументу] .
  • Праворуч $- [,1#~<:@[поїзд з 5 дієсловами. Перший виконаний поїзд - це ...
  • 1#~<:@[, що означає 1 скопійовану #~(пасивну форму копії) на одну меншу, ніж <:ліва аргументація [. Цей результат передається до остаточної вилки:
  • [, ...тобто візьміть лівий аргумент і додайте результат, який ми тільки що обчислили, а це рядок 1s.

Спробуйте в Інтернеті!


]#~[^0=(|i.@#)за 14 байт
миль

Це досить розумно. Ваші вдосконалення моїх публікацій - найкраща частина цього сайту для мене.
Йона


1

Perl 5, 37 , 29 +1 (-p) байт

-8 байт завдяки коментарю Тома.

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

Спробуйте це в Інтернеті


Не можу придумати кращого підходу прямо зараз, але я придумав кілька ідей: $n=<>;замість BEGINблоку і мати nна наступному рядку введення і замінити $-[0]з , "@-"так як тільки перше число оцінюється в порівнянні. Крім того, якщо ви берете дані nчерез, -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

Це незалежна від позиції підпрограма, що очікує вказівник на рядок введення (0-закінчений ака-C-рядок) в $fb/ $fc, вказівник на вихідний буфер в $fd/ $feі count ( n) у$ff . Він використовує просту індексацію, тому обмежений максимальною довжиною виводу 255 символів (+ 0 байт) завдяки 8-бітовій архітектурі.

Пояснення (коментоване розбирання):

 .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, що використовує його :

Це програма в асемблері ca65 для стилю C65 за допомогою цієї програми (імпортується як 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);}

-24 байт завдяки @ OliverGrégoire .

Пояснення:

Спробуйте тут.

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);}(з а char[], замість String.)
Олів'є Грегоар

Правило великого пальця, якщо вам потрібно оголосити точно одну стрічку, яка буде повернута, коротше просто роздрукувати її.
Олів'є Грегоар

@ OlivierGrégoire На жаль .. Я знаю це правило, просто забув застосувати його цього разу .. І дякую за збережені байти!
Kevin Cruijssen

1

MATL , 10 7 байт

-3 байти завдяки Луїсу Мендо!

tq:ghY"

Спробуйте в Інтернеті!

Вводиться як введення, nа потім Sяк масив 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 байт

Дякую @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- значить, це просто гольф 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має працювати, але я не можу за життя мені зрозуміти , чому, тим більше , що вручну Doing 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 Right. Я зробив це правильно.
Йона


0

Python 3 , 58 байт

Працюючи над гольфом.

Я знаю, що вже є інші відповіді Python, але я подумав, що я надрукую цей теж, побачивши, що він бачить досить добре порівняно з іншими, незважаючи на те, що він є повноцінною функцією, а не лямбда.

Приймає введення як параметри функції та друкує до STDOUT.

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

Спробуйте в Інтернеті!

На один байт менше (57) я зашифрував лямбда, однак подібні відповіді вже опублікували інші користувачі:

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

0

Brain-Flak (BrainHack) , 122 + 3 ( -A) = 125 байт

Я впевнений, що це занадто довго, але я витратив досить довго на пошуки і не зміг знайти жодних поліпшень.

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

Спробуйте в Інтернеті!




0

К (оК) , 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 байт

Анонімна функція негайного вікна VBE, яка приймає вхід з діапазону [A1:B1]та виводить у безпосереднє вікно VBE.

For i=1To[Len(A1)]:[C1]=i:?[Rept(Mid(A1,C1,1),B1^(Mod(C1,B1)=1))];:Next
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.