Nhân một chuỗi với một số!


34

một thách thức trước đây về việc nhân chuỗi. Nó cho chúng ta thấy làm thế nào chúng ta có thể nhân không chỉ các số, mà cả các chuỗi. Tuy nhiên, chúng ta vẫn không thể nhân một số với một chuỗi đúng. Đã có một nỗ lực để làm như vậy nhưng điều này rõ ràng là sai. Chúng ta cần sửa nó!

Nhiệm vụ của bạn:

Viết hàm hoặc chương trình nhân hai đầu vào, một chuỗi và một số nguyên. Để (đúng) nhân một chuỗi với một số nguyên, bạn chia chuỗi thành các ký tự, lặp lại mỗi ký tự một số lần bằng số nguyên, sau đó dán các ký tự lại với nhau. Nếu số nguyên âm, chúng tôi sử dụng giá trị tuyệt đối của nó trong bước đầu tiên, và sau đó đảo ngược chuỗi. Nếu đầu vào là 0, đầu ra không có gì (mọi thứ nhân với 0 bằng không có gì).

Đầu vào:

Một chuỗi chỉ bao gồm các ký tự và dòng mới ASCII có thể in và một số nguyên (có thể phủ định).

Đầu ra:

Chuỗi nhân với số nguyên.

Ví dụ:

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

                               WWoorrlldd!!

Ghi điểm:

Đây là , số byte thấp nhất sẽ thắng!


4
Chúng ta có thể giả sử chuỗi chỉ có thể in ASCII, cộng với các dòng mới không?
mbomb007

Chúng ta có thể xuất ra một danh sách các chuỗi?
hoàn toàn là

Giải pháp một phần trong Retina. Chỉ hoạt động cho các giá trị dương của số nguyên. Tôi có lẽ sẽ không dành thời gian để hoàn thành nó nếu ai đó muốn. tio.run/##K0otycxL/P8/ Nâng
mbomb007 11/07/2017

@ mbomb007, vâng, xin lỗi vì mất quá nhiều thời gian về điều đó.
Gryphon - Tái lập Monica

@totallyhuman, không bạn có thể không.
Gryphon - Phục hồi Monica

Câu trả lời:


31

Thạch , 6 5 4 byte

²Ɠxm

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

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

²Ɠ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
OK, bây giờ tôi thực sự ấn tượng. Tôi muốn một lời giải thích về kỳ quan đặc biệt này trong thu nhỏ.
Gryphon - Tái lập Monica

Chắc chắn rồi. Ngay khi tôi thực hiện một bộ thử nghiệm và đang chơi golf.
Dennis

4
Được rồi, nếu bạn có thể làm cho nó nhỏ hơn nữa, tôi sẽ từ bỏ việc cố gắng đưa ra một câu hỏi sẽ đưa bạn> 10 byte.
Gryphon - Tái lập Monica

13
OK, vậy thôi. Tôi đang học Jelly. Tôi muốn có thể làm phép thuật quá.
Gryphon - Tái lập Monica

2
Chúng ta đều biết làm thế nào một cuộc thảo luận về chuỗi Jelly kết thúc là một mớ hỗn độn ...
Erik the Outgolfer 12/07/17

9

JavaScript (ES6), 63 byte

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

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

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


3
+1 cho reduce!
Neil



6

05AB1E , 10 byte

S²Ä×J²0‹iR

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

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 bạn dành 30 phút để cố gắng đưa ra điều gì đó để chứng minh với @Riley rằng đó ²0‹ikhông phải là con đường tốt nhất và đưa ra 0 phương án thay thế.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Tôi đã sử dụng một cái gì đó như ²0‹itrước đây và tôi luôn nghĩ rằng phải có một cái gì đó tốt hơn.
Riley

Tôi nghĩ rằng tôi đã cố gắng tìm một giải pháp thay thế khoảng 10 lần bây giờ ... lãng phí 3 giờ tích lũy của cuộc đời tôi ._. Ä.D)øJ¹0‹iRlà điều tốt nhất tôi có thể làm mà không cần sao chép bạn, tôi nghĩ bạn được tối ưu hóa.
Bạch tuộc ma thuật Urn

Nếu bạn quan tâm, Emigna đã sử dụng è ở đây , mặc dù tôi không thể tìm ra cách áp dụng nó trong kịch bản này. Sẽ tiết kiệm tối đa 1 byte, nếu vậy.
Bạch tuộc ma thuật Urn

SÂΛ@²Ä×J, sử dụng Îđể đẩy 0 và đầu vào hoạt động nếu bạn thay đổi thứ tự. Tiết kiệm 1 byte! (Cũng thay thế if, vì vậy nó không cần phải đóng)
kalsowerus

5

MATL , 9 byte

y|Y"w0<?P

Đầu vào là: số, sau đó là chuỗi.

Chuỗi có dòng mới được nhập bằng char 10như sau : ['first line' 10 'second line'].

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Xem xét đầu vào -3'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

