최고의 제로 도전


31

도전

두 개의 정수가 입력 ( xy) 으로 주어지면 부호가없는 문자 x가되기 위해 선행 0이 필요한 문자열로 출력 됩니다 y.

규칙

  • 경우 x보다이 y자리, 출력 x수정없이 문자열을.

  • 선행 0이 없어도 정수로 출력 할 수 없습니다.

  • 경우 x음극이 상기 유지 -대로 절대 값 동작한다.

  • 음수 y는 0으로 처리해야합니다 (즉, x문자열로 출력 됨).

예 :

IN: (1,1)   OUT: "1"
IN: (1,2)   OUT: "01"
IN: (10,1)  OUT: "10"
IN: (-7,3)  OUT: "-007"
IN: (-1,1)  OUT: "-1"
IN: (10,-1) OUT: "10"
IN: (0,0)   OUT: "0"
IN: (0,1)   OUT: "0"
IN: (0,4)   OUT: "0000"

바이트 단위의 최단 코드가 이기고 표준 허점이 적용됩니다.



1
x를 문자열로 사용할 수 있습니까?
LiefdeWen

무엇을 (-1,1)제공합니까?
Adám

@ Adám이 예제에 추가했습니다.
Brian H.

1
+양수에 선행 부호를 사용할 수 있습니까?
톰 카펜터

답변:


4

Japt , 13 8 바이트

첫 번째 입력 ( x)을 문자열로 사용합니다.

®©ùTV}'-

시도 해봐

ETH 프로덕션 덕분에 대량의 5 바이트를 절약했습니다.


설명

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

® }'-U빼기 기호의 배열로 분할 하고 그 위에 매핑 한 다음 빼기 기호가있는 문자열에 다시 결합합니다.

©논리 AND ( &&)이므로 현재 요소가 진실 (빈 문자열이 아닌 경우) 인 경우 왼쪽 ( ù)을 0 ( T)으로 length 로 채 웁니다 V.


좋은 것! 당신은 단순히 주변에 매핑하여 꽤 절약 할 수 있습니다 -: ethproductions.github.io/japt/...
ETHproductions을

@ETHproductions : 대단한 전화. 감사. 내가 그렇게 한 지 오래되어 왔기 때문에 한 가지 방법으로 문자열을 분할하고 매핑하고 다시 합칠 수 있다는 것을 완전히 잊어 버렸습니다!
Shaggy

예, 그 기능이 이동해야 가정 q다음이 될 것이다, q-_©ùTV1 바이트 :-) 저장
ETHproductions

@ETHproductions, 내가 이해하고 있다면, 함수가 S.q()(우리를주는 S.q(s,f)) 의 두 번째 인수로 전달 S되면 분할되고 s, 실행 f되고 다시 결합 될 것이라고 제안하는 것 입니다 s. 나는 그것을 좋아한다! :)
Shaggy

(함수를 통과하면,이 함수를 통해 실행 정상적인 기능을 수행하고, 첫 번째 변경을 취소 그래, 난 올리버에게 말을하지 당신은 그 일에 대해 않았다 N.s, S/A.y, N.ì방법의 무리와 함께 이미이 작업을 수행)? 나는 누군가와 대화를 나, 다. 나는 이제 누가 누군지 기억할 수 없다. :
ETHproductions



6

05AB1E , 11 10 바이트

로 주어진 입력 amount_of_digits, number

ÎIÄg-×ì'-†

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

설명

Î            # push 0 and first input
 IÄ          # push the absolute value of the second input
   g         # length
    -        # subtract, (input1-len(abs(input2))
     ×       # repeat the zero that many times
      ì      # prepend to the second input
       '-†   # move any "-" to the front

내일이 나아지지 않으면 받아 들일 것입니다.
Brian H.

당신은 outgolfed했습니다 :(
Brian H.

@BrianH. 실제로 나는 :)
Emigna




5

