添加char值的计算器


18

任务

构建一个计算器,该计算器从文件,stdin或其他任何文件中获取任何字符串,并将所有char值加起来。

Input
Hello World!

Output
1085

规则

计算器仅需要接受ASCII编码。

最短的代码获胜。

笔记

关于m.buettner的评论,我需要说,我没有想到多字节部分。
所以我也把它当作奖励。
计算器应按书面形式运行,因此无需在编译或解释之前进行修改。

奖金

多亏了Synthetica,这是另外一项奖励,

当您使用其代码赢得输入时,其输出最低的程序将获得一颗星。

我不想完全修改它。

如果您额外写它以输出UTF-8中的(正确)值,则会得到一个星号。

在我的笔记本电脑上执行最快的代码(联想Yoga 13 Intel Core i5 3317U 1.7Ghz,8GB RAM,128GB SSD,Intel HD 4000,Windows 8)获得了好评。

网络代码将首先在带有轮轮的 IE11下运行,然后在带有SpiderMonkey的 FireFox 29.0.1中运行

Linux代码将在具有Raspbian的Raspberry Pi上运行。

测试字符串是这样的:

q/%8hnp>T%y?'wNb\},9krW &D9']K$n;l.3O+tE*$*._B^s!@k\&Cl:EO1zo8sVxEvBxCock_I+2o6 yeX*0Xq:tS^f)!!7=!tk9K<6#/E`ks(D'$z$\6Ac+MT&[s[]_Y(`<g%"w%cW'`c&q)D$0#C$QGf>?A$iawvc,}`9!('`c&q)D$0#C$QGf>?A$iawvc,}`9!(

玩得开心编码:)

奖金计分

我计划在这个星期六进行评分,因此07.06.14,该日期之后的所有答案都不会获得加分;)

您可以在此处下载我将用于测试的代码,以方便进行分叉和改进:)

由于奖金很少更新,我的笔记本电脑部分坏了,所以我大概在下个周末这样做,对此我真的很抱歉:(


3
Hello World!在计算机上使用两种不同的ASCII值语言得到1085 。
Kyle Kanos 2014年

1
他可能忘记了添加“!”。编辑您快了3秒...
gxtaillon 2014年

1
可以请解释一下投票吗?
Knerd 2014年

3
我的猜测是,反对票表明这并不是一个好问题。
Kyle Kanos 2014年

5
@Knerd主要是因为在大多数语言中它都太琐碎了(如您所看到的提交内容的长度所示)
Martin Ender 2014年

Answers:


10

GolfScript,4个字符

{+}*

只需使用fold运算符(*)即可累加所有字符。

如果必须使用空字符串,则为9个字符:

{{+}*}0if

感谢@PeterTaylor提供了与空字符串一起使用的替代6字符版本:

0\{+}/

在空字符串上不起作用。
霍华德

@霍华德好点;编辑。
门把手

0\{+}/支持空字符串
Peter Taylor 2014年

1
@Doorknob对这个愚蠢的问题感到抱歉,我该如何输入数据?我使用golfscript.apphb.com
Knerd 2014年

2
@immibid一只眼睛怪异的独眼巨人。:-P(或在GolfScript中为“交换并添加每个”面!)
Doorknob

7

杀伤人员地雷(8)

+/⎕UCS⍞

说明:

  • +/ 的总和
  • ⎕UCS 的unicode值
  • 字符输入

结果将是什么Hello World!
Knerd 2014年

@Knerd :1085。如果它给出另一个输出,那将是不正确的。它对字符的Unicode代码点的值求和。
marinus 2014年

好吧,我没什么意思;)
Knerd 2014年

1
@knerd:表示从键盘读取了一行
marinus

您知道免费的APL口译员吗?
Knerd 2014年

6

哈斯克尔36

main=interact$show.sum.map fromEnum

它从哪里读取文本?
Knerd 2014年

标准输入 $ printf "Hello World!" | ./charsum
gxtaillon 2014年

好的,我无法在Windows机器上运行它,我在家时要在rpi上尝试
Knerd 2014年

当我执行代码时,我只会得到字符串“ Hello World!”。作为输出。这是我的命令行:ECHO "Hello World! | ghci charsum.hs
Knerd 2014年

1
使用interactshow不是getContents>>=printmain=interact$show.sum.map fromEnum
Flonk

6

Shell + GNU工具,29个字节

