Javascript左击高尔夫球


27

介绍

在过后左垫NPM包 余波,让我们有一个代码高尔夫为实现左垫。

左垫功能由2个默认参数和1个额外的参数,在形式字符串长度,(padchar)。如果未提供padchar,则将其标准化空格字符。让我们以两个参数为例:

left_pad("abc", 6)

首先,我们观察字符串的长度,即3。此后,我们需要在左侧填充该字符串,直到完整字符串的长度达到函数中指定的长度为止。在这种情况下6。由于未提供 padchar ,因此我们需要在空格处填充它:

   abc

这是一个包含3个空格和初始字符串的字符串,结果是一个长度为6的字符串。这是给定padchar的示例:

left_pad("abc", 6, "-")

我们只做与上面的示例相同的操作,但是用padchar替换空格。在这种情况下,连字符:

---abc

任务

给定字符串length以及可能的附加参数padchar,输出左侧填充的字符串。您可以假定长度数字等于或大于字符串的长度。padchar始终由1个字符组成。

测试用例

left_pad("string", length, ("padchar")) === "left-padded string"

left_pad("foo", 5) === "  foo"
left_pad("foobar", 6) === "foobar"
left_pad("1", 2, "0") === "01"
left_pad("1", 2, "-") === "-1"

这是,因此字节数最少的提交将获胜!


13
@ m0sa仍然有一些问题。强烈建议不要将挑战限制为javascript,没有其​​他语言可以参与的理由。该规范应描述所需的行为和可能的允许输入范围,而无需遵循链接。目前尚不清楚如何处理第三个参数。
xnor

8
我敢肯定,可以出于动机考虑使用与Java语言相关的参考,而不必说“因此不允许使用其他语言”。如果您对查看最佳Javascript条目特别感兴趣,则可以为此提供赏金,同时仍然可以挑战其他语言。
trichoplax

6
禁止或者不禁止使用单个语言的问题。如果禁止使用,请关闭此功能。如果允许,让OP根据需要限制问题。
Sklivvz

10
@Sklivvz(和m0sa)在少数情况下,特定于语言的挑战才有意义,特别是如果挑战要求某种语言的某些非常独特的功能才有意义,甚至一开始就是挑战。这是允许使用它们的主要原因,也是为什么我也反对完全禁止使用它们的原因。这就是说,对于任何挑战以任何语言意义的,没有充分的理由将其限制为一种语言。否则,我们将有“在JavaScript中排序数组”,“在Ruby中排序数组”,“在Python中排序数组” ...以及300多个挑战,这些挑战根本没有任何好处。
马丁·恩德

8
@Sklivvz正如trichoplax所说,这是挑战的良好动力,但归结为一个非常简单的字符串处理任务,该任务在任何其他语言中都具有同等意义。与任何其他语言相比,在JavaScript中挑战并不是特别困难,可行或有趣(特别是,可能有人不了解左键包,并且仍然会在不受语言限制的情况下问这个问题,而JavaScript中的答案不会根本没有受到影响,也没有人会想到“为什么不只使用JS?”。
马丁·恩德

Answers:


20

Pyth,13 11字节

+*.xwd-Qlzz

在这里尝试

将来自STDIN的输入作为第一行的字符串,第二行的长度,第三行的填充char(可选)。


4
假定这仅是javascript
MMM

22
@MMM挑战中的语言限制已广为人知,以至于我希望它会被忽略。没有人喜欢被告知“ 不能参加”。
xnor


2
坚持下去!你去门把手!不要让你的梦想成为梦想!去做就对了!
Mave

4
'这是一个邪恶的社会,主持人是公民不服从的社会!
2016年

13

JavaScript(ES6),43个字节

f=(s,n,p=" ",r=p)=>(r+=s+="")[n]?s:f(r,n,p)

1
您缺少第三个参数
m0sa

@ m0sa谢谢,已修复。
尼尔

它现在没有通过第三次测试;-)
Sklivvz

1
@Sklivvz哎呀,这就是我没有正确阅读要求所得到的。
尼尔