자바 스크립트 (ES6), 42

재귀 적이며, 매개 변수는 역순으로, 먼저 y 다음에 x입니다. 그리고 카레

y=>r=x=>x<0?'-'+r(-x):`${x}`.padStart(y,0)

테스트

var F=
y=>r=x=>x<0?'-'+r(-x):`${x}`.padStart(y,0)

;`IN: (1,1)   OUT: "1"
IN: (1,2)   OUT: "01"
IN: (10,1)  OUT: "10"
IN: (-7,3)  OUT: "-007"
IN: (-1,1)  OUT: "-1"
IN: (10,-1) OUT: "10"
IN: (0,0)   OUT: "0"
IN: (0,1)   OUT: "0"
IN: (0,4)   OUT: "0000"`
.split(`\n`).map(r => r.match(/[-\d]+/g))
.forEach(([x,y,k])=>{
  o = F(y)(x)
  ok = o == k
  console.log(ok?'OK':'KO',x,y,'->', o)
})


인상적이지만이 답변이 f(y)(x)대신 함수 를 정의하여 규칙에 약간 영향을 미친다고 생각합니다 f(x,y).
styletron

"커링"규칙을 읽으면서, 나는 이의 제기가 카레 자체가 아니라 역전 된 패러 즘에 더 가깝다고 덧붙이고 싶었다.
styletron

1
@styletron 매개 변수의 순서는 시도에서 지정되지 않습니다. 그래서 이것을 활용할 수 있습니다
edc65

Dang, y=>r=x=>x<0?'-'+r(-x):(x+='')[y-1]?x:r(0+x)너무 가까이 온다
ETHproductions

입력 순서를 바꾸는 사람들에게는 문제가 없습니다.
Brian H.


5

bash, 27 , 25 바이트

Bruce Forte 덕분에 -2 바이트

printf %0$[$2+($1<0)]d $1

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


1
패딩 길이를 인라인하여 2 바이트절약 할 수 있습니다 . 또 다른 흥미로운 것 (28 바이트) : printf %\ 0$[1+$1]d $2|xargs.
ბიმო

어쩌면 당신은 printf %\ 0$[1+$2]d $1|xargs, 부호가 숫자에 대한이 형식을 기억하지 않았다 xargs는 선행 공간을 제거하는 트릭
Nahuel Fouilleul

5

껍질 , 12 바이트

Ö±Ωo≥⁰#±:'0s

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

설명

Ö±Ωo≥⁰#±:'0s  Inputs are y=4 and x=-20
           s  Convert x to string: "-20"
        :'0   Prepend '0'
  Ω           until
      #±      the number of digits
   o≥⁰        is at least y: "00-20"
Ö±            Sort by is-digit: "-0020"
              Print implicitly.

5

R, 56 48 바이트

function(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)

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

djhurio 덕분에 -8 바이트

설명

  • sprintf("%0zd",x)x길이가 0으로 채워진 문자열로 반환z
  • paste0("%0",y+(x<0),"d")문자열 구축 "%0zd", z이다 y, 플러스 1의 경우를x 0보다 작 으면 더합니다.
  • 경우 z에서의 자리수보다 작은 x, x있는 그대로 문자열로 인쇄

48 바이트function(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)
djhurio

@djhurio 브릴리언트! 나는 그것이 내 편집 내용이 아닌 다른 대답을 보증한다고 생각합니다.
duckmayr

편집으로 만들 수 있습니다. 이 솔루션은 다른 기능을 사용하는 것과 크게 다르지 않습니다.
djhurio

4

Alice , 23 바이트

/oRe./'+Ao
\I*tI&0-R$@/

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

입력은 첫 번째 줄의 숫자와 두 번째 줄의 너비로 줄 바꿈되어 있어야합니다.

설명

/...
\...@/

이것은 서수 모드에서 선형 프로그램에 대한 일반적인 프레임 워크입니다. 이 경우 유일한 발견은 다음과 같습니다.