echo `od -An -tuC`|tr \  +|bc

接受来自stdin的输入:

$ printf "%s" 'Hello World!' | ./addchars.sh 
1085
$ 

自己的分数:2385


c,52个字节

c;main(p){while(~(p=getchar()))c+=p;printf("%d",c);}

编译(产生一些警告):

gcc addchars.c -o addchars

接受来自stdin的输入:

$ printf "%s" 'Hello World!' | ./addchars 
1085 $ 

自己的分数:4354


这是一个很好的答案。使用GNU编译器的CodeBlocks总是抱怨变量没有类型,例如int c,main(int p)。因此,我认为这些都应包含在您的答案中。
bacchusbeale 2014年

@bacchusbeale我添加了有关编译警告的注释,但我认为这在c中打高尔夫球通常是正常的。只要代码能够按预期编译并运行,就可以忽略警告。请参阅codegolf.stackexchange.com/a/2230/11259codegolf.stackexchange.com/a/2204/11259。当然,生产代码完全是另一回事。
Digital Trauma 2014年

@DigitalTrauma这些空间真的必要吗?Shell是否可以不忽略空格并使用-标记新参数?
Ashwin Gupta

@AshwinGupta您在说od命令吗?od -AntuC与的功能不同od -An -tuC
Digital Trauma

@DigitalTrauma是的,我是。我的意思是你不能od-An-tuC或者od -An-tuC
Ashwin Gupta

6

Javascript(ES6)51

alert([...prompt(x=0)].map(y=>x+=y.charCodeAt())|x)

@nderscore你能解释一下...之前prompt做什么吗?这是ES6的新事物还是ES6之前的事物?
WallyWest 2014年

1
@WallyWest它被称为传播算子,它是ES6草案的一部分。
nderscore 2014年

@nderscore因此,如果我了解扩展运算符的语法,那么您对的使用将使用[...prompt(x=0)]默认值0(稍后将在总和中使用)的提示,并将该输入作为字符数组应用... ?在技​​术上哪个与相同prompt(x=0).split(""),对吗?
WallyWest 2014年

1
@WallyWest的prompt(x=0)意思是“将x设置为0,prompt将x的设置值设置为0进行调用”,即0。相当于写(x=0,prompt(x))
Cyoce

6

gs2,1个字节

d

d0x64/ sum)当然会加总标准输入中的所有字节。


5

Python 3-28个字节

print(sum(map(ord,input())))

示例运行:

$ ./sum_string.py <<< 'Hello World!'
1085

从stdin获取输入,map向该ord函数输入s ,以获取每个字符的ASCII值sums it和prints。


忍者,我有完全相同的想法。+1。
seequ 2014年

@TheRare即使我的时间更长,我也是这样,因为我使用的是Python 2.7。我越来越生锈了;)
ɐɔıʇǝɥʇuʎs2014年

@Synthetica我一直使用Python 2.7,答案可能是python 2.7print sum(map(ord,raw_input()))
seequ 2014年

1
@TheRare,这是我的确切答案;)
ɐɔıʇǝɥʇuʎs2014年

在这里挑剔,但您可以通过更改map(ord,input())为来使其表现更好input().encode()。字节对象仍然可以求和,并且保持相同的长度。
cjfaure 2014年

5

8086汇编程序(16位)-47 41字节

test.com文件的内容是:

98 01 c3 b4 01 cd 21 3c 0d 75 f5 89 c7 c6 05 24
89 d8 b1 0a 4f 31 d2 f7 f1 80 ca 30 88 15 09 c0
75 f2 89 fa b4 09 cd 21 c3

实际工作在前11个字节中完成;我需要其余的以十进制表示法打印结果。

源代码(作为DOS debug.com汇编器的输入):

a
; input the string; count the sum
    cbw
    add bx, ax
    mov ah, 1
    int 21
    cmp al, d
    jne 100
; Prepare for output: stuff an end-of-line marker
    mov di, ax
    mov [di], byte 24
    mov ax, bx
    mov cl, a
; 114
; Divide by 10; write digits to buffer
    dec di
    xor dx, dx
    div cx
    or  dl, 30
    mov [di], dl
    or  ax, ax
    jne 114
; Print the string
    mov dx, di
    mov ah, 9
    int 21
    ret

rcx 29
n test.com
w
q

