20
\$\begingroup\$

Task

Build a calculator, that takes any string, from a file, stdin or whatever, and adds up all the values of the chars.

Example

Input
Hello World!

Output
1085

Rules

The calculator needs to accept just ASCII encoding.

The shortest code wins.

Notes

Regarding to the comment of m.buettner, I need to say, I didn't thought of the multibyte part.
So I leave it as a bonus thing aswell.
The calculator should be run as written, so no need to modify before compiling or interpreting.

Bonus

Thanks to Synthetica, here is one more bonus,

The program that has the lowest output when you use its code as its input wins gets a star.

I don't want to modify it completly.

If you write it additional to output the (right) value in UTF-8 you get a star.

The code that executes fastest on my Laptop (Lenovo Yoga 13 Intel Core i5 3317U 1.7Ghz, 8GB RAM, 128GB SSD, Intel HD 4000, Windows 8) gets a star.

Web codes will run first under IE11 with chakra and then in FireFox 29.0.1 with SpiderMonkey

Linux code will run on a Raspberry Pi with Raspbian.

The teststring is this:

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

Have fun coding :)

Bonusscoring

I plan to do the scoring at this Saturday so the 07.06.14, all answers after that date won't get bonus points ;)

You can download the code I gonna use for testing here feel free to fork and improve it :)