.../...
...&...

그러면 &서수 모드로 다시 시작하기 전에 IP가 카디널 모드로 수직으로 들어가고 카디널 모드 로만 실행됩니다.

그런 다음 지그재그 제어 흐름을 펼치면 다음이 제공됩니다.

IRt.&'-A$o*eI/&/0+Ro@

I    Read the first line of input (the value) as a string.
R    Reverse the string.
t.   Split off the last character and duplicate it.
&    Fold the next command over this string. This doesn't really do anything,
     because the string contains only one character (so folding the next
     command is identical to executing it normally).
'-   Push "-".
A    Set intersection. Gives "-" for negative inputs and "" otherwise.
$o   If it's "-", print it, otherwise it must have been a digit which we
     leave on the stack.
*    Join the digit back onto the number. If the number was negative, this
     joins the (absolute value of the) number to an implicit empty string,
     doing nothing.
e    Push an empty string.
I    Read the width W.
/&/  Iterate the next command W times.
0    Append a zero. So we get a string of W zeros on top of the absolute
     value of the input number.
+    Superimpose. This takes the character-wise maximum of both strings
     and appends extraneous characters from the longer string. Since the
     string of zeros can never be larger than the digits in the input,
     the input itself will be uneffected, but extraneous zeros are appended,
     padding the string to the required length.
R    Reverse the result.
o    Print it.
@    Terminate the program.

다음은 카디널 H( abs )을 사용 하여 -다음을 제거 하는 23 바이트의 두 가지 대안 입니다 .

/R.I&0-RoH
\Ie#\'+Ao\@/

/R.H#/.+Xo
\Ie\I&0QRo@/

원칙적으로 이것들은 더 짧은 명령이지만 &스택에 1 문자 문자열이있는 위치에는 맞지 않으므로 a로 건너 뛰어야합니다 #.



4

, 16 13 바이트

‹N⁰﹪⁺⁺%0ηd↔Iθ

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

이것은 선행 또는 후행 공백을 인쇄하지 않고 숯을 사용할 수있는 가장 짧은 것입니다. 적어도 지금은 사용법을 이해하기 시작했습니다.Modulo 함수를 문자열을 형식화 .

디버 보스 코드는 다음과 같습니다.

Print(Less(InputNumber(),0));    # Prints a - if the first input is less than 0
Print(Modulo(Add(Add("%0",h),"d"),Abs(Cast(q))));   # q: first input;  h: second input
  • Neil 덕분에 3 바이트가 절약되었습니다!

1
-목탄에서 인쇄 하거나 아무것도 인쇄 하기가 쉽지 -않습니다. 인쇄 하는 동안 1 을 인쇄하면 0이 인쇄되지 않습니다. 따라서 삼항은 불필요한 것으로 3 바이트를 절약합니다.
Neil

당신이 교체되면 InputNumber()으로 Cast(q), 나는 당신이 다음 다른 바이트를 저장하는 문자열 비교로 전환 할 수 있다고 생각합니다.
Neil

@Neil 나는 내가 단순화 할 수 있다는 것을 알고 있었다 Ternary!
Charlie


4

PHP, 45 바이트

printf("%0".($argv[2]+(0>$n=$argv[1])).d,$n);

또는

[,$n,$e]=$argv;printf("%0".($e+(0>$n)).d,$n);       # requires PHP 7.1 or later

온라인으로 실행 -nr하거나 사용해보십시오 .


해당 링크에서 코드를 실행할 때 오류가 발생했습니다.
Shaggy

@Shaggy 두 번째 버전은 PHP 7.1이 필요합니다
디도

I went on and on about this, and I arrived to exactly this answer. I believe this is the optimal version
Ismael Miguel

3

Mathematica, 118 bytes

