자바 스크립트 왼쪽 패드 골프


27

소개

왼쪽 패드 npm 패키지 fallout 이후에 왼쪽 패드 를 구현하기위한 코드 골프가 있습니다.

왼쪽 패드 기능은 양식에,이 개 기본 인수 및 1 개 추가 인수로 구성 문자열 , 길이 , ( padchar ). padchar이 제공되지 않으면 공백 문자로 표준화 됩니다 . 두 가지 인수로 예를 들어 봅시다.

left_pad("abc", 6)

먼저 문자열의 길이 인 3 을 관찰합니다 . 그런 다음 전체 문자열의 길이가 함수에 지정된 길이에 도달 할 때까지 왼쪽에서이 문자열을 채워야합니다. 이 경우 6 . padchar이 주어지지 않았 으므로 공백으로 채워야 합니다.

   abc

이것은 공백이 3 개인 문자열이고 초기 문자열이며 길이가 6 인 문자열이됩니다. 다음은 padchar를 사용한 예입니다.

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

위의 예와 동일하지만 공백을 padchar로 바꿉니다. 이 경우 하이픈은 다음과 같습니다.

---abc

작업

주어진 문자열 , 길이 , 그리고 어쩌면 추가 인수 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 여전히 몇 가지 문제가 있습니다. 자바 스크립트에 대한 도전을 제한하는 것은 강력히 권장되지 않습니다. 다른 언어가 이에 참여할 수있는 이유는 없습니다. 사양은 링크를 따를 필요없이 원하는 동작과 허용되는 입력 범위를 설명해야합니다. 세 번째 매개 변수가 어떻게 처리되는지는 명확하지 않습니다.
xnor

8
나는 "따라서 다른 언어를 사용할 수 없다"고 말하지 않고 자바 스크립트와 관련된 참조가 동기 부여를 위해 만들어 질 수 있다고 확신한다. 최고의 Javascript 항목을 보는 데 특히 관심이 있다면 다른 언어에 대한 도전 과제를 열어두고 현상금을 제공 할 수 있습니다.
trichoplax

6
단일 언어 질문은 금지되거나 그렇지 않습니다. 금지 된 경우이를 닫으십시오. 허용되는 경우 OP가 원하는대로 질문을 제한하도록합니다.
Sklivvz

10
@Sklivvz (및 m0sa) 언어 별 문제가 이해되는 경우가 드문 경우가 있습니다. 특히 문제가 처음에 이해가되거나 문제가되는 언어의 고유 한 기능이 필요한 경우에는 더욱 그렇습니다. 그것이 그것들이 허용되는 주된 이유이며, 또한 그것들을 완전히 거부하는 것에 반대하는 이유입니다. 말했다 즉, 어떤 도전을 하지 어떤 언어로 메이크업의 의미를 하나 개의 언어로 제한 할 좋은 이유가 없습니다. 그렇지 않으면 "자바 스크립트에서 배열 정렬", "루비에서 배열 정렬", "파이썬에서 배열 정렬"등의 이점을 얻을 수 있습니다.
Martin Ender

8
@Sklivvz trichoplax가 말했듯이 이것은 도전에 대한 훌륭한 동기 부여이지만 다른 언어와 마찬가지로 매우 간단한 문자열 처리 작업으로 귀결됩니다. 이 문제는 다른 언어와 비교하여 JavaScript에서 구체적으로 어렵거나 실행 가능하지 않거나 흥미롭지 않습니다. t는 전혀 영향을받지 않았으며, "이 JS 만 아닌 이유는 무엇입니까?"
Martin Ender

답변:


20

Pyth, 13 11 바이트

+*.xwd-Qlzz

여기에서 시도하십시오 .

STDIN에서 입력을 첫 번째 행의 문자열, 두 번째 행의 길이 및 선택적으로 세 번째 행의 패딩 문자로 가져옵니다.


4
이것은 자바 스크립트 일 뿐이라고 가정합니다.
MMM

22
챌린지의 @MMM 언어 제한은 보편적으로 싫어하므로 요약을 무시할 것으로 예상됩니다. 아무도 이야기 할 좋아하지 않는다 " 당신이 참여할 수 없습니다."
xnor


2
남자에게 붙어! 당신은 Doorknob을 간다! 당신의 꿈을 꿈꾸지 마십시오! 그냥 해!
Mave

4
'중재자가 시민 불복종을하는 사악한 사회입니다!
Ven

13

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

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

1
당신은 세 번째 매개 변수가 없습니다
m0sa

@ m0sa 감사합니다.
Neil

세번째 테스트에 실패했습니다. ;-)
Sklivvz

1
@Sklivvz Ugh, 그것이 요구 사항을 제대로 읽지 못했을 때 얻는 것입니다.
Neil

대신에 p+=s2 바이트를 추가하여 만들면 p+=[s]작동합니다.
Aplet123

7

