计算所有数字的总和


38

挑战在于编写一个程序或脚本,该程序将对从1到给定数字(包括给定数字)的整数内的所有数字的总和进行计数。

输入,一个正整数。输出该数字和所有较小数字的数字总和。

例子:

Input: 5 
Integer Sequence: 1, 2, 3, 4, 5
Sum of Digits: 1 + 2 + 3 +4 + 5 = 15

Input: 12
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 
Sum of Digits: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 + 1 + 1 + 1 + 2 = 51

要明确的是,这是为了计算数字的总和-而不是整数。对于一位数字输入,这将是相同的。但是,大于10的输入将具有不同的响应。这将是错误的响应:

Input: 12
Output: 78

另一个示例,以显示差异:

Input: 10

Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Sum of Integers (INCORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55

Digit Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0
Sum of Digits (CORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 = 46

更大的测试用例(正确响应):

Input: 1000000
Output: 27000001

规则与准则:

  • 提交的代码必须是完整的程序或脚本,而不仅仅是函数。如果代码要求包含,导入等,则必须将其包含在发布的代码中。
  • 该数字必须由用户输入-不得进行硬编码。输入可以作为命令行参数,文件,stdin或您的语言可以接受用户输入的任何其他方式来接收。
  • 该代码必须至少能够正确处理输入(2^64)-1
  • 该代码应仅输出总和。
  • 提交的程序和脚本应该是用户友好的,并且不浪费计算机资源(例如:它们不应声明超大的数组来容纳每个字符)。对此没有严格的奖励或惩罚,但是请成为优秀的程序员。

得分:

主要的评分机制是根据代码长度。分数越低越好。以下奖金和罚款也适用:

  • 如果您的代码可以处理所有正数,则奖励-25,例如:1234567891234567891234564789087414984894900000000
  • 如果代码可以处理简单表达式,则为-50,例如55*96-12。要获得此奖金,代码应处理+ - / *(加,减,除,乘)运算符并强制执行运算顺序。除法是规则的整数除法。
    • 给定的示例(55*96-12)计算为5268。对于任何一个输入,您的代码都应返回相同的值-正确答案是81393
  • 如果您的代码有资格获得-50奖励并且可以处理^(指数)运算符,则为-10奖励
  • -100奖励,如果您的代码符合-50奖励的条件并且不使用eval或类似方式处理表达式。
  • 如果您的代码依赖于任何网络资源,则+300罚款

2
而且应该55*96-12返回什么?
ProgramFOX

1
55 * 96-12 = 5268,应与输入的5268
ST3

3
奖金可能偏大,似乎正在成为负分最高的比赛:)
Joachim Isaksson 2014年

7
@ ST3如果几乎没有奖金就不可能赢得胜利,那么仅使它们成为要求,或者少花点钱几乎更好。
Cruncher 2014年

3
-1是因为此挑战使用了“奖金”的过时(且糟糕)的评分动机。
mbomb007 '18

Answers:


9

Perl 6:108-(25 + 50 + 100)+ 0 = -67点

打高尔夫球的解决方案(基于xfix的出色解决方案的最终产品):

$!=get;for '*',&[*],'/',&[/],'+',&[+],'-',&[-] ->$s,&f{$!~~s:g[(\d+)$s(\d+){}]=f |@()}
say [+] (1..$!)».comb

非高尔夫解决方案:

my $expression = get;
for '*', &[*],
    '/', &[/],
    '+', &[+],
    '-', &[-]
-> $sym, &infix {
    $expression ~~ s:g[(\d+) $sym (\d+) {}] = infix($0, $1)
}
say [+] (1..$expression)».comb

该评估步骤在每个符号的工作原理是迭代*/+-,发现当两个整数之间的谎言,而代,使用函数符号代表。

更详细地讲:它接受每个符号(例如+)和它应该表示的infix函数(例如&[+],它是速记的形式,&infix:<+>并且在执行时与Perl 6调用相同的函数1 + 2),并进行全局替换(例如s:g[…] = …,类似于Perl 5 s/…/…/ge),它匹配用符号((\d+) $sym (\d+))分隔的两个整数,并将其替换为用这些整数(infix($0, $1))调用的相应infix函数的输出。

最后,此求值表达式被输入say [+] (1..$expression)».combxfix在他的解决方案中解释得很好

很抱歉晚到派对☺

编辑:删除了对指数的支持;无论如何,它恰好是10个字符,并且没有正确执行关联性。


这很棒。我喜欢您如何制作一个非常简单的解析器-我尝试过,但是我没有做那么短的事情。相反,my $g您可能想使用预先声明的内容(我认为这$!可能有效,但我尚未测试)。
Konrad Borowski

@xfix,我不确定这对高尔夫有什么帮助。有一种真正的打高尔夫球的方法,但是它需要尚未完全起作用的“ infix:[$ var]”语法:my$g=get;for <* / + -> {$g~~s:g[(\d+)$^s(\d+){}]=infix:[$^s] |@()};say [+] (1..$g)».comb这会将分数降低到88个字符或-97分
Mouq 2014年

哦,$!将有助于摆脱“我的”!感谢@xfix
Mouq 2014年

14

Mathematica 30-(10 + 50)= -30

由于ybeltukov,缩短了4个字符。

Range@n返回从1到的数字n

Integerdigits@n 将这些数字分解成数字。

Total[n,2]对数字求和。2是为了允许在不同级别上求和,即列表列表。

IntegerDigits@Range@#~Total~2&

测试中

IntegerDigits@Range@#~Total~2&[12]

51

IntegerDigits@Range@#~Total~2 &[1000000]

27000001


表达方式

IntegerDigits@Range@#~Total~2 &[55*96 - 12]

55*96 - 12

81393
5268

IntegerDigits@Range@#~Total~2 &[5268]

81393


IntegerDigits@Range@#~Total~2 &[55*96^2 - 12]
55*96^2 - 12

12396621
506868

IntegerDigits@Range@#~Total~2 &[506868]

12396621


您应该在有效参数上添加信息以获取所有布朗尼分数:D
Yves Klett 2014年

1
我不知道是否考虑不使用eval
Cruncher 2014年

3
回复:Mathematica中的Eval。这是一种象征性语言,前端始终尝试使用这种语言自动解决数学问题。您必须添加其他代码(Hold [])以防止这样做。
Michael Stern 2014年

1
Tr@Flatten可以简化为Total[...,2]IntegerDigits@Range@#~Total~2&
ybeltukov 2014年

1
您不处理任意大的int并应再得到-25吗?
aka.nice 2014年

12

C:150 138 - (100 + 50)= -12

a,b,c;main(d){for(scanf("%d ",&a);~scanf("%c%d ",&d,&b);a=d^43?d%5?d%2?a/b:a*b:a-b:a+b);for(;a;)for(b=a--;b;b/=10)c+=b%10;printf("%d",c);}

从这里非常可耻地窃取@Fors答案来进行表达式求值:https ://codegolf.stackexchange.com/a/11423/13877

用法示例:

./a.exe <<< "5 + 7"
51

注意:表达式实现不假定运算符优先级,并在接收它们时使用它们的值;恩,1+2*3 = 9而不是典型的7


1
这不涉及运算符优先级,但是问题并没有指定是否应应用标准运算符优先级... ping @ ST3,应该对此进行澄清。无论如何,答案中应该提到它。
FireFly 2014年

@FireFly我修改了答案以反映这一事实。
2014年

@Josh-请提供2 ^ 64-5的答案
SergeyS 2014年

10

sed,411283-25 = 258

我现在不能打高尔夫球了。:-)不推荐用于甚至大的整数,但是从技术上讲,它可以处理任意大的整数(但是您可能很快会用完RAM,因为我(或多或少必须)将数字编码为一元)。

