Lipat gandakan string dengan angka!


34

Ada tantangan beberapa waktu lalu tentang mengalikan string. Ini menunjukkan kepada kita bagaimana kita dapat mengalikan bukan hanya angka, tetapi juga string. Namun, kami masih tidak dapat mengalikan angka dengan string dengan benar. Ada satu upaya untuk melakukannya tetapi ini jelas salah. Kita harus memperbaikinya!

Tugas Anda:

Tulis fungsi atau program yang mengalikan dua input, string dan integer. Untuk (dengan benar) mengalikan string dengan integer, Anda membagi string menjadi karakter, ulangi setiap karakter beberapa kali sama dengan integer, dan kemudian menempelkan kembali karakter tersebut. Jika bilangan bulat negatif, kami menggunakan nilai absolutnya di langkah pertama, dan kemudian membalikkan string. Jika inputnya 0, tidak menghasilkan apa-apa (apa pun yang dikalikan dengan 0 sama dengan tidak sama sekali).

Memasukkan:

String yang hanya terdiri dari karakter dan baris ASCII yang dapat dicetak, dan integer (mungkin negatif).

Keluaran:

String dikalikan dengan integer.

Contoh:

Hello World!, 3            --> HHHeeellllllooo   WWWooorrrlllddd!!!
foo, 12                    --> ffffffffffffoooooooooooooooooooooooo
String, -3                 --> gggnnniiirrrtttSSS
This is a fun challenge, 0 --> 
Hello
World!, 2                  --> HHeelllloo

                               WWoorrlldd!!

Mencetak:

Ini adalah , kemenangan jumlah byte terendah!


4
Bisakah kita menganggap string hanya bisa dicetak ASCII, ditambah baris baru?
mbomb007

Bisakah kita menampilkan daftar string?
totallyhuman

Solusi parsial dalam Retina. Hanya berfungsi untuk nilai positif bilangan bulat. Saya mungkin tidak akan meluangkan waktu untuk menyelesaikannya jika seseorang mau. tio.run/##K0otycxL/P8/…
mbomb007

@ mbomb007, ya, maaf sudah terlalu lama tentang itu.
Gryphon - Reinstate Monica

@ sebenarnya manusia, tidak, Anda tidak mungkin.
Gryphon - Pasang kembali Monica

Jawaban:


31

Jelly , 6 5 4 byte

²Ɠxm

Cobalah online!

Bagaimana itu bekerja

²Ɠxm  Main link. Argument: n (integer)

²     Yield n².
 Ɠ    Read and eval one line of input. This yields a string s.
  x   Repeat the characters of s in-place, each one n² times.
   m  Takes each |n|-th character of the result, starting with the first if n > 0, 
      the last if n < 0.

1
Oke, sekarang saya benar-benar terkesan. Saya ingin penjelasan tentang keajaiban ini dalam miniatur.
Gryphon - Reinstate Monica

Yakin. Segera setelah saya membuat test suite dan saya selesai bermain golf.
Dennis

4
OK, jika Anda dapat membuat ini lebih kecil, saya akan menyerah mencoba membuat pertanyaan yang akan membawa Anda> 10 byte.
Gryphon - Pasang kembali Monica

13
OK, itu saja. Saya belajar Jelly. Saya ingin bisa melakukan sihir juga.
Gryphon - Reinstate Monica

2
Kita semua tahu bagaimana diskusi tentang rantai Jelly berakhir berantakan ...
Erik the Outgolfer

9

JavaScript (ES6), 63 byte

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

s=>n=>[...s].reduce((s,c)=>n<0?c.repeat(-n)+s:s+c.repeat(n),'')

Uji kasus


3
+1 untuk reduce!
Neil



6

05AB1E , 10 byte

S²Ä×J²0‹iR

Cobalah online!

S          # Split the string into characters
 ²Ä×       # Repeat each character abs(integer) times
    J      # Join into a string
     ²0‹i  # If the integer is less than 0...
         R #   Reverse the string

TFW Anda menghabiskan 30 menit untuk mencoba menemukan sesuatu untuk membuktikan kepada @Riley itu ²0‹ibukan rute terbaik dan datang dengan 0 alternatif.
Magic Gurita Guci

@ MagicOctopusUrn Saya telah menggunakan sesuatu seperti ²0‹isebelumnya dan saya selalu berpikir harus ada sesuatu yang lebih baik.
Riley

Saya pikir saya sudah mencoba mencari alternatif sekitar 10 kali sekarang ... membuang 3 jam kumulatif hidup saya ._. Ä.D)øJ¹0‹iRadalah yang terbaik yang bisa saya lakukan tanpa menyalin Anda, saya pikir Anda dioptimalkan.
Magic Gurita Guci