有关代码的一些说明:

  • 仅处理一行(最多行尾字符13);如果没有行尾则挂起
  • 仅支持7位字符(否则结果不正确)
  • 空输入输出0
  • 无法处理大于64K的输出
  • 地址0x10d处的指令会覆盖自身(纯一致)
  • 必须使用DosBox之类的DOS模拟器来组装和运行该程序

你怎么能理解?oO
Knerd 2014年

5

CJam,3个字节(总和260)

q1b

您可以在线尝试
感谢jimmy23013帮助砍掉2个字符:)

说明:

q     read the input into a string  
1b    convert from base 1, treating each character as its numeric value

1
q1b更短。
jimmy23013 '16

4

Befunge98,6个字节,总和:445

2j@.~+

任何口译人员都可以。我使用CCBI

用法如下:

printf 'Hello World!' | ccbi calc.fg

适用于多字节字符和空字符串。

说明

  • 2j-跳过以下两个说明(@.-参见下文)
  • ~ -将下一个字符放入堆栈
  • +-将新字符的代码值添加到当前总和中。指令指针回绕到开头,循环重复
  • ~遇到EOF时,它将反转指针的方向,并执行两条“隐藏”指令:
  • . -打印总和
  • @ - 出口

4

Ruby,13个12字节

p~9+gets.sum

sum是对字符串的字符求和的内置函数。减去10占末尾的换行符gets返回值。

(4年后编辑,更改x-10~9+x...的值~9is -10,但是它使我们可以删除p参数之间的空格,并保存一个字节。)


我一点都不熟悉Ruby,请您解释一下代码吗?
Knerd 2014年

1
gets是从标准中读取字符串直到读取换行符的函数,该函数返回String。String#sum将每个字符的值相加,并返回一个Fixnum。Fixnum#-只是减法。p是一种用于在一行上输出调试值的方法。
凯尔·史密斯

2

PowerShell-27

[char[]]$args[0]|measure -s

> SumChars.ps1 'Hello World!'

Count    : 12
Average  : 
Sum      : 1085
Maximum  : 
Minimum  : 
Property : 

如果[char[]]"$args"|measure -s只使用一个$ arg条目,则使用26 。
TessellatingHeckler

2

朱莉娅- 11 7个字符,结果总和= 943 536

由于该问题允许输入来自您想要的任何来源,因此我选择一个现有变量。假定A包含我们希望评估的字符串。

sum(A)1

事实证明,您可以直接对字符串求和,然后它将求值...但是,由于处理字符求和的方式,如果字符串中包含奇数个字符,它将输出一个字符,而不是任何类型的整数。因此,我们通过乘以1将其强制转换为int。

旧版本:

sum(A.data)

将以十六进制表示法输出(如果总和小于256,则为0x??,否则为8字节0x????????)。如果在使用结果的代码中使用,它将与其他任何数字一样运行(这就是Julia显示无符号整数的方式)。

要以十进制形式查看结果的值,请将上面的内容括入int(),如中所示int(sum(A.data))

对于不认识Julia的任何人,您都可以A采用与分配其他变量完全相同的方式进行分配。因此,A="Hello World!"A="sum(n.data)"。在需要输入"'字符的情况下,有多个选项,最简单的选择是(因为它避免了对Julia字符串文字的细微差别的了解)A=readline(),然后只需在STDIN中键入字符串即可(不能处理换行符)。和往常一样,换行符的转义序列是,\n但是我不认为您可以将它与readline()一起使用。


为该死的聪明解决方案+1 ^^您能发表一下,如何将测试值分配给变量n?我一点都不了解朱莉亚;)
克纳德(Knerd

@Knerd-我已经对其进行了编辑。希望能对您有所帮助。
2014年

太好了谢谢。我稍后尝试进行测试:)
Knerd 2014年

微小的变化-从切换变量n,以A减少从988到943得到的总和
格伦ö

好的,更大的变化-我意识到您可以直接对字符串求和,而不是使用.data; 提取字符。但是因为它们是字符,所以它们会产生奇数个字符的字符结果。乘以1可纠正这一点。
格伦O

2

K5、2个字节(功能),5个字节(程序)

功能

+/

程序