s/$/x0123456789/
:l
/9$/H
:b
s/(.)(y*x\1)/y\2/
/(.)y*x\1/b b
s/(.)([xy].*)(.)\1/\3\2\3\1/
:c
s/y(.*(.))/\2\1/
/y/b c
/0$/b f
/^0*x.*9$/!b l
x
s/x[^\n]*\n//g
:d
s/(.)(.*x.*(.)\1)/z\3\2/
/[^z0]x/b d
s/0|x.*|\n//g
H;x
s/./0/g
s/$/x9876543210/
x
:e
x
b l
:f
x
s/.//
/./b e
x
s/^0+|x.*//g

样品使用

(输入行缩进以方便阅读。)

  5
15
  12
51
  33
183

8

蟒蛇,55-(50 + 25 + 10)= -30

低效但更短,也能够处理表达式。

编辑:感谢WolframhlegoStormtroopr的把戏:D

s,t=0,input()
while t:s+=sum(map(int,`t`));t-=1
print s

蟒蛇,149-(25 + 50 + 10)= 64

我的第一个版本

def d(n):
 if n/10==0:return n*(n+1)/2
 c,t=0,n
 while t/10:c,t=c+1,t/10
 p=10**c;m=n%p
 return d(m)+t*(m+1)+p*t*(t-1)/2+p*c*t*45/10
print d(input())

输入:

1234567891234567891234564789087414984894900000000

输出:

265889343871444899381999757086453238874482500000214

当我尝试在以下位置运行您的xrange解决方案时遇到了溢出错误1234567891234567891234564789087414984894900000000
2014年

1
@Josh摆脱了xrange:D
Wasi

2
一些提示:您可以替换eval(raw_input())input()。该while环可能是while t:s+=sum(map(int,牛逼));t-=1
恢复莫妮卡2014年

2
您可以只使用input()而不是来缩短它eval(raw_input()),因为表达式input已经eval存在!这意味着您可以得到-10 binus来表示电源符号,获得-100奖金则可以不使用eval!!!

@LegoStormtroopr讲规则eval类似的,所以我觉得-100起不到作用
SztupY

8

Python-108个字符减去85个奖金(23招),处理非常非常大的输入