Jika Anda peduli, Emigna digunakan di è sini , meskipun saya tidak dapat menemukan cara untuk menerapkannya dalam skenario ini. Akan menghemat maksimal 1 byte, jika itu.
Magic Gurita Guci

SÂΛ@²Ä×J, gunakan Îuntuk menekan 0 dan input berfungsi jika Anda mengubah urutan. Menghemat 1 byte! (Juga diganti jika, jadi tidak perlu ditutup)
kalsowerus

5

MATL , 9 byte

y|Y"w0<?P

Inputnya adalah: angka, lalu string.

String dengan baris baru adalah input menggunakan arang 10sebagai berikut: ['first line' 10 'second line'].

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Pertimbangkan input -3dan 'String'.

y      % Implicitly take two inputs. Duplicate from below
       % STACK: -3, 'String', -3
|      % Absolute value
       % STACK: -3, 'String', 3
Y"     % Run-length decoding
       % STACK: -3, 'SSStttrrriiinnnggg'
w      % Swap
       % STACK: 'SSStttrrriiinnnggg', -3
0<     % Less than 0?
       % STACK: 'SSStttrrriiinnnggg', 1
?      % If so
  P    %   Flip
       %   STACK: 'gggnnniiirrrtttSSS'
       % End (implicit). Display (implicit)

5

Haskell , 41 36 byte

f n|n<0=reverse.f(-n)|1<3=(<*[1..n])

Cobalah online!

Contoh penggunaan: f (-3) "abc"hasil "cccbbbaaa".

Edit: -5 byte terima kasih kepada xnor!


1
Ada (<*[1..n])untuk ((<$[1..n])=<<).
xnor

@ Terima kasih! Senang mendengarnya.
Laikoni

5

V , 29, 23, 18 , 17 byte

æ_ñÀuñÓ./&ò
ÀäëÍî

Cobalah online!

Hexdump:

00000000: e65f f1c0 75f1 d32e 2f26 f20a c0e4 ebcd  ._..u.../&......
00000010: ee                                       .

Terima kasih kepada @ nmjcman101 untuk menghemat 6 byte, yang mendorong saya untuk menyimpan 5 byte lagi!

Revisi asli cukup mengerikan, tetapi sekarang saya sangat bangga dengan jawaban ini karena ternyata angka negatifnya sangat baik. (V tidak memiliki dukungan numerik dan tidak ada dukungan untuk angka negatif)

Penjelasan:

æ_          " Reverse the input
  ñ  ñ      " In a macro:
   À        "   Run the arg input. If it's positive it'll give a count. If it's negative
            "   running the '-' will cause V to go up a line which will fail since we're
            "   on the first line, which will break out of this macro
    u       "   (if arg is positive) Undo the last command (un-reverse the line)
      Ó./&ò " Put every character on it's own line

Pada titik ini, buffer terlihat seperti ini:

H
e
l
l
o

w
o
r
l
d
!
<cursor>

Penting untuk tidak mengikuti baris baru, dan bahwa kursor ada di sana.

À           " Run arg again. If it's negative, we will move up a line, and then give the 
            " absolute value of the count. If it's positive (or 0) it'll just give the
            " count directly (staying on the last line)
 ä          " Duplicate... (count times)
  ë         "   This column. 
   Íî       " Remove all newlines.

Beberapa byte untukmu. Coba online! Saya selalu membenci "Angka negatif berarti sesuatu yang lain!" case tepi juga. Ini adalah kasus di mana kasing 0khusus Anda di V sangat berguna.
nmjcman101

Maaf tentang angka negatif spesial. Namun, banyak jawaban berhasil memasukkannya ke dalam jawaban utama mereka. Mengesankan pada V yang satu ini.
Gryphon - Reinstate Monica

@ nmjcman101 Oh wow, itu sudah sangat jelas, saya tidak tahu bagaimana saya tidak memikirkannya. Terima kasih!
DJMcMayhem

@Gryphon Oh saya tahu. Tantangannya baik-baik saja, saya hanya tidak suka bahasa saya sendiri karena begitu buruk pada apa yang seharusnya menjadi baik. : P
DJMcMayhem

5

R, 83 78 76 byte

function(s,i)cat('if'(i<0,rev,`(`)(rep(el(strsplit(s,'')),e=abs(i))),sep='')

Fungsi anonim.

Frederic menyelamatkan 3 byte, Giuseppe menyelamatkan 2 4.

