将数字相加,将数字取反


26

给定一个数字> 0,输出所有位(1 .. n)串联并取反的和,然后将它们加起来。例如,当n = 6时:

数字1到6串联在一起:

123456

反转:

654321

将它们加在一起将得到:777777。另一个示例是n = 11:

1 2 3 4 5 6 7 8 9 10 11 > 1234567891011

11 10 9 8 7 6 5 4 3 2 1 > 1110987654321

将它们加在一起将得到2345555545332。这也称为A078262

最短的代码胜出!



是否有绑定n,或者我们必须支持任意大的整数?
LegionMammal978 '16

我认为默认值为“界限max(256,yourlanguagesdefaultintegertypelimit)”。但是应该指定。
CalculatorFeline

@ LegionMammal978您的语言所提供的支持。
Lamaro

重要的测试案例:10,应给出23333333231
阿德南

Answers:


9

05AB1E,7个字节

LDRJsJ+

在线尝试。

说明

LDRJsJ+

L        range from 1 .. input
 D       duplicate
  R      reverse
   JsJ   convert both arrays to strings
      +  add (coerces both strings to ints)

我对设计选择感到困惑,因为设计选择导致+列表上进行嵌套加法,而对于字符串则将其转换为int然后加法。但是我想这里可行!:P
FryAmTheEggman '16

@FryAmTheEggman我要删除嵌套的加法。自从我实施它以来,它从未有用过……
Adnan

3
嘘,我离开PPCG两个小时,当我走后,您将自己重命名为Aqua Tart ...哦,PPCG用户的生活。
ETHproductions '16



4

Pyth,12个 10字节

ssMjLk_BSQ

感谢@FryAmTheEggman 2个字节!

Q是输入,S把它变成[1, 2, ..., input()]_B分叉过来_(反向)来创建[rng, rev(rng)]jLk在映射它joink(这是“空字符串”变量),sM映射int所得的阵列,以及s最后计算的总和。


4

JavaScript(ES6),70 67 64字节

a=>(z=[...Array(a)].map((b,c)=>c+1)).join``- -z.reverse().join``

固定为符合要求,因为在误解输入的情况下制作了旧代码。


@TimmyD添加了解释。
Mwr247 '16

@TimmyD哦!> _ <我对挑战的误解是如何...是的,我必须解决此问题。
Mwr247 '16

@TimmyD花了我足够长的时间才能重新上网。现在已修复,感谢您及时解决。
Mwr247 '16

如另一个答案所述,这仅在参数a在1到12之间时才有效,这真的太少了
edc65 '16

@ edc65 每个OP的评论,足够大。
Mwr247 '16

3

Python 3、74

DSM节省了6个字节。

没什么好激动的,加入范围,然后转换为整数并添加它们。

lambda x:sum(int(''.join(list(map(str,range(1,x+1)))[::i]))for i in(1,-1))

3

视网膜,71

  • 感谢@daavko,节省了7个字节。
  • 0.7.3版功能节省了3个字节

因为它公然地为工作提供了错误的工具。