这些解决方案中的大多数似乎都是在比输入少的所有整数上进行循环,并将所有数字和加起来。这行得通,但是我觉得这很不礼貌,并且会质疑他们是否真正有资格获得25点奖金,因为我认为他们无法1234567891234567891234564789087414984894900000000在我们的一生中处理输入内容。实际上,在输入n数字时,这些解决方案需要O(10^n)时间。我选择对这个问题进行一些数学运算。

#Returns the sum of all digits in all x-digit numbers
def f(x):
    return x*(10**(x-1))*45

#Returns the sum of all numbers up to x
def g(x):
    return x*(x+1)/2

#Solves the problem quickly
def magic(x):
    digits = [int(y) for y in list(str(x))]
    digits.reverse()
    total = 0

    for (sig, val) in enumerate(digits):
        total += (10**sig)*g(val-1) + val*f(sig) + val + (val*10**sig)*sum(digits[sig+1:])
    return int(total)

所有x数字的集合与集合同构{0,1,2,3,4,5,6,7,8,9}^x。对于一个固定的(n,sig)x各种不同的值sig10^x-1与该点sig次指标集到n,并且所有数字的总和0-9是45。这是通过所有处理f

g 是我们可能都熟悉的东西

magic接受输入数字中的所有数字,并从最低到最高进行迭代。用example输入来追踪它是最简单的1,234,567

为了处理范围1,234,567-1,234,560,我们必须从加起来所有的数字17,并加入7时代的其他数字的总和,应对大于所有数字1,234,560。现在,我们需要处理其余的问题。

要处理该范围1,234,560-1,234,500,我们添加6val),然后将上限降低到1,234,559。在剩下的部分中,我们将看到每个单位数字6次(val*f(sig))。我们将看到从0到的所有5精确数字10(10**sig)*g(val-1))。我们将看到该数字中的所有其他数字恰好是60倍((val*10**sig)*sum(digits[sig+1:]))。现在,我们处理的所有数字都严格大于1,234,500。相同的逻辑将适用于所有含义。

多亏了WolframH,高尔夫运动才使该解决方案

d=map(int,str(input()))
print sum(v*(10**s*((v-1)/2+sum(d[:~s]))-~s*9*10**s/2)for s,v in enumerate(d[::-1]))

并且所有整数之和的数字总和1234567891234567891234564789087414984894900000000265889343871444927857379407666265810009829069029376

我设法在高尔夫球版本上扔出的最大数字是10 ^ 300,这时浮子开始溢出,数值不稳定开始引起问题。使用快速平方和乘幂功能,此问题将消失。

LaTeX支持将非常有用...


真好 我曾尝试用数学解决这个问题,但是被卡住了。稍后,我将不得不仔细进行研究,并思考它的工作原理。
FireFly 2014年

好答案!它与我计算的方式类似,即如果输入为1000000 :)
ST3,2014年

1
+1用于使用数学。但是,我得到2.65889343871e+50,它是实际解的浮点近似值。显然,您打印的int(t)不是t您提供的代码。那是错的; 真正的解决方案是265889343871444899381999757086453238874482500000214。只要避免使用花车,如更换**(x-1)被缩短**x/10
恢复莫妮卡

1
打高尔夫球更多。显然,唯一需要的全局变量是d(因为它被使用了两次)。消除其他错误(并使用一些技巧)可以达到d=map(int,str(input()))\nprint sum(v*(10**s*((v-1)/2+sum(d[:~s]))-~s*9*10**s/2)for s,v in enumerate(d[::-1]))(108个字符)。在任何大小的输入(例如int("1"*1000))上均可正常运行。
恢复莫妮卡

1
@ymbritt 10**-10.1,从那里开始一切都变成了浮点数。1/100(整数除法),一切都可以保持ints。
恢复莫妮卡2014年

8

TI-BASIC,137-(50 + 10 + 100)= -23

Input A:Disp cumSum(randIntNoRep(1,A))→L₁:"?:For(A,1,dim(L₁:Ans+sub("ABCDEFGHIJKLMNOPQRSTUVWXYZ",L₁(A),1:End:Disp sub(Ans,2,length(Ans)-1

输入最多处理数字1E100并自动求值。可以处理表达式。

尽管它是一个庞大的阵列,但我并没有浪费计算机资源(这是通过计算器运行的)。


1
我认为这个问题的最佳答案。使用计算器语言编写代码高尔夫答案以将数字加在一起。非常酷!
玛拉基2014年

1
@Malachi我经常说,当代码高尔夫=数学时,该抽出计算器了。
Timtech

2
我的版本允许最多9E99的数字显然还不够好,因此我认为您无法算出这笔奖金。另外,根据Carraher的Mathematica回答,我非常确定您必须将输入计数为“ with eval”。
FireFly 2014年

1
同意FireFly,不应使用未使用的奖励eval
ST3

3
计算器不是计算机吗?
戴维·康拉德


6

传真77 74

n,v,i;main(){scanf("%d",&n);for(;i||(i=n--);i/=10)v+=i%10;printf("%d",v);}

C,150 124 - 25 = 99