Penjelasan:

     el(strsplit(s,''))                      # split string into list characters
 rep(                  ,e=abs(i)))           # repeat each character abs(i) times


    'if'(i<0,rev,   ){...}                 # if i>0, reverse character list
                 `(`                       # otherwise leave it alone: `(` is the identity function
cat(                      ,sep='')         # print the result

Tes:

> f('Hello World!', 3 )
HHHeeellllllooo   WWWooorrrlllddd!!!
> f('foo', 12)
ffffffffffffoooooooooooooooooooooooo
> f('String', -3)
gggnnniiirrrtttSSS
> f('This is a fun challenge', 0)
> f('Hello
+ World!', 2)
HHeelllloo

WWoorrlldd!!

2
Sudah selesai dilakukan dengan baik ! Anda dapat menyimpan beberapa byte dengan menulis rep(foo,,,3)atau rep(foo,e=3)(panjang yang sama) ;-)
Frédéric

@ Frédéric Anda mengalahkan saya untuk itu, saya akan mengatakan hal yang sama!
Giuseppe

1
ya, tidak masalah! Pada dasarnya, saya ingin menyingkirkan kawat gigi, jadi saya harus menyingkirkannya a=. Oleh karena itu, saya menggunakan nilai asebagai argumen ke fungsi sebaliknya jika i<0, dengan meminta kembali fungsi tersebut (itulah sebabnya saya membutuhkan backquote). Tapi saya perlu juga menerapkan fungsi identitas untuk i>=0kasus ini, jadi saya menggunakan (yang cukup dekat. (sebenarnya fungsi. R aneh.
Giuseppe

1
Namun, dokumen untuk Paren mengatakan bahwa (secara semantik setara dengan identitasfunction(x)x
Giuseppe


4

05AB1E , 10 byte

0‹FR}ʒ¹Ä×?

Cobalah online!

Penjelasan

0‹F         # input_1 < 0 times do:
   R        # reverse input_2
    }       # end loop
     ʒ      # filter
      ¹Ä×   # repeat current char abs(input_1) times
         ?  # print without newline


4

Brain-Flak (BrainHack) , 154 152 byte

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

Cobalah online!

Hanya di sini untuk memberikan beberapa kompetisi DJMcMayhem. ;)

Penjelasan

Inilah versi modifikasi dari penjelasan DJMcMayhem

#Compute the sign and negative absolute value 
([(({})<(())>)]<>)<>{({}()<([{}]()<([{}])>)<>({}<>)<>>)<>}{}<>{}<>