자바 스크립트 (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

slice보다 짧습니다 substr.
Mama Fun Roll

@Deusovi 맞습니다. 내 말은 내가하지 않을 것입니다 console.log(f("whatever",10, "*")),하지만console.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz

7

자바 스크립트 ES6, 35 바이트

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

시도 해봐. 나는 이것이 자바 스크립트에서 현재 가능한 가장 짧은 암시라고 생각합니다.


이것은 익명의 기능이 아닌 것을 제외하고 내가하려고했던 것입니다.
Aplet123

@ Aplet123 컨테스트의 정의에 따르면 이것이 예상되는 것 같습니다. 그것은 단지 기능을 요구하는 것이 었습니다. 이 맥락에서 그것은 무의미하거나 적어도 다른 대답에 기초하여 생각할 것입니다.
David

5

파이썬 3, 33 31 29 바이트

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

매우 간단합니다. 나에게 상기시켜주는 @xnor 에게 감사한다 str.rjust. :피

동일한 길이 (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

05AB1E , 11 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
이 모든 문자는 젤리 코드 페이지에 맞습니다 (0x672D188330401181FA)
CalculatorFeline

5

자바 스크립트 (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)<>#&

조용히 downvote 할 수 있습니까?
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.(권한에 대한 이의 제기 : Martin) (그러나 상식도)
edc65

@ edc65 관련 메타 포스트 . 기본적으로 내장 기능이 일반적으로 허용되므로 허용됩니다. 관련 내장 기능을 알기 위해서는 사용자의 창의성과 지식이 필요합니다.
mbomb007

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"
Fengyang Wang

3

자바 스크립트 (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 = '') => (배열 (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 로 변환하십시오 .

패딩을 쓴 다음 string을 작성하십시오 .


2

파이썬, 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)기본값이 아니 20거나 32?
cat

1
위첨자 3 ~ 9는 인수 (있는 경우) 또는 유용한 기본값으로 초기화되는 상수입니다. 조건부 ?에는 기본값 10이 있는지 확인하고이 경우 공백이 생깁니다.
Dennis

2

자바 스크립트 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. 왜!?

혼합 혼합 혼합 혼합 혼합 파이크 수프 ...


바보 같은 진리를 가진 또 다른 언어.
CalculatorFeline

@CatsAreFluffy 네, Pike는 다소 이상하지만 멋진 문자열 처리 유틸리티가 있습니다.
고양이

1

파이크 , 12 바이트 (비경쟁)

입력 노드 추가, len 노드의 버그 수정, 챌린지 게시 후 할당 노드의 기본 결과 변경.

\ =zzjl-z*j+

설명:

\ =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 언어로 응답하면 언어를 개선하는 데 도움이되기 때문에 : 1
cat

사용자 스크립트 등을 쉽게 읽고 분석 할 수 있도록 헤더 형식을 편집했습니다. 동의하지 않으면 롤백하십시오.
고양이

왜 공감해야합니까?
Blue

1
@ muddyfish 여기에있는 모든 비 Javascript 답변은 downvoted 된 것 같습니다.
Adnan

@AandN 그게 좋지 않아 ... 또한 왜 내가 상위 6 답변에서 패턴을 볼 수 없었는가
Blue


1

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

재귀 솔루션을 사용했습니다.

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

0

루비, 42 바이트

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

매개 변수 : 문자열, 크기, padchar

아래 테스트 스위트; 모든 "true"를 인쇄해야합니다. 모든 것을 동일한 파일에 넣으십시오.

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"

그 메소드 이름을 사용할 필요가 없습니다 ... 아마도 람다로 만들 수도 있습니다. (다른 모든 예는 비슷합니다.)
Charles Charles

0

자바 8, 86 88 바이트

이것은 기능입니다. 세 번째 인수는 varargs선택적 패드 문자를 허용하는 것입니다 (기본값은 ' ').

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

재귀! +2 바이트 (호환되지 않는 유형 오류로 인해 대괄호가 추가됨)


이 TypeErrors. 항상 Ideone을 테스트 할 수 있습니다 (Java 7이지만 Java 8에서도 동일한 오류가 발생합니다) ideone.com/B7gTA5
cat

0

PHP, 54 48 바이트

Windows-1252 인코딩을 사용합니다.

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

다음과 같이 실행하십시오 ( -d동독에만 추가됨).

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

이전 버전 (내장없이) :

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

조정

  • str_pad루프 대신 사용하여 6 바이트를 절약했습니다 . 내장이 눈살을 찌푸 리면서 오래된 것을 참조로 남겨 두십시오.

0

R, 50 바이트

다시 파티에 늦었지만 여기에 간다.

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

이것은 단순히 출력을 stdout으로 인쇄하지만 실제로 채워진 문자열을 반환하지는 않습니다 (이것이 챌린지의 요구 사항인지 확실하지 않음). 이것이 필요한 경우 솔루션은 61 바이트에서 약간 더 깁니다.

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

-3

C, 64 바이트

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

여기에서 시도 하십시오 .


2
문자가 제공되지 않은 경우 공백으로 기본 설정되지 않으므로 사양을 준수하지 않습니다.
Doorknob

이 코드는 주어진대로 실행되지 않습니다. gcc할 수 없습니다 undefined reference to function printf패스를하고 등 printf자체 만에 그런 행운 memset, asprintf그리고 strlen. #include<string.h>이것을 유효하게 하려면 ... etc 정의 를 추가해야 합니다.
고양이

@tac Hmmm ... 아이디 온 내에서 내 대답을 완전히 작성하고 테스트했습니다. 이 플랫폼은을 사용한다고 명시하지만 해당 플랫폼에서 성공적으로 컴파일 및 실행됩니다 gcc-5.1. 그들이 모르는 장면 뒤에서 컴파일러 플래그를 사용하는지 또는 무엇을 가지고 있는지 잘 모르겠습니다. 나는 처음에 이것을 당신의 환경에서 실행되지 않는 것에 대한 정당화로 사용 했지만 지금은 확실하지 않습니다 ...
Cole Cameron

글쎄, 이것은 gcc 5.2.1Linux에 있기 때문에 말하는 것을 피할 Ideone C, 64 bytes수는 있지만 C라고 주장한다면 컴파일하십시오. : p
고양이

나는 C의 초보자입니다. 왜 f3이 아닌 4 개의 매개 변수를 사용합니까? 문자열의 주소가 필요합니까, 아니면 ...? 어느 쪽이든, f최대 3 개의 인수를 취해야합니다.
고양이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.