字符串乘以数字python_将字符串乘以数字!

将字符串乘以数字!

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加上换行符?

我们可以输出字符串列表吗?

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

@ mbomb007,是的,很抱歉花了这么长时间。

@totallyhuman,不,您可能不会。

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

好吧,现在我真的很感动。我希望以微缩形式解释这个特殊的奇迹。

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

4

好的,如果您可以将其缩小,我将放弃尝试提出一个将使您> 10个字节的问题。

13

好,就是这样。我正在学习果冻。我也想做魔术。

2

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

9

JavaScript(ES6),63个字节

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

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

测试用例

letf=s=>n=>[...s].reduce((s,c)=>n<0?c.repeat(-n)+s:s+c.repeat(n),'')console.log(f(`HelloWorld!`)(3))console.log(f(`foo`)(12))console.log(f(`String`)(-3))console.log(f(`Thisis a fun challenge`)(0))console.log(f(`HelloWorld!`)(2))

运行代码段隐藏结果

3

+1 reduce!

9

Python 3,44字节

f=lambdas,n:sands[0]*n+f(s[1:],n)+s[0]*-n

基本情况似乎忽略了最后一个字符。

不太确定为什么要这么做...谢谢!

1

41个字节。但是如果函数调用f(n,*s)被认为有效,则为idk

9

Python 2中,59个 57 50 46字节

-2个字节感谢Anders Kaseorg。-4个字节感谢Dennis。

lambdas,n:''.join(i*n**2foriins)[::nor1]

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种选择。

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

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

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

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

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

Haskell,41 36字节

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

用法示例:f (-3) "abc"yields "cccbbbaaa"。

编辑: -5字节感谢xnor!

1

还有(

@xnor谢谢!很高兴知道。

5

V,29,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

!

重要的是不要尾随换行符,并且光标应位于其上。

À " 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 中的特殊情况非常有用。

对不起,负数特殊。但是,许多答案设法将其纳入主要答案。尽管对这个V印象深刻。

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

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

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

顺便说一句,Paren的R文档说(在语义上等价于该身份function(x)x

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

PHP> = 7.1,65字节

for([,$s,$n]=$argv;$i

1

在整数上下文中,$n<0具有与相同的值,$n<0?:0但短3个字节:-)

4

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

只是在这里给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字节

很好@miles!

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

1

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

3

Dyalog APL,15个字节

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

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

怎么样?

⍺/⍨ -重复字符串

|⍵ -绝对次数

⌽⍣ -如果相反

(⍵<0) -数字低于0

嗯,如果TIO这样工作会很好吗?

@Gryphon,然后是字节...

是的,我刚刚意识到这一点,并且正在输入我的评论告诉您。

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存在。

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

3

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

这可能是最糟糕的语言了,但是已经做到了。感谢@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

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

-2个字节,感谢@Xanderhall

-2个字节,感谢@Nevay

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

1

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

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

1

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

1

您可以通过增加icondition 来保存1个字节s->n->{for(int l=s.length*(n<0?-n:n),i=0;i++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

八度,49字节

@(s,n){t=repmat(s,abs(n),1)(:)',flip(t)}{2-(n>0)}

我明天将提供解释。

2

红宝石,59 +1 = 60字节

使用-n标志。

n=eval$_

a=$<.read>

a.reverse!ifn<0a.chars{|i|$><

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

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

!+sVg

"!+".slice(sign(V))-通过+→ a + b或!+→ 减小b + a。

感谢@Arnauld提出的向后减少的想法!

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

2

<(s,x){<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

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

2

Python 3,68个字节

h=lambdas,n:h(s[::-1],-n)ifn<0elses[0]*n+h(s[1:],n)ifselses*n

您好,欢迎光临本站!不幸的是,此答​​案目前无效,因为它不支持负数。挑战说:If the integer is negative, we use its absolute value in the first step, and then reverse the string.

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

编辑,感谢您的贡献

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

1-v{R.[v.R]v}R[v>R]v&@

嗯,还不错。

将输入作为整数和字符数组。

或者:

l1->[M]1-v&,{R.[v.R]v}R[v>R]v&@

将输入作为整数和字符串

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。

  • 0
    点赞
  • 1
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值