这是一个替代版本,从技术上讲应该有资格获得“任何”正整数的25赠金,但是由于该算法的输入时间是线性时间,因此它是不切实际的缓慢。无论如何,写起来很有趣。手动减去以ASCII字符形式读入的数字。此版本为150个字符。(现在有了可怕的,经过争论的,循环的代码!)

n,v;main(int n,char**a){char*p;do{for(p=a[1];*p>47;p++)v+=*p-48;for(;*--p==48;)*p=57;
p[0]--;}while(p>=a[1]);printf("%d",v);}

C,229 224-(50 + 100)= 74

表达式处理的变化。根据典型规则实现运算符优先级:/ * - +。仅限97个令牌= 48个条款。

#define F(X,Y)for(q=n+1;q+1!=p;)*q-X?q+=2:(q[-1]Y##=q[1],memmove(q,q+2,(p-q)*4))
n[99],*p,*q,v,i;main(){for(p=n;~scanf("%d%c",p,p+1);)p+=2;F('/',/);F('*',*);
F('-',-);F('+',+);for(;i||(i=n[0]--);i/=10)v+=i%10;printf("%d",v);}

所有正整数表示,它应该处理甚至超过99位数字的数字。
ST3

@Firefly很酷的算法可以处理大于内置数字的数字!
2014年

5

GolfScript 18-50 = -32

~),{`+}*' '*~]{+}*

说明:假设输入为“ 12”:

~), # turn input into integer, increment, and then turn into an array of all numbers less than or equal to input.  

堆栈为[0,1,2,3,...,12]

{`+}* # fold string concatenation across the array

堆栈为"01234...9101112"

' '* # join a space between all characters

堆栈为"0 1 2 ... 1 0 1 1 1 2"

~] # evaluate the stack into an array.  No `[` is necessary since the stack is otherwise empty.

堆栈为[0,1,2,...,9,1,0,1,1,1,2]

{+}* # fold addition across the new array

根据需要,堆栈为51。

此处的输入可以是任何有效的GolfScript表达式,其中可以包含指数。例如:

echo "5 5 + 2 * 8 -" | ruby golfscript.rb h.gs
-> 51

自从2(5 + 5) - 8 = 12。我认为这应该有资格获得奖金,但是也许只有正常的形式才有可能,而不是相反的GolfScript波兰语表示法。


它也支持^吗?
SztupY

它支持GolfScript语法的幂运算,这是?
Ben Reich

你没有得到奖金10,因为程序必须支持^,而不是?pow
ST3

@ ST3如您所愿!
Ben Reich 2014年

4

红宝石,37-50 = -13

一路翻腾,一路冲天!与其他Ruby解决方案一样,我认为从理论上讲,这应该可以处理任意数量的数字,但是执行时间会非常糟糕。

p eval [*1..eval(gets)].join.chars*?+

较旧的版本(49-50分)

p"#{[*1..eval(gets)]}".chars.map(&:to_i).inject:+

假设10个字符的奖励实际上要求取幂的字符是一个插入符号,我想添加的最短方法是:

.gsub ?^,'**'

花费的角色比奖励所能提供的更多。


您可以删除一些字符:p"#{[*1..eval(gets)]}".chars.map(&:to_i).inject :+
SztupY 2014年

@SztupY好的电话,谢谢!我&在高尔夫运动中用的不够。其实,你并不需要之间的空间inject:+两种。
Paul Prestidge 2014年

4

Perl 6(28-75 + 0 = -47字节)

say [+] (1..get.eval)».comb

它可以处理所有正数(但是,大数将花费一些时间,因为当前Perl 6的实现速度很慢,但是Perl 6本身支持大整数)。它使用eval来实现一个简单的计算器(五十个字符对五个字符的惩罚是值得的)。它之所以缓慢是因为当前的实现速度很慢,但是从理论上讲,它应该足够快(即Perl 6实现得到改进时)。另外,令人惊讶的是,我赢得了Mathematica(目前)。