.+
$*a:$&$*
+`^(a+)a\b(.*)\b1(1+)$
$1 $& $3
 ?(\w)+ ?
$#1
\d+:?
$&$*c
c

在线尝试。

适用于最多6个输入,但是此后在线解释器会超时。


1
您可以删除最后一行并将其更改(c)+为,将其缩短为74 c
daavko '16

@daavko是的,当然,谢谢!
Digital Trauma

此外,$&$*c-> $*c\d+:?-> \d+达到70。由于某种原因,它继续工作...
daavko


3

JavaScript(ES6),67 66字节

n=>(a=[...Array(n+1).keys()].slice(1)).join``- -a.reverse().join``

是的,那是一个空间。啊。至少@Downgoat帮助我节省了一个字节。


1
您可以删除第一个+,并使+ +-> - -保存一个字节
Downgoat

n =>(a = [... Array(n)]。map(_ => n-))。join- -a.reverse().join
edc65

注意:使用简单的js算术,将其限制为值1 .. 12
edc65 '16

2

认真地,12个字节

,R;Rεj≈@εj≈+

在线尝试!

说明:

,R;Rεj≈@εj≈+
,R;           push two copies of range(1, input()+1)
   R          reverse one copy
    εj≈@εj≈   concatenate both and cast both to ints
           +  add

2

PowerShell,35个字节

param($a)+-join(1..$a)+-join($a..1)

使用将输入转换为范围..,然后将-join它们组合在一起,并将它们加起来。

将适用于最大输入值为138,输入139Infinity140和大于输入的数字,将消除一个非常冗长的转换错误:

Cannot convert value "12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413
5136137138139140" to type "System.Int32". Error: "Value was either too large or too small for an Int32."


2

JavaScript(ES6),99

这会逐位添加数字,因此它可以处理远远高于JavaScript精度53位的数字

n=>eval("for(a=b=c=r='';n;a+=n--)b=n+b;for(i=a.length;i--;r=c%10+r)c=(c>9)-(-a[i]-b[i]);c>9?1+r:r")

测试

f=n=>eval("for(a=b=c=r='';n;a+=n--)b=n+b;for(i=a.length;i--;r=c%10+r)c=(c>9)-(-a[i]-b[i]);c>9?1+r:r")

// Less golfed
U=n=>{
  for(a=b=c=r=''; n; --n)
      b=n+b, a+=n;
  for(i=a.length; i--; r = c%10+r) 
      c=(c>9)-(-a[i]-b[i]);
  return c>9? 1+r : r;
}

function test() {
  var n=+I.value
  R.textContent=f(n)
}  

test()
N: <input id=I value=11 oninput="test()"> -> <span id=R></span>


似乎不适用于9。此外,为什么不c使用其他变量进行初始化?
尼尔

你有我的支持。
尼尔


2

MATL,13字节

:tP2:"wVXvU]+

编辑(2016年5月20日)由于语言的最新更改,链接中的代码使用Xz代替Xv

在线尝试!

:                % range [1,2,...,n], where n is input
 tP              % duplicate and flip
   2:"     ]     % do this twice
      w          % swap
       V         % convert array of numbers to string with numbers and spaces
        Xv       % remove spaces
          U      % convert to number
            +    % add the two numbers

不适用于11或10。(提示:转换为字符串之前为反向范围。)
Mama Fun

@ӍѲꝆΛҐӍΛПҒЦꝆ谢谢!已更正
Luis Mendo

大!进行投票。
Mama Fun Roll

2

05AB1E,5个字节

LJDR+

说明:

L     # Pushes an array containing 1 .. [implicit] input
 J    # Join the array to a string (eg. [1, 2, 3] -> 123)
  D   # Duplicate the array
   R  # Reverse the duplicate
    + # Add them together

在线尝试!


1

Bash + coreutils,39岁

eval echo {1..$1} + {$1..1}|tr -d \ |bc

要么:

bc<<<`eval printf %s {1..$1} + {$1..1}`

伊迪恩


1

Perl 6,25个字节

{([~] @_=1..$^n)+[R~] @_}
{
  (
    [~]           # reduce with the string concatenation infix op:
    @_ = 1 .. $^n # the range 1 to input ( also stored in @_ )
  )
  +               # add that to
  [R~] @_         # @_ reduced in reverse
}

用法:

for 6, 11, 12 -> $n {
  say {([~] @_=1..$^n)+[R~] @_}( $n )
}
777777
2345555545332
244567776755433

我认为你可以做$n,而不是$^n
andlrc

@ dev-null不是,如果我希望它成为该块的输入。与... -> $n {是不同的$^n
布拉德·吉尔伯特b2gills '16

1

R,34 60 64字节

f=pryr::f;g=f(as.numeric(paste(x,collapse='')));f(g(1:n)+g(n:1))

假设pryr已安装软件包。这f是创建函数的捷径。

Edit添加了26个字节,但是返回了一个有效的函数,这并不是完全错误的。

Edit又添加了4个字节来处理n = 10以上的情况,其中strtoi(以前使用过)正在返回 NA


1

卢阿(57岁)

a=''b=''for i=1,...do a=a..i b=b.. ...-i+1 end return a+b

1

Lua,53字节

该程序n作为命令行参数。

s=""r=s for i=1,arg[1]do r,s=i..r,s..i end print(s+r)

我认为输出小数部分为0的数字是可以的(采用这种格式,777777.0因为这是在lua中输出数字的默认方式(整数和浮点数之间没有区别)


它不是反转的字符串本身,而是数字。您的代码在n> = 10时失败
。– Moop

@Moop以1字节^^'的价格进行了更正。感谢您的评论^^'
Katenkyo '16

您可以使用...而不是arg [1]节省3个,在r的反向连接上做得很好,我的答案没有想到这一点。+1
Moop

@Moop我看到了您的帖子,很好用,我什至不知道您可以这样使用...!我暂时保持这种方式,因为除了在线编译器之外,我不能使用其他任何东西,并且它无法处理该问题(我想先对其进行测试并对其进行一些操作,然后再将其放入回答:))
Katenkyo

1

Perl 5,37个字节

25个字节,外加1个代表-p和11个代表-MList::Gen

$_=<[.]1..$_>+<[R.]1..$_>

先前的解决方案,40字节:39,外加一个 -p

@a=reverse@_=1..$_;$"=$\;$_="@a"+"@_"

1

Perl,36个字节

包括+1的 -p

在STDIN上运行

perl -p reverse.pl <<< 6

reverse.pl

$_=eval join"",map{abs||"+"}-$_..$_

1

Dyalog APL,17个字节

+/⍎¨∊¨⍕¨¨x(⌽x←⍳⎕)

提示输入
“枚举,直到输入
x←的X商店列表
负X
x(... )前面加上反向列表与原始名单
⍕¨¨将每个列表到字符串的每个数字
∊¨使字符串的每个列表为单一字符串
⍎¨每个字符串转换为数字
+/总和的两个数字。


0

Mathematica,64个字节

Plus@@FromDigits/@#&[""<>ToString/@#&/@{#,Reverse@#}&[Range@#]]&

0

视网膜,80字节(ISO 8859-1编码)

'+
$0¶$0
+`^(('+)')
$2 $1
+`('('+))$
$1 $2
(')+( |$)?
$#1
(\d+)¶(\d+)
$1$*'$2$*'

IO '以计数为单位。从理论上讲,您支持对它扔的任何整数,实际上……在线解释器拒绝处理大于6(一元'''''')的任何东西。

在线尝试!
在线尝试!(十进制IO-91字节)


0

𝔼𝕊𝕄𝕚𝕟,12个字符/ 15个字节

⨭⟮⩤⁽1ï⟯⨝,Ⅰᴚ⨝

Try it here (Firefox only).

说明

取一个范围[1,input],加入它;取相同的范围,将其反转,然后加入;两个范围的总和就是结果。


0

Ruby,40个字符

->n{eval (l=[*1..n])*''+?++l.reverse*''}

样品运行:

irb(main):001:0> ->n{eval (l=[*1..n])*''+?++l.reverse*''}[11]
=> 2345555545332

irb(main):002:0> ->n{eval (l=[*1..n])*''+?++l.reverse*''}[6]
=> 777777

0

C#,126个字节

using System.Linq;a=>{var b=Enumerable.Range(1,a);return long.Parse(string.Concat(b))+long.Parse(string.Concat(b.Reverse()));}

可能会进一步打高尔夫球。不太确定。


0

Groovy,42个 39个字符

{[1..it,it..1]*.join()*.toLong().sum()}

样品运行:

groovy:000> ({[1..it,it..1]*.join()*.toLong().sum()})(11)
===> 2345555545332

groovy:000> ({[1..it,it..1]*.join()*.toLong().sum()})(6)
===> 777777
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.