Little update because of the bonus, my laptop is partially broken so I will do it probably next weekend, I am really sorry for that :(

\$\endgroup\$
17
  • 3
    \$\begingroup\$ I get 1085 for Hello World! using two different languages for ASCII values on my computer. \$\endgroup\$
    – Kyle Kanos
    Commented Jun 5, 2014 at 14:21
  • 1
    \$\begingroup\$ He probably forgot to add the '!'. edit you were 3 seconds faster... \$\endgroup\$
    – gxtaillon
    Commented Jun 5, 2014 at 14:22
  • 1
    \$\begingroup\$ Could one please explain the downvotes? \$\endgroup\$
    – Knerd
    Commented Jun 5, 2014 at 14:33
  • 4
    \$\begingroup\$ My guess is that the downvotes indicate that it's not really a good problem. \$\endgroup\$
    – Kyle Kanos
    Commented Jun 5, 2014 at 14:37
  • 6
    \$\begingroup\$ @Knerd mainly, because it's a bit too trivial in most languages (as you can see from the length of the submissions you already got) \$\endgroup\$ Commented Jun 5, 2014 at 14:43

87 Answers 87

1
\$\begingroup\$

Mathcad, 11 "bytes"

enter image description here

Uses Mathcad's built-in vector summation operator. As "whatever" is an input method, the user types the word directly into the argument for the function str2vec (which converts a string to a vector of its character codes).

\$\endgroup\$
1
\$\begingroup\$

Java 8, 113 chars

BigInteger C(String s){BigInteger i=BigInteger.ZERO;s.chars().forEach(x->i=i.add(BigInteger.valueOf());return i;}

Note each character in Java is Unicode 1-4 bytes unsigned integer, using sum function would easily overflow.

Detailed

BigInteger C (String s)
{
    BigInteger i = BigInteger.ZERO;

    s.chars().forEach(x -> i = i.add(BigInteger.valueOf(x));

    return i;
}

Java 8, 57 chars

ASCII only solution

int C(String s){return s.chars().filter(x->x<128).sum();} 

Detailed try here

public static int C (String s)
{
    return s
        .chars() // stream the characters
        .filter(x -> x < 128) // filter ASCII (optional)
        .sum(); // return the sum
}
\$\endgroup\$
4
  • \$\begingroup\$ Maybe you misunderstood -- you must work with at least ASCII, so there is no reason for you to filter ascii. \$\endgroup\$
    – cat
    Commented Apr 22, 2016 at 2:28
  • \$\begingroup\$ @cat I fixed it now, the solution wouldn't work for unicode since int would easily overflow even if you just sum two characters with higher than 2^32 / 2 \$\endgroup\$
    – Khaled.K
    Commented Apr 22, 2016 at 8:38
  • \$\begingroup\$ 101 bytes including BigInteger import. Also, your current submission fails to compile (variable referenced in lambda must be final or effectively final) \$\endgroup\$ Commented Jun 19, 2019 at 16:21
  • \$\begingroup\$ 18 bytes for the (unfiltered) ascii-only version \$\endgroup\$ Commented Jun 19, 2019 at 16:23
1
\$\begingroup\$

Mathcad, 13 "bytes"

enter image description here

Uses built-in vector summation operator and string-to-vectorOfCharacterCodes function. Definition operator ":=" entered by single key ":", summation operator by ctl-4.

\$\endgroup\$
1
\$\begingroup\$

Unipants' Golfing Language, 8 bytes

cIl+I:_o

Try it online!

Returns 660 given its own source code.

Explanation

cIl+I:_o
c        # Create an integer. We need it - you'll see why.
 I       # Input the first character.
  l  :   # While loop.
   +     # Add the character value to the integer. This is
         # why we needed an integer. Otherwise, there would
         # only be 1 item in a stack now, and the "+" op is
         # not defined for this case. In fact, it returns 0
    I    # Input the next character.
      _  # Discard a zero (the zero from the last input,
         # representing the End Of Line).
       o # Output the result.
\$\endgroup\$
1
\$\begingroup\$

JavaScript (ES6), 37 bytes

f=([c,...a])=>c?c.charCodeAt()+f(a):0

This uses a handy feature, new in ES6: destructuring assignments. When run, the variable c gets set to the first char in the string, and a gets set to the rest of the string as an array.

\$\endgroup\$
1
\$\begingroup\$

Cubix, 10 bytes

OU@;i)!^(+

Test it online!

This is almost the perfect challenge for Cubix, which can only input one char code at a time. This code expands to the following cube net:

    O U
    @ ;
i ) ! ^ ( + . .
. . . . . . . .
    . .
    . .

The code is then run, starting at the i and facing east. Here's the main loop:

  • i - input a char code from STDIN and push it to the stack. Pushes -1 on EOF.
  • ) - increment the top item.
  • ! - if the top item is non-zero, skip the next instruction.
  • ( - decrement the top item.
  • + - add the top two items. Note: the stack has infinite zeroes at the bottom.
  • . - no-op.

When EOF is reached, the ! fails, and ^ forces the instruction pointer to move north onto the top face. Then this code is run:

  • ; - pop the top item (currently a 0).
  • U - turn 180 degrees counter-clockwise. This is used to fit ;O@ on the top face.
  • O - output the top item (sum of char-codes) as a number.
  • @ - terminate the program.
\$\endgroup\$
2
  • \$\begingroup\$ I think ..;Oi?.@/+ works for the same byte count (and less instructions :P ) \$\endgroup\$
    – FlipTack
    Commented Dec 24, 2016 at 10:59
  • \$\begingroup\$ @Flp.Tkc That doesn't work on null bytes though, although perhaps "The calculator needs to accept just ASCII encoding" means it won't ever need to \$\endgroup\$ Commented Dec 24, 2016 at 11:54
1
\$\begingroup\$

Minkolang, 6 bytes

$o$+N.

Try it online!

Explanation

$o         takes all characters from input as chars (the characters are automatically
           converted to their character codes)
$+         sum up all the values
N.         output as number and end program
\$\endgroup\$
1
\$\begingroup\$

Perl 5 -pF, 15 bytes

Under the rules in place at the time of this challenge, I believe it would have been +3 for the command line flags, giving a score of 18.

map$\+=ord,@F}{

Try it online!

\$\endgroup\$
1
\$\begingroup\$

05AB1E, 2 bytes

ÇO

Try it online.

Explanation:

Ç   # Convert each character in the (implicit) input to its unicode value
 O  # Sum this list of integers
    # (after which the result is output implicitly)
\$\endgroup\$
1
\$\begingroup\$

PHP, 46 bytes

No PHP answer on this yet, so here's the easy one:

<?=array_sum(array_map(ord,str_split($argn)));

Try it online!

$ echo Hello World!|php -F addascii.php
1085

More non-competing answers:

48 bytes

Iterative:

foreach(str_split($argn)as$s)$x+=ord($s);echo$x;

Try it online!

51 bytes

Iterative 2:

while($i<strlen($argn))$x+=ord($argn[$i++]);echo$x;

Try it online!

63 bytes

Recursive:

function f($s,$c=0){return$s?f(substr($s,1),ord($s[0])+$c):$c;}

Try it online!

69 bytes

Using PHP's rarely used [citation needed] array_reduce() function:

<?=array_reduce(str_split($argn),function($c,$i){return$c+ord($i);});

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Keg, 2 bytes

?⅀

Try it online!

Explanation

?  # Read the full input string
 ⅀ # Sum the whole stack
# Implicit output
\$\endgroup\$
1
  • \$\begingroup\$ 2 bytes \$\endgroup\$
    – lyxal
    Commented Dec 4, 2019 at 4:57
1
\$\begingroup\$

W, 2 bytes

The Join function also works with numbers.

CJ

W, 4 bytes

Terribly golfed answer...

C@+R
\$\endgroup\$
1
\$\begingroup\$

Japt, 6 bytes

U¬mc x

Pretty simple. Try it online!

How it works

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
\$\endgroup\$
4
  • \$\begingroup\$ Out of curiosity, why didn't you assign ¬ to a negation of some sort? \$\endgroup\$ Commented Jan 6, 2016 at 0:49
  • \$\begingroup\$ @CᴏɴᴏʀO'Bʀɪᴇɴ Because I was in a hurry and just assigned them as I saw need, without planning ahead. I have a set that makes more sense ready to be rolled out, by changing one line of code, but I'm leery about that because it'd invalidate nearly every existing answer. \$\endgroup\$ Commented Jan 6, 2016 at 19:51
  • \$\begingroup\$ That's an easy fix. Add a conditional to the header (e.g., url/interpreter.html#new=1); anything without it uses the old character set, and anything with it uses the new character set. \$\endgroup\$ Commented Jan 6, 2016 at 19:53
  • \$\begingroup\$ @CᴏɴᴏʀO'Bʀɪᴇɴ Thanks, I'll consider that. \$\endgroup\$ Commented Jan 6, 2016 at 19:54
1
\$\begingroup\$

JavaScript function golf, 77 bytes

var s=i();var x=0;for(var i1=0;i1<sl(s);i1++){x+=schca(s,i1);}console.log(x);

I made this for you!

Yes, you got it right, it's my own function golf again. It recently got a string functions update.

The language was created after the challenge, so it's non-competing.

Validity source:

>>> var s=i();var x=0;for(var i1=0;i1<sl(s);i1++){x+=schca(s,i1);}console.log(x);
Hello World!
1085

Bonus score:

>>> var s=i();var x=0;for(var i1=0;i1<sl(s);i1++){x+=schca(s,i1);}console.log(x);
var s=i();var x=0;for(var i1=0;i1<sl(s);i1++){x+=schca(s,i1);}console.log(x);
6276
\$\endgroup\$
1
\$\begingroup\$

Java 8 - 79 bytes

interface C{static void main(String[]a){System.out.print(a[0].chars().sum());}}
\$\endgroup\$
1
\$\begingroup\$

PlatyPar, 2 bytes

us

Try it online!

u generates an array of all charcode values in the input string, and s finds their sum.

When run on itself, it returns 232.

This is similar to Conor's Jolf answer, except that I use a byte to convert the string into an array of character codes (which is implicit in Jolf), whereas he uses a byte to retrieve the input (which is implicit in PlatyPar).

\$\endgroup\$
1
\$\begingroup\$

Go, 58 bytes

func f(b[]byte)(s int){for _,e:=range b{s+=int(e)}
return}

Attempt This Online!

\$\endgroup\$
1
\$\begingroup\$

><>, 17 bytes

0i:0(?v+!
   ;n~<

basically my first answer I thought of, I couldn't think of ways to optimize this further.

\$\endgroup\$
1
\$\begingroup\$

Coreutils sum, 8 6 bytes

Gnu Coreutils sum, (obsolescent but remains available for compatibility) takes an input stream or a file. The -s flag invokes old System V logic, which just adds up the byte values.

sum -s

Try it online! 8 bytes
Notes:
* sum defaults to the BSD checksum algorithm which is also obsolescent
* Bonus score: 533⭐️
* related q:258739

\$\endgroup\$
2
  • \$\begingroup\$ The GNU man page says -s is System V sum. BSD sum rotates right 1 bit before each addition. \$\endgroup\$
    – Oskar Skog
    Commented Jun 21 at 7:56
  • \$\begingroup\$ Oops, you're right! :P \$\endgroup\$
    – roblogic
    Commented Jun 21 at 8:01
0
\$\begingroup\$

Lua 57

a=io.read();b=0;for i=1,#a do b=b+a.byte(a,i)end print(b)

Sucks that it's the longest by a long shot, but whatever.

\$\endgroup\$
0
\$\begingroup\$

C 63

main(a,b)char**b;{a+=*b[1];*b[1]++?main(a,b):printf("%d",a-2);}
\$\endgroup\$
5
  • \$\begingroup\$ Compileonline is giving me Segmentation fault (core dumped). Any tips? \$\endgroup\$
    – user21677
    Commented Jun 5, 2014 at 21:20
  • \$\begingroup\$ @tolos: Yes, it expects input as a command line argument which ideone won;t support \$\endgroup\$
    – Abhijit
    Commented Jun 5, 2014 at 21:32
  • \$\begingroup\$ Is this acutal C? Which IDE/Compiler are you using? Visual Studio 2013 doesn't accept it. \$\endgroup\$
    – Knerd
    Commented Jun 6, 2014 at 15:02
  • \$\begingroup\$ I compiled with VS2012, yet to install 2013. Note, you actually have to compile as a C Program not as a C++ to make this work \$\endgroup\$
    – Abhijit
    Commented Jun 6, 2014 at 15:34
  • \$\begingroup\$ Ok, didn't know that. I gonna try it as C programm later. \$\endgroup\$
    – Knerd
    Commented Jun 6, 2014 at 23:12
0
\$\begingroup\$

Perl 33

$_=<>;$x+=ord for split'';print$x

I don't know Perl too well. I'm sure it can be golfed some more.

\$\endgroup\$
1
  • \$\begingroup\$ Nice short answer. Think needs a chomp somewhere though, as gives 1095 as answer to Hello World! instead of 1085. \$\endgroup\$
    – steve
    Commented Oct 7, 2015 at 17:46
0
\$\begingroup\$

Cobra - 81

class P
    def main
        c,d=Console.readLine,0
        for i in c,d+=i to int
        print d
\$\endgroup\$
0
\$\begingroup\$

C# in LINQPad, 28

Console.ReadLine().Sum(i=>i)
\$\endgroup\$
5
  • \$\begingroup\$ Will it execute as it is written? See the notes ;) \$\endgroup\$
    – Knerd
    Commented Jun 5, 2014 at 20:07
  • \$\begingroup\$ Edited and fixed. \$\endgroup\$
    – Jacob
    Commented Jun 5, 2014 at 20:24
  • \$\begingroup\$ Won't execute, you are missing the using System; part. \$\endgroup\$
    – Knerd
    Commented Jun 5, 2014 at 20:37
  • \$\begingroup\$ Ok, since I'm a LINQPad-addicted, I tend to forget those envrionment things. I decided to edit the title ;) and I think now it works just fine. \$\endgroup\$
    – Jacob
    Commented Jun 6, 2014 at 4:45
  • \$\begingroup\$ Yeah, should work. For the speed test I gonna add the environment stuff ;) \$\endgroup\$
    – Knerd
    Commented Jun 6, 2014 at 7:06
0
\$\begingroup\$

J (9 chars)

In the REPL, we only need 6 chars:

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

To make it a re-usable program, we need to add 3 chars of decoration:

   as=: [: +/ a.&i.
   as 'Hello World!'
1085
\$\endgroup\$
0
\$\begingroup\$

Common Lisp, 35

(reduce'+(read-line):key'char-code)

Produces 3053 when given its own code.

\$\endgroup\$
0
\$\begingroup\$

><>, 19 bytes

0i:1+?!v+!
    ;n~<

It does work on Unicode. For example, this correctly outputs 27272 : ⚳ℚ⊻

Try it here

\$\endgroup\$
1
  • 3
    \$\begingroup\$ I don't think that this deserves its own answer, so here's a 14 byte version (split into two lines): ii:0(7$.+!, ~n;. 0 in place of i would work, too. An alternate 17 byte version of yours would be ii:0(?v+!, ;n~< (again, in two lines - this time without whitespace on the second) \$\endgroup\$
    – cole
    Commented Oct 9, 2015 at 3:39
0
\$\begingroup\$

Perl 22

s/./$t+=ord$&/eg;say$t

sample:

perl -nE 's/./$t+=ord$&/eg;say$t'  < <(echo -n Hello\ World\!)
1085
\$\endgroup\$
0
\$\begingroup\$

Perl, 34 32 27 25 21+1=22 bytes

Added 2 due to the need for -p flags. Thanks to @manatwork for the guidance.

$a+=ord for/./g;$_=$a

Test:

echo 'Hello World!' | perl -pe '$a+=ord for/./g;$_=$a'
1085
\$\endgroup\$
2
  • 1
    \$\begingroup\$ No need for parenthesis around the statement modifier's expression. And no need to explicitly assign the input to $_ – after all, that makes it default variable. $a+=ord for<>=~/./g;print$a \$\endgroup\$
    – manatwork
    Commented Oct 7, 2015 at 19:19
  • 1
    \$\begingroup\$ As both -n and -p cost the same 1 character, better use the later and replace print$a$_=$a. \$\endgroup\$
    – manatwork
    Commented Oct 7, 2015 at 19:25
0
\$\begingroup\$

Java, 144 bytes (sum of 13067)

interface S{static void main(String[]A){int I=0;for(char J:new java.util.Scanner(System.in).nextLine().toCharArray())I+=J;System.out.print(I);}}
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.