» 该代码实际上是不需要的,但出于性能原因,我将其放在此处(否则,程序将分配整个字符串。之所以在这里,原因是Perl 6没有无限的字符串,但确实有无限的列表。

无论如何,您可能会问这段代码是如何工作的。好吧,我将部分地通过它。

  • get.eval

    这将获得一行(get函数),并对其进行评估(eval方法)。

  • 1..get.eval

    之后,Perl 6准备一个范围对象,从1到评估值。这是一个范围,因此不会分配任何大笔费用。

  • ».comb

    .comb方法将字符串拆分为字符(除非使用参数调用)。例如,'cat'.combreturn 'c', 'a', 't'»映射列表元素,因此.comb会在其所有项目上运行-不仅在列表本身上运行(例如,(4, 9)».sqrt给定2, 3)。这也不会分配超过所需的资源,因为Perl 6具有无限列表(例如,Haskell)。

    »实际上不需要字符,.comb可以直接在列表上使用,但这涉及隐式字符串强制(而且Perl 6没有无限字符串,因此会浪费内存)。例如,1, 2, 3转换为字符串后的list返回1 2 3。对于Perl 6,空格是一个非常好的数字,表示0,因此即使进行这种转换,代码也可以正常工作。但是,它将滥用计算资源。

  • [+]

    这是归约运算符。基本上,[]在这种情况下,您可以放一个运算符+。降低运营后的名单被降低,所以[+] 1, 2, 31 + 2 + 3,这是6。Perl 6对数字和字符串使用单独的运算符,因此不会被视为串联。

  • say

    最后,say输出结果。毕竟,您想查看最终结果,不是吗?


嗯... [+] 1,2,3,4,5,6,7,8,9,10是的1+2+3+4+5+6+7+8+9+10,对吗?
ST3 2014年

@ ST3:是的。在Perl 6中,Reduce运算符可以以许多有趣的方式使用。例如,>可以链接,这3 > 2 > 1是事实。相同的属性适用于reduce运算符,因此[>] 3, 2, 1它仍然是正确的3 > 2 > 1- [>]可以用来确定数字是否按降序排列。
Konrad Borowski

您不能使用get.Int代替eval吗?是否需要数学表达式?
2014年

@ user1737909:“如果您的代码可以处理简单表达式,则可获-50奖励”。而且,Perl 6不需要按设计进行转换(除了少数罕见的情况,例如sort没有比较方法参数时)。
Konrad Borowski14年

4

Perl 31-无奖金

map{s/./$%+=$&/ge}0..<>;print$%

样本输出:

perl -e 'map{s/./$%+=$&/ge}0..<>;print$%'
1000000
27000001

Perl 5 with -p,50-28 bytes:-22

map$\+=$_,/./g for 1..eval}{

在线尝试!


3

J,22

([:+/[:"."0[:":>:@:i.)

说明

评估从右到左进行。

i. n -> 0 1 2...n-1

>: n -> n+1

": numbers -> 'numbers'

"."0 -> (on each scalar item) apply ". -> '123' -> 1 2 3

+/ -> sum

Downvoter需要解释他们对此答案的反对意见。我已经尝试过了,虽然它没有任何奖金,但据我所知,它的效果还不错。
Gareth 2014年

实际上,在查看了最高答案后,该分数似乎还获得了22-60 = -38的表达式和幂运算符奖金。
Gareth 2014年

+/,10#.inv>:i.会更短。但是它仍然是功能,而不是OP要求的完整程序。
swish 2014年

@Gareth Bonus奖金不适用于此答案,因为您只可以在代码内部编写表达式,而不能作为输入。
swish 2014年

1
@swish我一开始就是这么想的,但是Mathematica的答案似乎很像这样。
Gareth 2014年

3

R,64-(50 + 10)= 4

sum(utf8ToInt(paste(0:eval(parse(t=scan(,""))),collapse=""))-48)

运行此命令时,要求用户输入。


旧版本(无法处理表达式):46个字符:

sum(utf8ToInt(paste(0:scan(),collapse=""))-48)

在我看来,codegolf偏向于具有单符号功能的语言。如果我们预定义了此类解决方案,该解决方案将大大缩短u<-function(x) utf8ToInt(x)
卡尔·威索夫特

@CarlWitthoft这是真的。但是,预定义也计入字符数。顺便说一句:u <- utf8ToInt没有足够了function。如果多次使用该功能,则对代码高尔夫很有帮助。
Sven Hohenstein 2014年

因此,如果我创建一个Rcheatcodegolf程序包,在该程序包中使用预定义的函数合法吗?:-)
Carl Witthoft 2014年

@CarlWitthoft是的,可以使用软件包。当然,不应为任务编写程序包。但是,如果仅包含函数的简称,那就可以了。
Sven Hohenstein 2014年

3

批次-(181-50)-131

只是为了一点乐趣。

@set/av=%1
@setLocal enableDelayedExpansion&for /L %%a in (1,1,%v%)do @set a=%%a&powershell "&{'%%a'.length-1}">f&set/pb=<f&for /L %%c in (0,1,!b!)do @set/as+=!a:~%%c,1!
@echo !s!

我将使其更具可读性:

@set /a v=%1
setLocal enableDelayedExpansion
for /L %%a in (1,1,%v%) do (
    @set a=%%a
    powershell "&{'%%a'.length-1}">f
    set /p b=<f
    for /L %%c in (0,1,!b!) do @set /a s+=!a:~%%c,1!
)
@echo !s!

旧方法使用for循环获取powershell命令的输出,而不是写入文件和从文件读取:

@set /a v=%1
@setLocal enableDelayedExpansion&for /L %%a in (1,1,%v%)do @set a=%%a&for /F usebackq %%b in (`powershell "&{'%%a'.length-1}"`)do @for /L %%c in (0,1,%%b)do @set /a s+=!a:~%%c,1!
@echo !s!

将输入到一个变量- v-使用/a接受算术表达式。
不幸的是,必须延迟扩展。
使用for循环从1到输入值-进行计数v
为了处理数大于9,我不得不使用PowerShell来获取字符串,然后用另一个for循环来拆分串起来的长度,并把它添加到总和 - s
可以更改的名称powershell.exe,以p.exe℃在:\ WINDOWS \ SYSTEM32 \ WindowsPowerShell \ V1.0 \然后叫它p "&{'%%a'.length-1},节省了9个字节。但这并不是真的。

H:\>sumof.bat 12
51
H:\>sumOf.bat (55*96-12)
81393

我午休时让第二个跑步。

我真的不能与那些数字测试比这大得多,由于它是多么的慢。但是,它应该适用于相当大的数目。2147483647是给出以下错误之前将要使用的最大数字(最大32位整数)-

H:\>sumOf.bat 2147483648
Invalid number.  Numbers are limited to 32-bits of precision.

当然,这使我没有资格参加挑战。


1
不错的解决方案!有几种打高尔夫球的方法。1.您可以摆脱临时变量v%1直接使用。2.您可以在PowerShell脚本中减去1,而不是冗长的代码@set /a b=%%b-1,这样可以节省大量时间。有了这些更改,我将其从原始的240降低到211。:-)
标记

糟糕,我现在明白了为什么要保留您的临时变量(用于奖励积分)。但是,PowerShell提示仍然有效……
2014年

很好,谢谢。现在将改变它。
2014年

批次无法运作。限于(2 ^ 31)-1(带符号的32位整数)。挑战在于需要处理多达(2 ^ 64)-1(无符号的64位整数,但是该值的输出将使它溢出)的输入。这就是PowerShell具有明显优势的地方-它的[decimal]类型允许值高达(2 ^ 96)-1。
Iszi 2014年

1
不过,我会为Batch提供一些很好的信誉,因为它们默认使用整数除法。这就是PowerShell完全缺少的东西。
Iszi 2014年

3

Dyalog APL,9 – 160 * = -151

+/⍎¨∊⍕¨⍳⎕

在线尝试!

得到评估的输入,
 例如"7+5"给出12

索引1 ... n
[1,2,3,4,5,6,7,8,9,10,12]

⍕¨ 将每个数字格式化为字符串
["1","2","3","4","5","6","7","8","9","10","11","12"]

征募(拼合)
"123456789101112"

⍎¨ 执行每个字符(单位数数字的收益列表)
[1,2,3,4,5,6,7,8,9,1,0,1,1,1,2]

+/ 和  51


*得分

-50奖金,因为它甚至接受表达式作为输入。该表达式必须是有效的APL,根据OP可以接受

-10红利,因为它还可以处理^*在APL中)。

-100加分,因为无需明确使用eval(即在APL中)处理表达式输入。


您确定在这里添加了-100奖金吗?因为它声明“ -100奖金,如果您的代码符合-50奖金的条件,并且不使用eval 或类似方式处理表达式。 ”由于⍎¨似乎每个字符一个一执行,因此它与eval相同(除了它执行字符一一而不是全部同时eval)。
凯文·克鲁伊森

@KevinCruijssen是的,因为它不使用eval或类似函数来处理表达式。 ⍎¨仅用于将数字转换为整数,而不用于处理表达式。
亚当

等等,我看错了你的解释。但是,不是kinda是内置的input + eval还是在输入表达式时eval总是隐式完成?
凯文·克鲁伊森

1
@KevinCruijssen 始终将表达式作为输入,对其求值并返回其结果。因此,要输入一个字符串,您必须在其周围加上引号。相关的内置(函数将输入作为原始文本返回的事实无关紧要(特别是因为符号表示这是主要输入方法,并且是一个特殊的变体),否则要获得红利,需要执行数学运算评估者–与主要任务完全不同的任务。我不喜欢奖金,而-100奖金只是愚蠢的或考虑了APL,但是恕我直言,它似乎确实适合奖金。
亚当

如果确实是获取输入并自动处理表达式的正常方式,我确实认为它也适用于奖励,因此我+1。无论如何,这些天来的奖金都是愚蠢的,但是利用这些奖金来最小化您的分数的好方法。
凯文·克鲁伊森

2

C#(161)

using C=System.Console;using System.Linq;class X{static void Main(){C.WriteLine(Enumerable.Range(1,int.Parse(C.ReadLine())).SelectMany(i=>i+"").Sum(c=>c-48));}}

漂亮

using C = System.Console;
using System.Linq;

class X
{
    static void Main()
    {
        C.WriteLine(
            Enumerable.Range(1, int.Parse(C.ReadLine()))
                .SelectMany(i => i + "")
                .Sum(c => c - 48)
            );
    }
}

2

Python3 + Bash(78-185 = -107)

python3 -c"print(sum(sum(map(int,str(x+1)))for x in range(int(${1//^/**}))))"
  • 可以处理所有正数
  • 可以使用+-/ *操作处理表达式
  • 可以处理^(幂)运算符。
  • 可以处理表达式,而无需评估或类似运算¹

如果表达式的结果不是整数,将首先被截断。如果表达式的结果为负,则结果不确定。

像这样使用它:

bash golf.sh "12 + (42 / 3 + 3^4)"

1:除非您算是这样从Bash调用Python,但是我认为并非如此。如果您认为确实如此,则调整后的分数为-7。


我想说的是,如果您没有编写表达式计算器,那么您将使用与eval等效的工具。但我不是OP,祝您好运!
Tobia 2014年

同意@Tobia,表达评估器没有任何奖励。
ST3 2014年

2

爪哇254

class T
{
    public static void main(String[] a)
    {
        long target = 10, count = 0;
        String[] digits = new String[50];
        for (long i = 1; i <= target; i++)
        {
            digits = String.valueOf(i).split("(?!^)");
            for (int j = 0; j < digits.length; j++)
                if (digits.length > j)
                    count += Integer.parseInt(digits[j]);
        }
        System.out.println(count);
    }
}

处理表达式。给你想要的目标表达。处理直到长度可以处理为止。如果清理掉所有空格并排成一行,并且没有要打印的语句,则该字符数为254个字符(考虑到基于Java语言的长而长的单词)。

PS:这是一个完整的程序,不只是逻辑。程序所提供的字数不只是逻辑。


2

Java(JDK8),272

我遇到的第一个挑战,欢迎提出建议=)

import java.util.*;import java.util.stream.*;class C{public static void main(String[]a){System.out.print(Arrays.asList(IntStream.range(1,new Integer(a[0])).mapToObj(s->s+"").collect(Collectors.joining()).split("")).stream().map(Integer::valueOf).reduce(0,Integer::sum));}}

缩进:

import java.util.*;
import java.util.stream.*;

class C {

   public static void main(String[] a) {
     System.out.print(Arrays.asList(IntStream.range(1,new Integer(a[0]))
            .mapToObj(s->s+"")
            .collect(Collectors.joining())
            .split(""))
            .stream()
            .map(Integer::valueOf)
            .reduce(0,Integer::sum));
  }
}

+1是每位在Java中进行高尔夫代码挑战的人都应得的,但似乎Stream API在您打高尔夫球时并没有给您带来优势。如果您重写您的解决方案,那会很糟糕,您将使用循环而不是流,它会更短。
user902383 '16

2

CJam,9-25 = -16

CJam比这项挑战还年轻几个月,因此没有绿色复选标记的资格。此外,这并不是首先击败Perl。;)我非常喜欢这种方法,所以无论如何我都想发布它。

l~),s:~:+

