문자열에 숫자를 곱하십시오!


34

문자열을 곱하는 것에 대해 얼마 전에 도전 이있었습니다 . 숫자뿐만 아니라 문자열도 곱할 수있는 방법을 보여주었습니다. 그러나 여전히 숫자에 문자열을 곱할 수는 없습니다. 이 있었다 하나 개의 시도 그렇게 할 수 있지만, 이것은 분명히 잘못된 것입니다. 우리는 그것을 고쳐야합니다!

당신의 작업 :

문자열과 정수의 두 입력을 곱하는 함수 나 프로그램을 작성하십시오. 문자열에 정수를 (적절하게) 곱하려면 문자열을 문자로 나누고 각 문자를 정수와 같은 횟수만큼 반복 한 다음 문자를 다시 붙입니다. 정수가 음수이면 첫 번째 단계에서 절대 값을 사용한 다음 문자열을 반대로 바꿉니다. 입력이 0이면 아무것도 출력하지 않습니다 (0을 곱한 것은 아무것도 없음).

입력:

인쇄 가능한 ASCII 문자와 줄 바꿈 및 정수 (음수 가능)로만 구성된 문자열입니다.

산출:

문자열에 정수를 곱한 값입니다.

예 :

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

                               WWoorrlldd!!

채점 :

이것은 이며 가장 낮은 바이트 수입니다.


4
문자열이 인쇄 가능한 ASCII 전용이고 줄 바꿈이라고 가정 할 수 있습니까?
mbomb007

문자열 목록을 출력 할 수 있습니까?
완전히 인간적인

Retina의 부분 솔루션. 정수의 양수 값에만 작동합니다. 누군가가 원한다면 그것을 끝내기 위해 아마 시간을 내지 않을 것입니다.tio.run/##K0otycxL/P8/…
mbomb007

@ mbomb007, 예, 너무 오래 걸려서 죄송합니다.
그리폰-복원 모니카

@totallyhuman, 당신은하지 않을 수 있습니다.
그리폰-복원 모니카

답변:


31

젤리 , 6 5 4 바이트

²Ɠxm

온라인으로 사용해보십시오!

작동 원리

²Ɠ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
좋아, 이제 정말 감동받습니다. 나는이 특별한 경이의 미니어처에 대한 설명을 좋아합니다.
그리폰-복원 모니카

확실한. 테스트 스위트를 만들고 골프를 마치 자마자.
Dennis

4
자, 이것을 더 작게 만들 수 있다면, 10 바이트 이상 걸리는 질문을 포기할 것입니다.
그리폰-복원 모니카

13
알았어. 젤리를 배우고 있습니다. 나는 마술도 할 수 있기를 원합니다.
그리폰-복원 모니카

2
우리 모두 젤리 체인에 대한 토론이 어떻게 엉망이되는지를 알고 있습니다.
Erik the Outgolfer

9

자바 스크립트 (ES6), 63 바이트

카레 구문으로 입력을받습니다. (s)(n) 받습니다.

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

테스트 사례


3
+1 reduce!
Neil



6

05AB1E , 10 바이트

S²Ä×J²0‹iR

온라인으로 사용해보십시오!

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는 30 분 동안 @Riley에게 입증할만한 것을 제시하려고 노력 ²0‹i합니다.
매직 문어 Urn

@MagicOctopusUrn 나는 ²0‹i이전과 같은 것을 사용 했으며 항상 더 좋은 것이 있어야한다고 생각합니다.
Riley

나는 지금 약 10 번 대안을 찾으려고 생각했다 ... 내 인생의 누적 3 시간 낭비 ._. Ä.D)øJ¹0‹iR내가 당신을 복사하지 않고 할 수있는 최선의 방법이라고 생각합니다.
매직 문어 Urn

관심이 있다면 Emigna는 è here 사용 했지만이 시나리오에서는 적용 할 수있는 방법을 찾을 수 없습니다. 그렇다면 최대 1 바이트를 절약 할 수 있습니다.
매직 문어 Urn

SÂΛ@²Ä×J을 사용 Î하여 순서를 변경하면 0을 누르고 입력이 작동합니다. 1 바이트를 절약합니다! (또한 if를 대체 했으므로 닫을 필요는 없습니다.)
kalsowerus

5

MATL , 9 바이트

y|Y"w0<?P

입력은 숫자와 문자열입니다.

줄 바꿈이있는 문자열 10은 다음과 같이 char 을 사용하여 입력됩니다 ['first line' 10 'second line'].

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

입력 -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 바이트

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

온라인으로 사용해보십시오!

16 진 덤프 :

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