(j=ToString;If[#2<=0,j@#,If[(z=IntegerLength@#)>=#2,t=z,t=#2];s=j/@PadLeft[IntegerDigits@#,t];If[#>=0,""<>s,"-"<>s]])&


Try it online!


3

Mathematica, 63 62 bytes

If[#<0,"-",""]<>IntegerString[#,10,Max[#2,IntegerLength@#,1]]&

Try it online!


2
Welcome to PPCG! I think this isn't quite doing what you want. You probably meant IntegerLength instead of IntegerDigits. You can save a byte by using IntegerLength@# instead of IntegerLength[#] though.
Martin Ender

Thank you! I was copying the code from another computer by hand where I was testing it and I indeed mistyped IntegerDigits for IntegerLength. It should work now. I have also added a TIO link with all the test cases in the challenge description (+1) showing that it works as expected. Thank you also for the suggestion for saving an extra byte! I don't know how I missed it before. :)
MatjazGo

2

Excel, 29 bytes

Using Excel's TEXT functionality ("Converts a value to text in a specific number format").

x in A1, y in B1

=TEXT(A1,REPT("0",MAX(1,B1)))

You can drop the ))) for -3 Bytes by converting to Google Sheets
Taylor Scott




2

Japt, 14 12 bytes

Saved 2 bytes thanks to @ETHproductions

s r"%d+"_ù0V

Try it online


It's a bit cheaper to keep the minus sign in and just mess with the digits: Test it online
ETHproductions

@ETHproductions: Or take x as a string for 10 bytes.
Shaggy

@ETHproductions thanks fellas. I'll update it when I get back to my desk.
Oliver

@Shaggy Looks like you posted your own answer, so I'll use ETHproduction's trick. Thanks though.
Oliver

Oliver, that 10-byter is just @ETHproduction's 12-byte solution upgraded to Japt 2.0a0 with U as a string allowing us to golf off the first 2 characters.
Shaggy

2

PowerShell, 25 40 bytes

param($a,$b)$a|% *g $("D$b"*($b|% *o 0))

Try it online!

Explanation

This calls .ToString() on the number with a generated format string, but multiplies it by -1, 0, or 1 based on whether $b (y) is negative, 0, or positive respectively; this is to handle negative y values which format strings don't by themselves.

This seems to require wrapping negative numbers in a substatement () for it to work which is just a quirk of the invocation when using literals; if passed variables of type integer, it would not need that.


It looks like both of these fail when y is negative.
Shaggy

@Shaggy ugh good catch. Removed second solution altogether and fixed up the first, thanks!
briantist

Ouch, 15 bytes! Sorry!
Shaggy

@Shaggy heh, one of these days I'll actually write the PowerShell-based golfing language I've been thinking about. This actually pushed me to research a bit more and get closer to starting it, so thanks for that ;)
briantist

2

C# 6.0, 35 bytes

(x,y)=>(x.ToString($"D{y<0?0:y}"));

Alternative solution (51 bytes)

(x,y)=>(x.ToString(string.Format("D{0}",y<0?0:y)));


1

C (gcc), 45 bytes

f(x,y){printf("%s%0*i","-"+(x>=0),y,abs(x));}

Try it online!

Explanation

printf formats three arguments:

%s      ->    "-"+(x>=0)
%0*i    ->    y
        ->    abs(x)

%s formats the string "-"+(x>=0). "-" is really just an address, something like 41961441. In memory, this looks something like this:

MEMORY ADDRESS | 41961441  41961442 ...
VALUE          | 45 ('-')  0 (0x00) ...

When formatted into a string, C takes the address (say 41961441) and keeps on acquiring characters until a null byte (0x00) is met. When x is less than zero, the value "-"+(x>=0) has that of the original address (41961441). Otherwise, x>=0 is 1, so the expression becomes "-"+1, which points the null byte after "-", which prints nothing.

%0*i prints an integer padded with a specified number of 0s. y denotes this number. We pad abs(x) to avoid the negative in some arguments.



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