V , 29, 23, 18 , 17 byte

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

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

Hexdump:

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

Cảm ơn @ nmjcman101 vì đã lưu 6 byte, điều này khuyến khích tôi tiết kiệm thêm 5 byte!

Bản sửa đổi ban đầu khá khủng khiếp, nhưng bây giờ tôi thực sự tự hào về câu trả lời này vì nó xử lý tốt các số âm. (V không có hỗ trợ số và không hỗ trợ số âm)

Giải trình:

æ_          " 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

Tại thời điểm này, bộ đệm trông như thế này:

H
e
l
l
o

w
o
r
l
d
!
<cursor>

Điều quan trọng là không phải là dòng mới, và con trỏ ở trên đó.

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

Một vài byte cho bạn Hãy thử trực tuyến! Tôi luôn ghét "số âm có nghĩa là cái gì khác!" trường hợp cạnh quá. Đây là một trường hợp mà 0các trường hợp đặc biệt của bạn trong V rất tiện dụng.
nmjcman101

Xin lỗi về những số âm đặc biệt. Tuy nhiên, rất nhiều câu trả lời được quản lý để kết hợp điều đó vào câu trả lời chính của họ. Ấn tượng về V này mặc dù.
Gryphon - Phục hồi Monica

@ nmjcman101 Ôi chà, điều đó quá rõ ràng, tôi không biết tôi đã không nghĩ về nó như thế nào. Cảm ơn bạn!
DJMcMayhem

@Gryphon ơi tôi biết rồi. Thử thách là ổn, tôi chỉ không thích ngôn ngữ của mình vì quá tệ với những gì nó được cho là giỏi. : P
DJMcMayhem

5

R, 83 78 76 byte

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

Chức năng ẩn danh.

Frederic lưu 3 byte, Giuseppe lưu 2 4.

Giải trình:

     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

Các xét nghiệm:

> 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
Làm tốt ! Bạn có thể lưu một vài byte bằng cách viết rep(foo,,,3)hoặc rep(foo,e=3)(cùng chiều dài) ;-)
Frédéric

@ Frédéric bạn đánh tôi với nó, tôi sẽ nói điều tương tự!
Giuseppe

1
vâng, không vấn đề gì Về cơ bản, tôi muốn thoát khỏi niềng răng, vì vậy tôi cần phải thoát khỏi a=. Do đó, tôi đã sử dụng giá trị anhư là một đối số cho hàm đảo ngược nếu i<0, bằng cách có hàm trả về có điều kiện (đó là lý do tại sao tôi cần các backquote). Nhưng tôi cũng cần phải áp dụng chức năng nhận dạng cho i>=0trường hợp này, vì vậy tôi đã sử dụng (nó đủ gần. (trong thực tế là một chức năng. R là lạ.
Giuseppe

1
btw, các tài liệu R cho Paren nói rằng (tương đương về mặt ngữ nghĩa với danh tínhfunction(x)x
Giuseppe




4

Brain-Flak (BrainHack) , 154 152 byte

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

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

Chỉ cần ở đây để cung cấp cho DJMcMayhem một số cuộc thi. ;)

Giải trình

Đây là phiên bản sửa đổi của lời giải thích của 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-@>]

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

Giải trình

        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-@>]13 byte
dặm

@Miles rất hay!
Tikkanz

Không vấn đề gì. Bạn cũng không cần phải đếm các dấu ngoặc đơn được sử dụng để gọi động từ.
dặm

1
Ngoài ra 13 byte:#~ ::(|.@#~|)
FrownyFrog

3

APL Dyalog, 15 byte

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

Chuỗi là một đối số bên trái, số là một đối số bên phải.

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

Làm sao?

⍺/⍨ - lặp lại chuỗi

|⍵ - abs (số) lần

⌽⍣ - đảo ngược nếu

(⍵<0) - số dưới 0


Umm, thật tuyệt nếu TIO thích làm việc?
Gryphon - Phục hồi Monica

@Gryphon và ở đây đi theo byte ...
Uriel

Đúng, tôi vừa nhận ra điều đó và đang gõ bình luận của tôi để nói với bạn.
Gryphon - Tái lập Monica

3

MATLAB, 37 byte

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

Điều này xác định và hàm ẩn danh với đầu vào s: chuỗi và n: số.

Ví dụ chạy:

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

Chọn kích thước nào để lật dọc là cách tốt hơn so với mớ hỗn độn tôi đã viết 😛 +1. và tôi luôn quên repelemtồn tại.
Stewie Griffin

@StewieGriffin Chà, bạn cũng có thể kết hợp điều đó trong câu trả lời của mình :-) (đã +1). Tôi nghĩ repelembây giờ không có ở Octave
Luis Mendo

3

Brain-Flak (Haskell) , 202 192 byte

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

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

