领先的零挑战


31

挑战

给定两个整数作为输入(xy),将其输出x为一个字符串,并带有多个前导零,以使该字符串成为y无符号的字符长。

规则

  • 如果x有超过y位数,输出x为不加修改字符串。

  • 即使没有前导零,也不接受以整数形式输出。

  • 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)给?
2015年

@Adám将其添加到示例中。
Brian H.

1
+正数是否可以接受前导符号?
汤姆·卡彭特

Answers:


4

Japt13 8字节

将第一个输入(x)作为字符串。

®©ùTV}'-

试试吧

多亏了ETHproductions,节省了大量的5个字节。


说明

字符串U=x和整数的隐式输入V=y

® }'-U在减号上拆分为一个数组,在其上映射,然后将其重新连接到带有减号的字符串。

©是逻辑AND(&&),因此,如果当前元素为true(非空字符串),则将left(ù)填充为0(T)到length V


好东西!您可以通过简单的映射周围节省相当多-ethproductions.github.io/japt/...
ETHproductions

@ETHproductions:好的电话。谢谢。自这样做以来已经有很长时间了,我完全忘记了您可以使用一种方法来拆分,映射和重新加入字符串!
毛茸茸的

是的,我想应该将功能移至q,然后将q-_©ùTV节省1个字节:-)
ETHproductions

@ETHproductions,如果我理解的正确,那是在建议您,如果一个函数作为S.q()(给我们S.q(s,f))的第二个参数传递,那么S它将被分割s,遍历f并重新加入s?我喜欢!:)
Shaggy's

是啊,为什么我跟奥利弗和你不这样做是(如果传递了一个函数,执行正常的功能,通过功能运行,并撤消第一个变化; N.sS/A.yN.ì已经这样做了),带着一帮的方法呢?我和某人交谈,我不记得现在是谁:s
ETHproductions



6

05AB1E11 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.

您已经出气了:(
布赖恩

@BrianH。的确,我有:)
Emigna

6

Python,29个字节

将输入作为f(x,y)。使用Python的%运算符。

lambda x,y:'%0*d'%(y+(x<0),x)

在线尝试!




5

JavaScript(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

阅读“ currying”规则后,我想补充一点,我的反对更多是针对颠倒的参数,而不是针对currying本身。
styletron

1
在质询中未指定@styletron参数的顺序。所以我可以利用它
edc65 '17

y=>r=x=>x<0?'-'+r(-x):(x+='')[y-1]?x:r(0+x)
亲爱的

我没有问题的人扭转输入顺序。
Brian H.



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)

在线尝试!

-8字节感谢djhurio

说明

  • sprintf("%0zd",x)返回x作为字符串用零填充是长度的z
  • paste0("%0",y+(x<0),"d")构造字符串"%0zd",其中zis y,如果x小于零则加1
  • 如果z小于中的位数xx则按原样打印为字符串

48个字节function(x,y)sprintf(paste0("%0",y+(x<0),"d"),x)
djhurio '17

@djhurio太棒了!我认为那将是另一个答案,而不是我的编辑,您怎么说?
duckmayr '17

您可以对其进行编辑。该解决方案并没有太大不同,只是使用了不同的功能。
djhurio '17

4

爱丽丝,23字节

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

在线尝试!

输入应以换行分隔,第一行的数字和第二行的宽度。

说明

/...
\...@/

这是Ordinal模式下线性程序的常用框架。在这种情况下,唯一的问题是此位:

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

这将导致IP垂直进入Cardinal模式并仅&在Cardinal模式下执行,然后才能恢复为Ordinal模式。

展开之字形控制流程然后给出:

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.

这是两个备选方案,也是23个字节,它们使用Cardinal Habs)摆脱了-

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

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

原则上来说,这些命令要短一些,但是&不适合放在堆栈上有1个字符的字符串的位置,因此我们需要使用来跳过它#



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
  • 多亏了尼尔,节省了3个字节!

1
-在木炭中打印或不打印任何内容,真的很容易:打印1个打印-而打印0个则不打印。因此,三进制是多余的,节省了3个字节。
尼尔,

如果您将换成InputNumber(),则Cast(q)可以切换到字符串比较以保存另一个字节。
尼尔,

@Neil我知道我可以简化Ternary
查理


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第二个版本需要PHP 7.1
Titus

我不断地讨论这个问题,然后我得到了确切的答案。我认为这是最佳版本
Ismael Miguel

3

Mathematica,118个字节

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


在线尝试!


3

Mathematica,63 62字节

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

在线尝试!


2
欢迎来到PPCG!我认为这并不能完全满足您的要求。您可能IntegerLength不是IntegerDigits。您可以使用IntegerLength@#而不是来保存字节IntegerLength[#]
Martin Ender

谢谢!我正在手工测试另一台计算机上的代码,实际上我为IntegerLength输入了错误的IntegerDigits。现在应该可以工作了。我还在挑战说明(+1)中添加了所有测试用例的TIO链接,表明它可以按预期工作。也感谢您提出的节省额外字节的建议!我不知道我以前怎么想念它。:)
MatjazGo

2

Excel,29个字节

使用Excel的TEXT功能(“将值转换为特定数字格式的文本”)。

x在A1中,y在B1中

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

您可以删除)))通过转换为谷歌单。-3字节
泰勒·斯科特




2

Japt14 12字节

@ETHproductions节省了2个字节

s r"%d+"_ù0V

在线尝试


保持减号登录并弄乱数字会便宜一些:在线测试
ETHproductions

@ETHproductions:或者x作为10字节的字符串。
毛茸茸的

@ETHproductions感谢伙计。我回到办公桌时会对其进行更新。
奥利弗·

@Shaggy好像您发布了自己的答案,所以我将使用ETHproduction的技巧。不过谢谢
奥利弗

奥利弗(Oliver),那10个字节只是@ETHproduction的12字节解决方案,已升级为Japt 2.0a0,U并带有字符串,使我们可以打高尔夫球的前两个字符。
毛茸茸的

2

PowerShell的25 40字节

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

在线尝试!

说明

这会.ToString()使用生成的格式字符串调用数字,但要根据$by)分别是负数,0还是正数,将其乘以-1、0或1 。这是为了处理负值y,而负值本身不会格式化字符串。

这似乎需要在子语句中包装负数()才能使其起作用,这只是使用文字时调用的一个怪癖。如果传递的是整数类型的变量,则不需要这样做。


当它们y为负数时,看起来这两个都失败了。
毛茸茸的

@蓬松的好收成。完全删除了第二个解决方案,并修复了第一个解决方案,谢谢!
briantist

哎呀,15个字节!抱歉!
毛茸茸的

@Shaggy heh,这些天之一,我实际上会写我一直在思考的基于PowerShell的高尔夫语言。这实际上促使我进行更多的研究,并且更接近开始研究,因此,谢谢;)
briantist

2

C#6.0,35个字节

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

替代解决方案(51字节)

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


1

C(gcc),45个字节

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

在线尝试!

说明

printf 格式化三个参数:

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

%s格式化字符串"-"+(x>=0)"-"实际上只是一个地址,类似41961441。在内存中,这看起来像这样:

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

当格式化为字符串时,C获取地址(例如41961441)并继续获取字符,直到遇到空字节(0x00)。当x小于零时,该值"-"+(x>=0)具有原始地址的值(41961441)。否则x>=0为1,因此表达式变为"-"+1,它指向后的空字节"-",不输出任何内容。

%0*i打印一个填充有指定数量0s 的整数。y表示此数字。abs(x)在某些论点中,我们尽量避免负面影响。



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.