+/0:`

不确定在发布此挑战之前还是之后创建K5。不管...这太棒了!!

在K5中,如果对字符串执行算术运算,它将把字符转换为它们的ASCII码。因此,这仅使用sum运算符+/(实际上,它是plus + over)。


2

Matlab / Octave 4个字节(奖金:405)

这段代码是一个匿名函数,它可以完成工作,它需要一个字符串,并返回所需的数字。

@sum

我不确定gs2答案,但至少应该以与朱莉娅答案相同的方法来写sum(A)。我认为sum一个人也不行(甚至都不会是有效的code =)。
瑕疵的

2

开始(59个字符)

func d(s string)(t int){for _,x:=range s{t+=int(x)};return}

默认情况下,Go中的所有内容均为utf8。自身以分号表示的代码文本输出为:5399。


我不得不说我很吃惊也没有math.Sum与使用map或类似的


2

Gol> <>,4个字节(非竞争)

注意:这种语言比挑战性要新。

iEh+

它的发音像“ Golfish”吗?

@cat是的,这有点像高尔夫。
randomra

@randomra是“ gol•鱼”还是“ golf•ish”?像是用高尔鱼钓鱼,还是像打高尔夫球?
Cyoce


2

Python,24个字节

这比到目前为止的任何Python解决方案都短:一个未命名的匿名函数,该函数将字符串作为参数并返回总和。

lambda x:sum(x.encode())

在线尝试!

首先,x.encode()将其转换为bytes对象。然后,sum添加字符代码值。由于这是lambda函数,因此该值是隐式返回的。

另外,一个lambda x:sum(map(ord,x))字节数可能相同。


2

SML, 42 36

只是添加另一种语言。

fun$x=foldl op+0(map ord(explode x))

将String转换为char数组,计算每个值的ascii数,并计算所有ascii数的总和。


1
您可以放一些空格和前导;。36个字节:tio.run
##

1

C 32

f(char*s){return*s?*s+f(s+1):0;}

main(int argc,char **argv){return(argc?main(0,&(argv[1])):(**argv?**argv+main(0,argv)+((*argv)++?0:0):0));}(107个字符),尽管由于某种原因它忽略了第一个字符。另外,POSIX退出码只有8位;在bash, echo $?

规则有点宽泛,所以我没有使用main。我可能会
做些

@bebe我稍微修改了规则,以明确需要什么;)
Knerd 2014年

1

D(功能:60)

绝对不能赢得它。

假设它不需要是一个完整的程序

int c(string i){int s;foreach(e;i){s+=cast(int)e;}return s;}

这样称呼

void main ()
{
    import std.stdio;
    auto hw = "Hello World!";
    writefln("%s = %d", hw, c(hw));
}

输出:

Hello World! = 1085

D(程序:133)

不计算换行符。

void main(){import std.algorithm,std.stdio;stdin.byLine.map!((a){int s;foreach(e;a){s+=cast(int)e;}return s;}).reduce!"a+b".writeln;}

具有更多的空格和更长的变量名,以提高可读性

void main () {
    import std.algorithm, std.stdio;

    stdin.byLine
        .map!((line) {
                int sum;
                foreach (ch; line) {
                    sum += cast(int)ch;
                }
                return sum;
            })
        .reduce!"a+b"
        .writeln;
}

为了支持输入中的换行符,我可以使用byLine(KeepTerminator.yes)-正确的方式来输入20个字符-或'\n'在行后附加a- 这会破坏单行输入,并且由于CRLF而在Windows上可能给出错误的总和,即18个字符。


+1即使您知道自己不会赢,也可以发帖
Knerd 2014年

1

JavaScript(ES6)54 58

alert([].reduce.call(prompt(),(v,c)=>v+c.charCodeAt(0),0))

54字节感谢nderscore

alert([...prompt()].reduce((v,c)=>v+c.charCodeAt(),0))

效果很好,我现在在es6fiddle.net上进行了尝试
Knerd 2014年

您可以只使用Firefox;)
core1024

1
我当时在工作:D
Knerd 2014年

1
54:alert([...prompt()].reduce((v,c)=>v+c.charCodeAt(),0))
nderscore 2014年

1
现在降到51了:)alert([...prompt(x=0)].map(y=>x+=y.charCodeAt())|x)
nderscore 2014年

1

德尔斐(87 83)

function x(s:string):int64;var c:char;begin x:=0;for c in s do x:=result+ord(c)end;

不打高尔夫球

function x(s:string):int64;
var
  c:char;
begin
  x:=0;
  for c in s do
    x:=result+ord(c)
end;

循环通过Sordchar 的值添加到结果中。其中x ==结果

编辑:

通过切换到int64并更改加和来节省4个字符。


您有免费的Delphi版本(在此处插入您的版本)吗?
Knerd 2014年

嗯..不是很抱歉。但是我可以解释一些问题,如果需要的话,可以做一些测试用例。Free Pascal具有或多或少相同的语法,因此您可以这样做。
Teun Pronk 2014年

好吧,我要检查一下。
Knerd 2014年

1

k(8个字符)

+/6h$0:0

Q翻译

sum `int$read0 0