Đây có lẽ là ngôn ngữ tồi tệ nhất có thể để làm điều đó, nhưng nó đã được thực hiện. Cảm ơn @Wheatwizard đã cung cấp trình thông dịch Haskell, cho phép các định dạng đầu vào hỗn hợp. Điều này sẽ dài hơn khoảng 150 byte nếu không có nó.

Giải trình:

#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
{}

Bạn có thể sử dụng abs 52 byte của tôi để lưu 2 byte, bạn cũng có thể sử dụng 50 byte mà tôi đã đưa cho bạn và tăng thay vì giảm để lưu 6 byte.
Phù thủy lúa mì


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]);}

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

  • -2 byte nhờ @Xanderhall
  • -2 byte nhờ @Nevay

Các ý tưởng không hoạt động (dài hơn): đảo ngược chuỗi trước, sử dụng một luồng,
Olivier Grégoire

1
Lưu 2 byte vớis[(n<0?-l-~i:i)/n]
Xanderhall

@Xanderhall Cảm ơn! Tôi đã tìm kiếm cái đó rất lâu, mắt tôi chảy máu. Tôi biết điều đó là có thể, tôi chỉ làm rối tung mọi thứ khi thực hiện nó.
Olivier Grégoire

1
@ user902383 Có, đó là bắt buộc . Nếu chúng là tùy chọn, rất nhiều thứ sẽ không thể đọc được. Ngoài ra, chức năng của tôi không phải là "một câu lệnh", mà là một vòng lặp for, bao gồm một số câu lệnh.
Olivier Grégoire

1
Bạn có thể lưu 1 byte bằng cách tăng itrong điều kiện 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]);}. Một byte khác có thể được lưu bằng cách lặp từ -l đến 0 thay vào đó ( 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

Sử dụng -ncờ.

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

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


1
eval$_ngắn hơn $_.to_i1 byte. String#charscũng có thể chấp nhận một khối theo cách tương tự String#each_charcó thể. Cuối cùng, đảo ngược đầu vào trước khi xử lý từng ký tự để bạn có thể in trực tiếp thay thế (chuyển cờ của bạn sang -n). Tất cả điều này kết hợp để trở thành 55 + 1 = 56 byte.
Mực giá trị

2

Than , 16 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

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

Giải trình

Đầu vào ngầm định của chuỗi Uvà số nguyên V.

®pVaÃ

Ánh xạ ( ®) mỗi chữ cái của U(ngầm) đến chính nó lặp lại ( p) abs(V)( Va) lần.

¬r

Biến chuỗi thành một mảng ký tự ( ¬) và giảm ( r) với ...

!+sVg

"!+".slice(sign(V))- điều này hoặc giảm với +a + b, hoặc với !+b + a.
Cảm ơn @Arnauld cho ý tưởng giảm ngược!


Tôi cảm thấy £gY*Vg)pVanên dẫn đến một giải pháp ngắn hơn nhưng bộ não của tôi đã ngừng hoạt động vào ngày lễ vì vậy tôi không thể tìm ra nó. Bạn có thể có thể làm một cái gì đó với nó, mặc dù.
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

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

Giải thích (Ungolfed):

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]);}

Tôi đã xem phiên bản của Ben Perlin và tự hỏi liệu bạn không thể ngắn hơn nữa và cũng có một chương trình đầy đủ; chắc chắn, atoi()putchar()không đắt về mặt byte? Có vẻ như tôi đã đúng!


2

Bình thường, 13 11 byte

*sm*.aQdz._

Thử nó!

-2 byte nhờ @jacoblaw

giải trình

*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 

cách tiếp cận cũ, 13 byte

_W<Q0sm*.aQdz

Thử nó!


bạn có thể lưu hai byte với logic đảo ngược này
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

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


Xin Chào và Chào Mừng đến với trang! Thật không may, câu trả lời này không hợp lệ ngay bây giờ vì nó không hỗ trợ các số âm . Thử thách cho biết:If the integer is negative, we use its absolute value in the first step, and then reverse the string.
DJMcMayhem

Cảm ơn đã sửa nó! BTW, bạn có thể tắt hai byte bằng cách xóa khoảng trắng sau dấu ngoặc đơn)
DJMcMayhem

Đã chỉnh sửa, cảm ơn sự đóng góp
Kavi

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

1

QBIC , 32 byte

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

Giải trình

            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

Toán học, 89 byte

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


đầu vào

["Xin chào thế giới!", 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;}

Bắt đầu với một khai báo hàm lấy một int và một chuỗi và tạo ra một chuỗi (có vẻ như ngụ ý rằng bộ nhớ không được kích thích và phải được tạo ra) có vẻ như cách tiếp cận đơn giản ngắn hơn bất kỳ nỗ lực nào trong việc tìm kiếm cleaver mà tôi đã thử .

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;

}


Điều này dường như không làm việc cho n tiêu cực.
dạ dày 8/12/17
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.