在这里测试。

这个想法是创建一个从0到N的范围。然后将该范围转换为一个字符串,该字符串将整数连续地连接在一起。对于N = 12,我们将得到

"0123456789101112"

然后将每个字符转换为,以生成一个整数:~(产生一个整数数组),然后与相加:+。CJam可以处理任意大整数。


2

Python 3 + astor1017 1007字节-(25 + 50 + 100)=分数: 842 834

通过删除ts和更改节省了10个字节p

编辑:我无法测试可笑的长整数(1234567891234567891234564789087414984894900000000)[挂起我的计算机],但据我所知,Python 3支持任意长整数。

这个实现 用途滥用AST。我不会认为滥用AST是“等同或类似的结果”。

from ast import*
from astor import*
nt,bo,m,d,a,s,n,p,ty=NodeTransformer,BinOp,Mult,Div,Add,Sub,Num,map,type
class M(nt):
    def visit_BinOp(t,z):
        if ty(z.left)==bo and ty(z.right)==bo:return bo(t.visit_BinOp(z.left),z.op,t.visit_BinOp(z.right))
        if ty(z.left)==bo:return bo(t.visit_BinOp(z.left),z.op,z.right)
        if ty(z.right)==bo:return bo(z.left,z.op,t.visit_BinOp(z.right))
        if ty(z.op)==m:return n(z.left.n*z.right.n)
        if ty(z.op)==d:return n(z.left.n/z.right.n);return z