6 바이트를 절약 해 준 @ nmjcman101에게 감사의 말씀을 전합니다.

원래 개정판은 꽤 끔찍했지만 이제는이 답변이 음수를 놀랍게 잘 처리하기 때문에 정말 자랑스럽게 생각합니다. (V는 숫자 지원이없고 음수를 지원하지 않습니다)

설명:

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

이 시점에서 버퍼는 다음과 같습니다.

H
e
l
l
o

w
o
r
l
d
!
<cursor>

후행 줄 바꿈이 없어야하며 커서가 그 위에 있어야합니다.

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

나중에 몇 바이트 온라인으로 사용해보십시오! 나는 항상 "음수가 다른 것을 의미합니다!" 가장자리 케이스도. 0V 의 특별한 경우가 매우 유용한 경우입니다.
nmjcman101

음수 특수에 대해 죄송합니다. 그러나 많은 답변이 기본 답변에 통합되었습니다. 이 V에 인상적입니다.
그리폰-복원 모니카

@ nmjcman101 오 와우, 너무나 분명해, 내가 어떻게 생각하지 않았는지 모르겠어. 고맙습니다!
DJMcMayhem

@Gryphon 아 알아요. 도전은 괜찮습니다. 나는 잘하는 것에 너무 나쁘기 때문에 내 언어를 싫어합니다. : P
DJMcMayhem

5

R, 83 78 76 바이트

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

익명의 기능.

프레 더릭은 3 바이트를, 주세페는 2 4를 절약했습니다 .

설명:

     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

테스트 :

> 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
잘 했어 ! rep(foo,,,3)또는 rep(foo,e=3)(동일 길이) ;-) 를 작성하여 몇 바이트를 절약 할 수 있습니다.
Frédéric

@ 프레데릭 당신이 나를 이길, 나는 같은 것을 말할거야!
Giuseppe

