将字符串乘以数字!


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

我们可以输出字符串列表吗?
完全人类

视网膜局部解决方案。仅适用于整数的正值。如果有人愿意,我可能不会花时间完成它。tio.run/##K0otycxL/P8/…–
mbomb007

@ mbomb007,是的,很抱歉花了这么长时间。
狮ry –恢复莫妮卡

@totallyhuman,不,您可能不会。
狮ry-恢复莫妮卡

Answers:


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
好吧,现在我真的很感动。我希望以微缩形式解释这个特殊的奇迹。
狮phon-恢复莫妮卡

当然。一旦我做了一个测试套件并完成了打高尔夫球。
丹尼斯,

4
好的,如果您可以将其缩小,我将放弃尝试提出一个将使您> 10个字节的问题。
狮ry-恢复莫妮卡

13
好,就是这样。我正在学习果冻。我也想做魔术。
狮phon-恢复莫妮卡

2
我们都知道,关于果冻链的讨论最终会变成一团糟...
Erik the Outgolfer

9

JavaScript(ES6),63个字节

以currying语法接受输入(s)(n)

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

测试用例


3
+1 reduce
尼尔



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并非最佳途径,并提出了0种选择。
魔术八达通Ur

@MagicOctopusUrn我以前使用过类似的东西²0‹i,我始终认为必须有更好的东西。
莱利

我想我现在已经尝试寻找大约10倍的替代方法...浪费了我一生的3个小时。Ä.D)øJ¹0‹iR是我最好的选择,我不会复制您,我认为您的状态已经优化。
魔术章鱼缸

如果您愿意的话,Emigna è 在这里使用,尽管我找不到在这种情况下应用它的方法。如果那样的话,最多可以保存1个字节。
魔术章鱼缸

SÂΛ@²Ä×JÎ如果要更改顺序,可使用推送0并输入。节省1个字节!(还替换了if,因此它不需要关闭)
kalsowerus

5

MATL,9个字节

y|Y"w0<?P

输入是:数字,然后是字符串。

带有换行符的字符串使用char输入10,如下所示:['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

V29,23,18,17字节

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

在线尝试!

十六进制转储:

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

感谢@ nmjcman101保存了6个字节,这鼓励我再保存5个字节!

最初的修订版本非常糟糕,但是现在我真的为这个答案感到骄傲,因为它可以很好地处理负数。(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.

ya的一些字节在线尝试! 我一直很讨厌“负数意味着别的东西!” 边缘情况也是如此。在这种情况下,您0在V 中的特殊情况非常有用。
nmjcman101

对不起,负数特殊。但是,许多答案设法将其纳入主要答案。尽管对这个V印象深刻。
狮ry-恢复莫妮卡的时间

@ nmjcman101哦,哇,这很明显,我不知道我是怎么想的。谢谢!
DJMcMayhem

@狮phon哦,我知道。挑战很好,我只是不喜欢自己的语言,因为我对自己本该擅长的语言太不好了。:P
DJMcMayhem

5

R,83 78 76字节

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

匿名函数。

弗雷德里克(Frederic)保存了3个字节,朱塞佩(Giuseppe)保存了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)(同lenght);-)
弗雷德里克

@Frédéric你击败了我,我要说同样的话!
朱塞佩

1
是的,没问题!基本上,我想摆脱大括号,所以我需要摆脱a=。因此,通过条件返回函数,我将aif 的值用作反向函数if i<0的参数(这就是为什么我需要反引号)。但是我还需要为i>=0案件应用身份功能,因此我使用了(足够接近的身份。(实际上是一个功能。R很奇怪。
朱塞佩

1
顺便说一句,ParenR文档(在语义上等价于该身份function(x)x
Giuseppe


4

05AB1E,10个字节

0‹FR}ʒ¹Ä×?

在线尝试!

说明

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

脑高射炮(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

J19 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字节
英里

很好@miles!
蒂卡兹

没问题。您也不需要计算用于调用动词的括号。
英里

1
同样是13个字节:#~ ::(|.@#~|)
FrownyFrog

3

Dyalog APL,15个字节

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

字符串作为左参数,数字作为右参数。

在线尝试!

怎么样?

⍺/⍨ -重复字符串

|⍵ -绝对次数

⌽⍣ -如果相反

(⍵<0) -数字低于0


嗯,如果TIO这样工作会很好吗?
狮ry-恢复莫妮卡

@Gryphon,然后是字节...
Uriel

是的,我刚刚意识到这一点,并且正在输入我的评论告诉您。
狮phon-恢复莫妮卡的时间

3

MATLAB,37个字节

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

这使用输入s:字符串和n:数字来定义和匿名函数。

示例运行:

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

@StewieGriffin好吧,您也可以将其包含在您的答案中:-)(+ 1)。我想,有没有repelem现在在八度,对
路易斯Mendo

3

脑高射炮(Haskell中)202个 192字节

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

在线尝试!

这可能是最糟糕的语言了,但是已经做到了。感谢@Wheatwizard提供了Haskell解释器,该解释器允许混合输入格式。如果没有它,则长度将增加约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

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

在线尝试!

  • -2个字节,感谢@Xanderhall
  • -2个字节,感谢@Nevay

无效的想法(更长的时间):将字符串反向,使用流,
OlivierGrégoire17年

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

@Xanderhall谢谢!我一直在寻找那个眼睛,我的眼睛一直流血。我知道这是可能的,我只是在实施它时弄乱了一切。
奥利维尔·格雷戈尔

1
@ user902383是的,这是强制性的。如果它们是可选的,那么很多事情将是不可读的。另外,我的功能不是“单个语句”,而是包含多个语句的for循环。
奥利维尔·格雷戈尔

1
您可以通过增加icondition 来保存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]);})进行迭代,可以保存另一个字节。
涅瓦



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(隐含)映射到自身重复(pabs(V)Va)次。

¬r

将字符串转换为chars(¬)数组,并r用(... )减少它。

!+sVg

"!+".slice(sign(V))-通过+a + b!+→ 减小b + a
感谢@Arnauld提出的向后减少的想法!


我觉得£gY*Vg)pVa应该缩短解决方案的时间,但由于假期我的大脑已经关闭,所以我不太清楚。不过,您也许可以做一些事情。
毛茸茸的

2

WendyScript,46个字节

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

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

在线尝试!

说明(无高尔夫球):

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字节

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

试试吧!

-2个字节,感谢@jacoblaw

说明

*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

试试吧!


您可以使用反向逻辑保存两个字节
jacoblaw

2

Python 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

感谢您修复它!顺便说一句,您可以通过删除括号后的空格来减少两个字节)
DJMcMayhem

编辑,感谢您的贡献
Kavi

n<0 else=>n<0else
扎卡里

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

Mathematica,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和一个字符串并产生一个字符串的函数声明开始(似乎暗示内存没有被预先分配,必须创建),似乎直截了当的方法比我尝试过的任何切刀都短。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.