class A(nt):
    def visit_BinOp(t,z):
        if ty(z.left)==bo and ty(z.right)==bo:return bo(t.visit_BinOp(z.left),z.op,t.visit_BinOp(z.right))
        if ty(z.left)==bo:return bo(t.visit_BinOp(z.left),z.op,z.right)
        if ty(z.right)==bo:return bo(z.left,z.op,t.visit_BinOp(z.right))
        if ty(z.op)==a:return n(z.left.n+z.right.n)
        if ty(z.op)==s:return n(z.left.n-z.right.n);return z
class S(nt):
    def visit_Num(t,z):return n(sum(p(int,list("".join(p(str,range(1,z.n+1)))))))
print(to_source(S().visit(A().visit(M().visit(parse(input()))))))

懒得写空洞的,所以我给你解释一下这些类:

M(NodeTransformer|nt) - converts multiplication and division into their results.
A(NodeTransformer|nt) - converts addition and subtraction into their results.
S(NodeTransformer|nt) - converts numbers into their sum of digits via the Pythonic (naïve) way.

最后一行只是按照输入上的适当顺序执行这些类,以保留操作顺序并防止不必要的行为。

用法示例($或>表示用户输入),顺便说一句,实际程序仅接受一次输入:

$ python3 summer.py
> 5
15
> 10
46
> 12
51
> 1000000
27000001
> 55*96-12
81393