1
예, 문제 없습니다! 기본적으로 중괄호를 없애고 싶었으므로을 제거해야했습니다 a=. 따라서 조건부 반환 a함수를 사용하여 역함수에 대한 인수로 값을 사용했습니다 i<0(이것이 역 따옴표가 필요한 이유입니다). 그러나 나는 또한 i>=0사건에 대한 신원 기능을 적용해야 했으므로 (어느 것이 가까운 지 사용했다. (실제로 함수입니다. R은 이상하다.
Giuseppe

1
btw, ParenR 문서( 는 의미 적으로 동일성과 동일 하다고 말합니다function(x)x
Giuseppe




4

브레인-플락 (BrainHack) , 154 (152) 바이트

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

온라인으로 사용해보십시오!

여기 DJMcMayhem에게 경쟁을주기 위해 여기에. ;)

설명

다음은 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 바이트

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

온라인으로 사용해보십시오!

설명

        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 바이트 동안
마일

아주 좋은 @ 마일!
Tikkanz

문제 없어. 또한 동사를 호출하는 데 사용 된 괄호를 세지 않아도됩니다.
마일

1
또한 13 바이트 :#~ ::(|.@#~|)
FrownyFrog

3

Dyalog APL, 15 바이트

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

왼쪽 인수 인 문자열, 오른쪽 인수 인 숫자

온라인으로 사용해보십시오!

어떻게?

⍺/⍨ -문자열을 반복

|⍵ -abs (수) 회

⌽⍣ -반대의 경우

(⍵<0) -숫자가 0 미만입니다


음, TIO가 효과가 좋으면 좋을까요?
그리폰-복원 모니카

@Gryphon 그리고 여기 바이트가 ...
Uriel

그래, 나는 그것을 깨달았고 당신에게 말하기 위해 내 의견을 입력하고있었습니다.
그리폰-복원 모니카

3

MATLAB, 37 바이트

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

이것은 입력과 함께 익명 함수를 정의하고 s: string 및 n: number.

예제 실행 :

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

뒤집을 치수를 선택하는 것이 내가 😛 +1을 쓴 혼란보다 훨씬 낫습니다. 그리고 나는 항상 repelem존재하는 것을 잊는다 .
Stewie Griffin

@StewieGriffin 글쎄, 당신도 당신의 답변에 그것을 포함시킬 수 있습니다 :-) (+1 이미). 나는 repelem지금 옥타브에 없다고 생각합니다
Luis Mendo

3

뇌 플랙 (하스켈) , 202 (192) 바이트

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

온라인으로 사용해보십시오!

이것은 아마도 최악의 언어 일 것입니다. 그러나 끝났습니다. 혼합 입력 형식을 허용하는 Haskell 인터프리터를 제공 한 @Wheatwizard에게 감사합니다. 이것이 없으면 약 150 바이트 더 길어집니다.

설명:

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

52 바이트 abs를 사용하여 2 바이트를 절약 할 수 있습니다 .50 바이트 -abs를 사용하고 6 바이트를 절약하기 위해 증가시키는 대신 증가시킬 수 있습니다.
밀 마법사


3

자바 (OpenJDK 8) , 99 98 89 87 85 바이트

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

온라인으로 사용해보십시오!

  • @Xanderhall 덕분에 -2 바이트
  • @Nevay 덕분에 -2 바이트

작동하지 않는 아이디어 (더 길어짐) : 줄을 뒤집기 전에 스트림을 사용하십시오.
Olivier Grégoire

1
s[(n<0?-l-~i:i)/n]
Xanderhall

@Xanderhall 감사합니다! 나는 오랫동안 눈을 피우는 것을 찾고있었습니다. 나는 그것이 가능하다는 것을 알고 그것을 구현할 때 모든 것을 망쳤습니다.
Olivier Grégoire

1
@ user902383 예, 필수 입니다. 선택 사항이라면 많은 것을 읽을 수 없습니다. 또한 내 함수는 "단일 문"이 아니라 여러 문을 포함하는 for-loop입니다.
Olivier Grégoire

1
i조건에서 증분 하여 1 바이트를 저장할 수 있습니다 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]);}. 대신 -l에서 0으로 반복하여 다른 바이트를 저장할 수 있습니다 ( 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

루비 , 59 +1 = 60 바이트

-n플래그를 사용합니다 .

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

온라인으로 사용해보십시오!


1
eval$_$_.to_i1 바이트 보다 짧습니다 . String#chars같은 방식으로 블록을 받아 들일 수도 String#each_char있습니다. 마지막으로, 각 문자를 처리하기 전에 입력을 반대로하여 대신 직접 인쇄 할 수 있습니다 (플래그를로 전환 -n). 이 모든 것이 결합되어 55 + 1 = 56 바이트가됩니다.
밸류 잉크

2

, 16 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

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 바이트

®pVaìr!+sVg

온라인으로 사용해보십시오!

설명

문자열의 암시 적 입력 U및 정수 V.

®pVaÃ

(암시 적으로 ®) 각 문자를 U반복 ( p) abs(V)( Va) 횟수로 매핑 합니다.

¬r

문자열을 문자 배열 ( ¬) 로 바꾸고 줄이십시오 ( r).

!+sVg

"!+".slice(sign(V))-이 중 하나와 함께 감소 +a + b또는과 !+b + a.
거꾸로 줄어든 아이디어에 대해 @Arnauld에게 감사드립니다!


나는 £gY*Vg)pVa더 짧은 해결책으로 이끌어야한다고 생각 하지만 휴가를 위해 뇌가 멈춰서 알아낼 수 없습니다. 그래도 뭔가 할 수 있습니다.
얽히고 설킨


2

C89 바이트

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

Ben Perlin의 버전을 보았고 아직 짧을 수없고 전체 프로그램을 가질 수 있을지 궁금했습니다. 확실히, atoi()그리고 putchar()바이트의 측면에서 비싼하지? 내가 옳은 것 같아!


2

Pyth, 13 11 바이트

*sm*.aQdz._

시도 해봐!

@jacoblaw 덕분에 -2 바이트

설명

*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 

기존 접근 방식, 13 바이트

_W<Q0sm*.aQdz

시도 해봐!


반전 논리를 사용하면 2 바이트를 절약 할 수 있습니다
jacoblaw

2

파이썬 3 , 68 바이트

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

온라인으로 사용해보십시오!


안녕하세요, 사이트에 오신 것을 환영합니다! 불행하게도,이 답변은 음수를 지원하지 않기 때문에 현재 유효하지 않습니다 . 도전은 말한다 :If the integer is negative, we use its absolute value in the first step, and then reverse the string.
DJMcMayhem

수정 해 주셔서 감사합니다! BTW, 괄호 뒤에 공백을 제거하여 2 바이트를 제거 할 수 있습니다.)
DJMcMayhem

편집 해 주셔서 감사합니다.
Kavi

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

1

QBIC , 32 바이트

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

설명

            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

수학, 89 바이트

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


입력

[ "Hello World!", 3]



1

C, 109 바이트

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

int와 문자열을 가져 와서 문자열을 생성하는 함수 선언으로 시작하면 (메모리가 사전 할당되지 않았고 생성되어야 함을 암시하는 것처럼 보입니다.) 직접적인 접근 방식은 시도한 cleaver 시도보다 짧습니다. .

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;

}


음수 n에서는 작동하지 않는 것 같습니다.
gastropner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.