奖励值:

k)+/6h$0:0
+/6h$0:0
438i

1

J(7)

如此接近,但至今……哦,我猜想7足够好了,因为这个答案也接受空字符串。(我将变量的用法作为短语的输入from a file, stdin or whatever

+/a.i.b

说明:

a.

┌┬┐├┼┤└┴┘│─ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������

a. 包含所有ASCII字符。

   'people' i. 'pow'
0 2 6

x i. y与python的相似[x.index(i) for i in y]

   a. i. 'Hello World!'
72 101 108 108 111 32 87 111 114 108 100 33

因此,a. i. y转换y为其ASCII值的数组

   +/1 2 3 4 5 6
21

+/就像sum+/1 2 3 4 5 6手段1+2+3+4+5+6

   +/ a. i. 'Hello World!'
1085

整个过程

对于奖金:

   b=:'+/a.i.b'
   +/a.i.b
482

我想还不错。

   b=:'0\{+}/'
   +/a.i.b
478

好吧,该死

   A=:'+/a.i.A'
   +/a.i.A
449

谢谢@algorithmshark

    A=:'+/3 u:A'
    +/3 u:A
413

谢谢@marinus


+1很好的解释。一个小问题,我最好在哪里执行J?
Knerd 2014年

1
@Knerd从制造商(jsoftware.com)来,我想我不知道任何在线口译员。(有趣的事实:他们有一个用于Android的官方控制台。)jsoftware.com/download/j801
2014年

@Synthectica太酷了:D现在我需要一个Android智能手机:P
Knerd 2014年

重命名bA结果得分为449。–
algorithmhark

@algorithmshark哦,对!我现在
就说

1

R,35个字符(总和为3086) 26字节(总和为2305)

sum(utf8ToInt(readline()))

readline()是一个字符,长于一个字符,scan(,"")scan默认情况下将输入分割为空格。

用法:

> sum(utf8ToInt(readline()))
Hello World!
[1] 1085
> sum(utf8ToInt(readline()))
sum(utf8ToInt(readline()))
[1] 2305
> sum(utf8ToInt(readline()))
q/%8hnp>T%y?'wNb\},9krW &D9']K$n;l.3O+tE*$*._B^s!@k\&Cl:EO1zo8sVxEvBxCock_I+2o6 yeX*0Xq:tS^f)!!7=!tk9K<6#/E`ks(D'$z$\6Ac+MT&[s[]_Y(`<g%"w%cW'`c&q)D$0#C$QGf>?A$iawvc,}`9!('`c&q)D$0#C$QGf>?A$iawvc,}`9!(
[1] 14835

1

Japt,6个字节(非竞争)

这个答案是非竞争性的,因为Japt是在发布此挑战后创建的。

U¬mc x

很简单 在线尝试!

怎么运行的

U¬mc x  // Implicit: U = input string
U¬      // Split U into chars.
  mc    // Map each item to its char code.
     x  // Sum.
        // Implicit: output last expression

出于好奇,您为什么不分配¬某种否定?
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴ因为我很着急,只是按照我的需要分配了它们,所以没有事先计划。我有一套可以通过更改一行代码而更易于推出,但是我对此持保留态度,因为它会使几乎所有现有答案无效。
ETHproductions 2016年

这很容易解决。在标头中添加条件(例如url/interpreter.html#new=1);没有它的任何东西都使用旧字符集,而没有它的任何东西都使用新字符集。
科纳·奥布莱恩

@CᴏɴᴏʀO'Bʀɪᴇɴ谢谢,我会考虑的。
ETHproductions 2016年

1

PlatyPar,2个字节(非竞争)

us

在线尝试

u生成输入字符串中所有字符代码值的数组,并s找到它们的总和。

当自身运行时,它返回232

这类似于Conor的Jolf回答,除了我使用字节将字符串转换为字符代码数组(在Jolf中是隐式的),而他使用字节来检索输入(在PlatyPar中是隐式的)。

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.