#Keep track of the sign
({}<

    #For each char in the input string:
    ([][()])
    {
        {}

        #Push n copies to the alternate stack
        ({<({}<(({}<>)<>)>())>[()]}<{}{}>)

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

#Push the sign back on
>)

#If so...
{{}

    #Reverse the whole stack
    {({}<>)<>}

    #And toggle over, ending the loop
    (<>)
}

#Pop the counter off
{}

4

J , 19 15 13 byte

(#~|)A.~0-@>]

Cobalah online!

Penjelasan

        0-@>]      NB. first or last index depending on sign of right arg
     A.~           NB. get first or last Anagram of left arg
(#~|)              NB. copy left arg, absolute-value-of-right-arg times

2
(#~|)A.~0-@>]untuk 13 byte
mil

@Miles sangat bagus!
Tikkanz

Tidak masalah. Anda juga tidak perlu menghitung tanda kurung yang digunakan untuk memanggil kata kerja.
mil

1
Juga 13 byte:#~ ::(|.@#~|)
FrownyFrog

3

Dyalog APL, 15 byte

{⌽⍣(⍵<0)⊢⍺/⍨|⍵}

String sebagai argumen kiri, angka sebagai argumen kanan.

Cobalah online!

Bagaimana?

⍺/⍨ - ulangi string

|⍵ - abs (jumlah) kali

⌽⍣ - balikkan jika

(⍵<0) - jumlahnya di bawah 0


Umm, alangkah baiknya jika TIO suka bekerja?
Gryphon - Reinstate Monica

@Gryphon dan ini dia byte ...
Uriel

Yap, saya baru menyadari itu dan sedang mengetik komentar saya untuk memberi tahu Anda.
Gryphon - Reinstate Monica

3

MATLAB, 37 byte

@(s,n)flip(repelem(s,abs(n)),(n<0)+1)

Ini mendefinisikan dan fungsi anonim dengan input s: string dan n: nomor.

Contoh berjalan:

>> @(s,n)flip(repelem(s,abs(n)),(n<0)+1)
ans = 
    @(s,n)flip(repelem(s,abs(n)),(n<0)+1)

>> f = ans;

>> f('String', 3)
ans =
SSStttrrriiinnnggg

>> f('String', -3)
ans =
gggnnniiirrrtttSSS

>> f('String', 0)
ans =
   Empty matrix: 1-by-0

Memilih dimensi mana untuk dibalik adalah jauh lebih baik daripada kekacauan yang saya tulis 😛 +1. dan aku selalu lupa repelemada.
Stewie Griffin

@StewieGriffin Baiklah, Anda bisa memasukkannya dalam jawaban Anda juga :-) (sudah +1). Saya pikir tidak ada repelemdi Octave, untuk saat ini
Luis Mendo

3

Brain-Flak (Haskell) , 202 192 byte

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

Cobalah online!

Ini mungkin bahasa yang paling buruk untuk melakukannya, tapi sudah selesai. Terima kasih kepada @Wheatwizard karena menyediakan juru bahasa Haskell, yang memungkinkan format input campuran. Ini akan menjadi sekitar 150 byte lebih lama tanpanya.

Penjelasan:

#Keep track of the first input (n)
(({})<

    #Push abs(n) (thanks WheatWizard!)
    (([({})]<>)){({}()<([{}])<>({}<>)<>>)<>}{}([{}]<><{}>)

    #For each char in the input string:
    ([][()])
    {
        {}

        #Push n copies to the alternate stack
        ({<({}<(({}<>)<>)>[()])>()}<{}{}>)

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

#Push the original n back on
>)

#Push n >= 0
([({}<(())>)](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}

#If so...
{{}

    #Reverse the whole stack
    {({}<>)<>}

    #And toggle over, ending the loop
    (<>)
}

#Pop the counter off
{}

Anda bisa menggunakan abs 52 byte saya untuk menyimpan 2 byte, Anda juga bisa menggunakan 50 byte -ab yang saya berikan kepada Anda dan menambahkan bukannya mengurangi untuk menyimpan 6 byte.
Wheat Wizard


3

Java (OpenJDK 8) , 99 98 89 87 85 byte

s->n->{for(int i=s.length*(n<0?n:-n),r=n<0?0:~i;i++<0;)System.out.print(s[(i+r)/n]);}

Cobalah online!

  • -2 byte terima kasih kepada @Xanderhall
  • -2 byte berkat @Nevay

Gagasan yang tidak berfungsi (lebih lama): balikkan string sebelumnya, gunakan aliran,
Olivier Grégoire

1
Simpan 2 byte dengans[(n<0?-l-~i:i)/n]
Xanderhall

@Xanderhall Terima kasih! Saya sudah mencari yang begitu lama sampai mata saya berdarah. Saya tahu itu mungkin, saya hanya mengacaukan semuanya ketika mengimplementasikannya.
Olivier Grégoire

1
@ user902383 Ya, itu wajib . Jika itu opsional, banyak hal yang tidak dapat dibaca. Juga, fungsi saya bukan "pernyataan tunggal", tetapi untuk-loop, yang mencakup beberapa pernyataan.
Olivier Grégoire

1
Anda dapat menghemat 1 byte dengan menambahkan i dalam kondisi s->n->{for(int l=s.length*(n<0?-n:n),i=0;i++<l;)System.out.print(s[(n<0?i-l:i-1)/n]);}. Byte lain dapat disimpan dengan beralih dari -l ke 0 sebagai gantinya ( s->n->{for(int i=s.length*(n<0?n:-n),r=n<0?0:~i;i++<0;)System.out.print(s[(i+r)/n]);}).
Nevay


2

Ruby , 59 +1 = 60 byte

Menggunakan -nbendera

n=eval$_
a=$<.read
a.reverse!if n<0
a.chars{|i|$><<i*n.abs}

Cobalah online!


1
eval$_lebih pendek dari $_.to_i1 byte. String#charsjuga dapat menerima blok dengan cara yang sama String#each_charbisa. Terakhir, balikkan input sebelum memproses masing-masing karakter sehingga Anda dapat mencetaknya secara langsung (mengalihkan bendera Anda ke -n). Semua ini bergabung menjadi 55 +1 = 56 byte.
Nilai Tinta

2

Arang , 16 byte

Fθ¿‹η0F±Iη←ιFIηι

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Fθ              For each character in the input string
  ¿‹η0          If the input number is less than zero
      F±Iη      Repeat the negation of the input number times
          ←ι    Print the character leftwards (i.e. reversed)
      FIη       Otherwise repeat the input number times
         ι      Print the character


2

Japt , 12 byte

®pVaìr!+sVg

Cobalah online!

Penjelasan

Input string Udan integer tersirat V.

®pVaÃ

Peta ( ®) setiap huruf U(secara implisit) ke dirinya sendiri berulang ( p) abs(V)( Va) kali.

¬r

Ubah string menjadi array karakter ( ¬) dan kurangi ( r) dengan ...

!+sVg

"!+".slice(sign(V))- ini dikurangi dengan +a + b, atau dengan !+b + a.
Terima kasih @Arnauld untuk ide pengurangan-mundur!


Saya merasa £gY*Vg)pVaharus mengarah ke solusi yang lebih pendek tetapi otak saya telah mati untuk liburan sehingga saya tidak bisa mengetahuinya. Anda mungkin bisa melakukan sesuatu dengannya.
Shaggy

2

WendyScript , 46 byte

<<f=>(s,x){<<n=""#i:s#j:0->x?x>0n+=i:n=i+n/>n}

f("Hello World", -2) // returns ddllrrooWW  oolllleeHH

Cobalah online!

Penjelasan (Tidak Diikat):

let f => (s, x) {
  let n = ""
  for i : s
    for j : 0->x
      if x > 0 n += i
      else n = i + n
  ret n
}

2

C89 byte

main(int c,char**v){for(;*v[1];v[1]++)for(c=atoi(v[2]+(*v[2]=='-'));c--;)putchar(*v[1]);}

Saya melihat versi Ben Perlin dan bertanya-tanya apakah Anda masih bisa lebih pendek dan juga memiliki program lengkap; pasti, atoi()dan putchar()bukankah itu mahal dalam hal byte? Sepertinya saya benar!


2

Pyth, 13 11 byte

*sm*.aQdz._

Cobalah!

-2 byte terima kasih kepada @jacoblaw

penjelasan

*sm*.aQdz._   
  m     z     # map onto the input string (lambda var: d)
   *.aQd      # repeat the char d as often as the absolute value of the input number 
 s            # sum the list of strings into a single string
*        ._Q   # Multiply with the sign of the implicit input value: reverse for negative Q 

pendekatan lama, 13 byte

_W<Q0sm*.aQdz

Cobalah!


Anda dapat menyimpan dua byte dengan logika pembalikan ini
jacoblaw

2

Python 3 , 68 byte

h=lambda s,n:h(s[::-1],-n)if n<0 else s[0]*n+h(s[1:],n)if s else s*n

Cobalah online!


Halo, dan selamat datang di situs ini! Sayangnya, jawaban ini tidak valid saat ini, karena tidak mendukung angka Negatif . Tantangannya mengatakan:If the integer is negative, we use its absolute value in the first step, and then reverse the string.
DJMcMayhem

Terima kasih telah memperbaikinya! BTW, Anda bisa melepas dua byte dengan menghapus spasi setelah tanda kurung)
DJMcMayhem

Diedit, terima kasih atas kontribusi
Kavi

n<0 else=>n<0else
Zacharý

1

QBIC , 32 byte

g=sgn(c)[_l;||[:*g|?_sA,b*g,1|';

Penjelasan

            Takes inputs A$ ('Hello'), and c (-3) from the cmd line
g=sgn(c)    Save the sign of c          -1
[_l;||      FOR each char in A$
[:*g|       FOR the number of repetitions wanted    (ie: -3 * -1)
            Note that : reads a number from the cmd line, and c is the first 
            available variable to save it in after a and b got used as FOR counters.
            Also note that a negative value times the sign becomes positive.
?_s         PRINT a substring
  A         of A$
 ,b*g       startng at char n, where n is the first FOR loop counter times the sign
                That means that when c is negative, so is this. A negative starting index
                on Substring instructs QBIC to take from the right.
 ,1|        taking 1 char.
';          This bit injects a literal ; in the output QBasic, to suppress newlines om PRINT

1

Mathematica, 89 byte

(T=Table;t=""<>T[s[[i]]~T~Abs@#2,{i,Length[s=Characters@#]}];If[#2>0,t,StringReverse@t])&


memasukkan

["Hello World!", 3]



1

C, 109 byte

char *f(int n, char *s){char *o=calloc(n,strlen(s)+1),*t=o;while(*s){for(int i=n;i--;)*t++=*s;s++;}return o;}

Dimulai dengan deklarasi fungsi yang mengambil int dan string dan menghasilkan string (tampaknya tersirat bahwa memori tidak dialokasikan dan harus dibuat) tampaknya pendekatan lurus ke depan lebih pendek daripada upaya untuk menjadi golok yang telah saya coba .

char *f(int n, char *s){
  char *o=calloc(n, strlen(s)+1),
    *t=o;

  while (*s) {
    for(int i=n; i--; )
      *t++=*s;
    s++;
  }

 return o;

}


Ini sepertinya tidak berfungsi untuk negatif n.
gastropner
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.