代替p+=s,您可以添加2个字节来使它p+=[s]生效。
Aplet123 '16

7

JavaScript(ES6),37 43 44字节

(a,n,c=' ')=>((c+'').repeat(n)+a).substr(-n)

测试:

> f=(a,n,c)=>((c?c:" ").repeat(n)+a).substr(-n)
< function (a,n,c)=>((c?c:" ").repeat(n)+a).substr(-n)
> f('foo', 5) === '  foo';
< true
> f('foobar', 6) === 'foobar';
< true
> f(1, 2, 0) === '01';
< true
> f(1, 2, '-') === '-1';
< true

不知道您是否要计算函数声明,我会对此进行内联。


我认为一般来说,除非问题明确要求提供完整的程序而不是功能,否则我们不会计算功能声明。
Deusovi'3

slice比短substr
Mama Fun Roll

@Deusovi对。我的意思是我不会这样做console.log(f("whatever",10, "*")),但是console.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz

7

Javascript ES6,35个字节

(s,l,c=' ')=>c.repeat(l-s.length)+s

试试吧。我相信这是Java语言中目前可能的最短实现。


这是我要做的,除了它不是匿名函数。
Aplet123

@ Aplet123我认为按照比赛的定义,这是可以的。它只是在要求功能。在这种情况下命名它无关紧要,或者至少这就是我根据其他答案所认为的。
David

5

Python 3、33 31 29字节

lambda a,b,x=" ":a.rjust(b,x)

非常坦率的。感谢@xnor提醒我str.rjust这件事。:P

对于相同的长度(也感谢xnor):

lambda a,b,x=" ":(x*b+a)[-b:]

先前的解决方案:

lambda a,b,x=" ":x*(b-len(a))+a

(x*b+a)[-b:]或做的时间要短一些a.rjust(b,x)。实际上,str.rjust它本身可以为整个事情工作。
xnor

@xnor我忘了rjust是内置的,谢谢!

这些都不遵循规范:f(1, 2, 0) === '01';
Valentin Lorentz

@ValentinLorentz我要求OP澄清默认情况下不强制将数字强制转换为字符串并且没有得到答案的语言。由于此问题没有正式的规范,因此我将假定参数均为字符串。

现在有一个规范,解决方案1无效(在Python 2.7.10上测试)
CalculatorFeline

5

05AB1E11 9字节

码:

g-ð³0@×¹«

说明:

g          # Implicit first input, take the length.
 -         # Substract the length with the second input.
  ð³       # Push a space and if the third input exists, also the third input.         
    0@     # Reposition the first element of the stack to the top (zero-indexed).
      ×    # Multiply the character with the difference in length.
       ¹«  # Concatenate the first input to the string.

使用CP-1252编码。在线尝试


1
所有这些字符都适合Jelly代码页(0x672D188330401181FA)
CalculatorFeline

5

JavaScript(ES5),70个字节

使用递归...

function f(s,c,p,u){return(s+'').length<c?f((p==u?' ':p+'')+s,c,p):s}

我最初的任务只有57个字节:

function f(s,c,p){return s.length<c?f((p||" ")+s,c,p):s}

但是只通过了前两个测试:

> f('foo', 5) === '  foo';
true
> f('foobar', 6) === 'foobar';
true
> f(1, 2, 0) === '01';
false
> f(1, 2, '-') === '-1';
false

我仍然喜欢较短的代码,因为实际上,将数字传递给字符串操作函数不是我所需要的功能。


4

Mathematica,13个字节

StringPadLeft

仅限内置答案#3(第一个是Range,第二个是Surd)或更小的内置式:(35个字节)

##2~StringRepeat~(#3-Length@#2)<>#&

我可以安静地投票吗?
edc65

2
...为什么?是因为这只是内置的吗?41字节的Python答案#1(不再有效)只是内置函数的包装。
CalculatorFeline

It's common practice to disallow built-ins that exactly implement what the challenge asks if that's a concern.(呼吁当局:马丁)(但也有常识)
edc65