这是惊人的,但令人恐惧。不知道是否允许(故意使用长时解决方案),但是我是10/10。
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ为什么不允许它故意使用长解决方案?我没问题。至少我会以842+的分数击败解决方案;)

他们应该是竞争性的答案,意味着努力。另外,删除该评论。SE年龄限制为13岁!!!您可能应该等到法律允许您开机后再进行操作。由于COPPA(google it),您必须年满13岁才能使用这样的互联网。
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ现在我很好奇,那个用户是谁?

1
@cat我无法发音的阿拉伯名字吗?可能是裸体帐户。
Rɪᴋᴇʀ

1

C#(108)

int c(int n){return string.Join("",Enumerable.Range(1,n).Select(i=>i+"")).ToArray().Select(c=>c-'0').Sum();}

漂亮

int c(int n)
{
    return string.Join("", Enumerable.Range(1, n).Select(i => i + "")).ToArray().Select(c => c - '0').Sum();
}

3
这不是有效的答案,因为它是函数并且字符数很大
ST3 2014年

1
您不需要ints;在C语言中,所有内容默认为int...哦,是C#。
wizzwizz4 2016年

1

Ruby-> 83-50 = 33

p (1..eval(gets.chomp)).each.inject{|c,e|c+e.to_s.chars.map{|x|x.to_i}.inject(:+)}                     

“要测试”版本:

module Math
  class CountSum
    def sum(number)
      (1..number).each.inject do |c, e|
        c + e.to_s.chars.map{ |x| x.to_i }.inject(:+)                                                  
      end
    end
  end
end 

测试结果

$ rspec sum_spec.rb  --format doc --color

Math::CountSum
  #sum
    single digit number
      when 5, should return 15
    double digit number
      when 12, should return 51
    arbitrary number
      when 1000000 should return 27000001

Finished in 5.34 seconds
3 examples, 0 failures

1

C#(80)

这是我的另一尝试。

double c(int n){double s=0;while(n>0)foreach(var c in n--+"")s+=c-48;return s;}

漂亮

double c(int n)
{
    double s = 0;
     while (n > 0)
        foreach(var c in n--+"") 
            s += c - 48;
    return s;
}

是否在n--和之间+需要空格?我不认为它是其他C风格的语言。
FireFly 2014年

1
这在给定范围内有效吗?的结果2^64-1不适合64位。
marinus 2014年

2
这不是一个有效的答案,因为它是函数,并且字符数很大。
ST3 2014年

@marinus您能给我们2 ^ 64-1的结果,以便我们知道需要处理的范围吗?我不敢用我的语言(PowerShell)测试它,因为处理时间很长。
Iszi 2014年

@Iszi:我实际上不会运行它,但是您可以做一些数学运算:1)一个数字的平均值是4.5;2)20位数字的平均和为902^64有20位数字);所以预期值会在左右90 * 2^64 ≈ 1.66*10^21。因此,您至少需要至少一些7172
marinus 2014年

1

Ruby 69-50 = 19(或-4)

这绝对是可以golfed在一起,但这里是第一次第五次尝试

p (1..eval(gets)).inject{|i,s|i+=s.to_s.chars.map(&:to_i).inject :+}

它也适用于所有数字,但是对于它们来说却非常慢,因为它比O(n)慢,因此我不会加上-25。如果缓慢是好的,那么这将是-4虽然

红宝石133-50-25 = 58

这是更快的版本,运行时间少于O(n)(并且使用实际的数学运算!),因此它可以快速提供大整数的结果,因此我添加了-25:

n=eval(gets);p (d=->n,l{k=10**l;c,r=n.to_s[0].to_i,n%k;n<10?n*(n+1)/2:c*45*l*k/10+k*(c*(c-1)/2)+(r+1)*c+d[r,l-1]})[n,n.to_s.length-1]

我们编写完全相同的代码(您打了一点球)!
2014年

@Beterraba是的,几乎是同一时间,但是您的速度要快一些,所以我必须弄清楚一些不同的东西:)
SztupY 2014年

1

哈斯克尔74-25 = 49

main=getLine>>=print.sum.map(\c->read[c]).concatMap show.(\x->[0..x]).read


使用interact>>=列表相同的事实flip concatMap,您可以像这样打高尔夫球至63个字符:main=interact$show.sum.map(\c->read[c]). \x->[0..read x]>>=show
Flonk 2014年

要保存的另一个字节:\c->read[c]read.(:[])
nimi

1

ECMAScript 6,86-50 = 36

for(s="",i=eval(prompt());i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c).join()).length)

少一个字符:for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c).join()).length)
牙刷

颇有几分小(你不需要的.join()for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c)).length)78-50 = 28
牙刷

1

R(72分)

f=function(n) sum(as.integer(strsplit(paste0(1:n,collapse=""),"")[[1]]))

输出:

> f(5)
[1] 15
> f(12)
[1] 51
> f(1000000)
[1] 27000001

在这些挑战中,您需要显式地编写“ f = function(n)”还是仅编写带有n的函数?
skan

@skan,取决于要求。通常,不需要具有显式功能。
djhurio '16
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.