@ edc65 相关meta post。我很确定它是允许的,因为默认情况下通常允许内置。要了解相关的内置功能,需要用户方面的创造力和知识。
mbomb007 '16

1
@ mbomb007允许-创意号。我没有将此答案标记为无效,而是
保留

3

朱莉娅,4个字节

lpad

通过所有测试用例:

julia> lpad("foo", 5)
"  foo"

julia> lpad("foobar", 6)
"foobar"

julia> lpad(1, 2, 0)
"01"

julia> lpad(1, 2, '-')
"-1"

它适用rect 7 cor吗?
CalculatorFeline

是。lpad("rect", 7, "cor") => "correct"
凤阳王

3

Javascript(ES6),55个字节

(a,n,c=' ',s=a+'')=>(new Array(++n-s.length).join(c)+s)

创建一个空值数组并加入版本。

(a,n,c=' ')=>{a+=''; return new Array(++n-a.length).join(c)+a}

更具可读性,但return增加了一些字符。


由于这个问题被搁置,我将把答案放在最像我的JS答案下面。43个字节(s,n,c ='')=>(Array(n).join(c)+ s).slice(-n)
Charlie Wynn

提示:`inline code blocks.
CalculatorFeline

+=返回其左操作数的值,因此第二个版本变短:(a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)但是,当您添加多字符填充字符串时,它变长。
CalculatorFeline

3

重击,57字节

参数:字符串宽度padchar

printf -vX %$2s;Y="${X// /${3- }}$1";echo -n "${Y:${#1}}"

做成一串宽度空格。

将每个空格字符转换为padchar

先写padding然后写string


2

Python,41个字节

lambda a,b,x=' ':str(a).rjust(b,str(x))

没有内置的正则,43个字节:

lambda a,b,x=' ':str(x)*int(b/2%3)+str(a)

(不是人们期望的,但是它通过了测试套件)


您可以删除s=str和替换sstr的相同的字节数。
CalculatorFeline

2

果冻,12 字节

L⁴_ẋ@⁵⁵⁶<?¤³

如此多的变量引用。果冻不应该是一种默认语言吗?

在线尝试!

怎么运行的

L⁴_ẋ@⁵⁵⁶<?¤³  Main link
              Arguments: string (³), length (⁴), padchar (⁵, defaults to 10)

L             Compute the length of ³.
 ⁴_           Subtract the length from ⁴.
          ¤   Combine the two links to the left into a niladic chain:
     ⁵          Yield ⁵.
      ⁵⁶<?      Yield ⁵ if ⁵ < ⁵, else ⁶.
              Comparing a number with itself gives 0 (falsy), but comparing a
              string / character list with itself gives [0] (truthy).
   ẋ@         Repeat the result to the right as many times as specified in the
              result to the left.
           ³  Print the previous return value and return ³.

padchar (⁵, defaults to 10)它不应该默认为20or 32吗?

1
上标3至9是初始化为参数(如果存在)或一些有用的默认值的常量。条件?语句检查其默认值是否为10,并在这种情况下产生一个空格。
丹尼斯

2

JavaScript ES7,16个字节

''.padStart.bind

内置ftw!仅适用于Firefox 48及更高版本。有效,因为此功能于3月12日添加。

这需要像这样的输入:

(''.padStart.bind)(arg1)(arg2,arg3)

1

派克,67字节

mixed n(mixed a,int b,mixed x){return x!=""?x:" "*(b-strlen(a))+a;}

感叹。空字符串的""计算结果为true为什么!?

混合混合混合混合派克汤...


Another language with stupid truthys.
CalculatorFeline

@CatsAreFluffy yeah, Pike is kinda weird, but it has nice string processing utilities.
cat

1

Pyke, 12 bytes (noncompeting)

added input node, bugfix on len node, change default results on assign node after the challenge was posted.

\ =zzjl-z*j+

Explanation:

\ =z         - assign default input for `z` to be " " (Will still prompt but no input will return a space instead)
    zj       -     j = input()
      l      -    len(j)
       -     -   eval_or_not_input() - ^
        z*   -  ^*input()
          j+ - ^+j

+1 because answering in the language is helping you refine it :)
cat

I've edited the format of your header to make it easier to read & easier for userscripts, etc to parse -- roll it back if you disagree.
cat

Why the downvote?
Blue

1
@muddyfish It seems that every non-Javascript answer here is downvoted.
Adnan

@AandN thats just not nice... Also why I couldn't see a pattern from the top 6 answers
Blue

1

JavaScript ES6, 38 bytes

(s,l,c=" ")=>(c.repeat(l)+s).slice(-l)

An alternate solution.


1

JavaScript (ES6), 34 bytes

I used a recursive solution.

f=(s,l,c=' ')=>s[l-1]?s:f(c+s,l,c)

0

Ruby, 42 bytes

def left_pad(s,t,p=" ");p*(t-s.size)+s;end

Parameters: string, size, padchar.

Test suite below; should print all "true"s, just put everything in the same file.

puts left_pad("foo", 5) == "  foo"
puts left_pad("foobar", 6) == "foobar"
puts left_pad("1", 2, "0") == "01"
puts left_pad("1", 2, "-") == "-1"

You don't need to use that method name... and you can probably make it a lambda, too. (All the other examples do similar)
Not that Charles

0

Java 8, 86 88 bytes

This is a function. The third argument is a varargs to allow the optional pad char (defaults to ' ')

String p(String s,int l,char...p){return s.length()<l?p((p.length>0?p[0]:' ')+s,l,p):s;}

Recursion! +2 bytes (added brackets because of incompatible type error)


This TypeErrors. Can always test Ideone (Java 7, but I get the same exact error in Java 8 on my box) ideone.com/B7gTA5
cat

0

PHP, 54 48 bytes

Uses Windows-1252 encoding.

function(&$s,$l,$p=~ß){$s=str_pad($s,$l,$p,0);};

Run like this (-d added for easthetics only):

php -r '$f = function(&$s,$l,$p=~ß){$s=str_pad($s,$l,$p,0);}; $s="foo";$f($s,5);echo"$s\n";' 2>/dev/null

Old version (without the builtin):

function(&$s,$l,$p=~ß){for(;strlen($s)<$l;)$s=$p.$s;};

Tweaks

  • Saved 6 bytes by using str_pad instead of a loop. Leaving the old one for reference, as builtins are frowned upon

0

R, 50 bytes

Late to the party again but here it goes:

function(s,n,p=" ")cat(rep(p,n-nchar(s)),s,sep="")

This simply prints the output to stdout but does not actually return the padded string (wasn't sure if this is a requirement for the challenge). If this is needed, the solution is slightly longer at 61 bytes:

function(s,n,p=" ")paste0(c(rep(p,n-nchar(s)),s),collapse="")

-3

C, 64 bytes

f(s,n,c,p){return memset(p,c,asprintf(&p,"%*s",n,s)-strlen(s));}

Try it here.


2
This does not comply with the specification, as it does not default to space when a character is not provided.
Doorknob

This code doesn't run as given. gcc will let undefined reference to function printf pass and include printf itself, but no such luck for memset, asprintf, and strlen. You need to add the #include<string.h>... etc definitions to make this valid.
cat

@tac Hmmm...I wrote and tested my answer completely within ideone. It compiles and runs successfully on that platform, though it states that it uses gcc-5.1. I'm not sure if they're using compiler flags or what-have-you behind the scenes that I'm not aware of. I was initially using this as my justification for it not running in your environment, but now I'm not sure...
Cole Cameron

well, this is gcc 5.2.1 on Linux, so you might be able to get away with saying Ideone C, 64 bytes but if you're gonna claim it's C, make it compile. :p
cat

I'm only a beginner at C: Why does f take four parameters, not 3? Are you requiring the address of the string, or...? either way, f should take at most 3 arguments.
cat
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.