Калькулятор, що додає значення знаків


18

Завдання

Побудуйте калькулятор, який займає будь-який рядок, з файлу, stdin або будь-якого іншого, і додає всі значення символів.

Приклад

Input
Hello World!

Output
1085

Правила

Калькулятору необхідно прийняти просто кодування ASCII.

Виграє найкоротший код.

Примітки

Щодо коментаря m.buettner, мені потрібно сказати, я не думав про багатобайтову частину.
Тож я залишаю це також як бонусну річ.
Калькулятор слід запускати як написано, тому не потрібно змінювати його, перш ніж збирати чи інтерпретувати.

Бонус

Завдяки Synthetica , ось ще один бонус,

Програма, яка має найнижчий вихід при використанні її коду, коли його вхід виграє, отримує зірку.

Я не хочу його повністю змінювати.

Якщо ви напишете його додатково, щоб вивести значення (правильне) в UTF-8, ви отримаєте зірку.

Код, який виконується найшвидше на моєму ноутбуці (Lenovo Yoga 13 Intel Core i5 3317U 1,7 ГГц, 8 ГБ оперативної пам’яті, 128 ГБ SSD, Intel HD 4000, Windows 8) отримує зірку.

Веб-коди працюватимуть спочатку під IE11 з чакрою, а потім у FireFox 29.0.1 із SpiderMonkey

Код Linux буде працювати на Raspberry Pi з Raspbian.

Тестовий рядок такий:

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
Я отримую 1085 за Hello World!використання двох різних мов для значень ASCII на своєму комп’ютері.
Кайл Канос

1
Він, мабуть, забув додати "!". редагувати ви були на 3 секунди швидше ...
gxtaillon

1
Чи можете ви, будь ласка, пояснити голоси?
Кнерд

3
Я здогадуюсь, що низові свідчать про те, що це насправді не дуже гарна проблема.
Кайл Канос

5
@Knerd головним чином, тому що це занадто банально в більшості мов (як видно з тривалості публікацій, які ви вже отримали)
Martin Ender

Відповіді:


10

GolfScript, 4 символи

{+}*

Просто використовує оператор fold (* ), щоб додати всі символи.

Якщо він повинен працювати з порожнім рядком, 9 символів:

{{+}*}0if

Дякуємо @PeterTaylor за надання альтернативної шестигранної версії, яка працює з порожнім рядком:

0\{+}/

Не працює на порожньому рядку.
Говард

@Howard Хороша точка; відредаговано.
Дверна ручка

0\{+}/підтримує порожню рядок
Пітер Тейлор

1
@Doorknob вибачте за дурне питання, як мені вводити дані? Я використовую golfscript.apphb.com
Кнерд

2
@immibid Циклоп із дивним виглядом очей. :-P (або, в GolfScript, обличчя "підміняти та додавати!")
Doorknob

7

APL (8)

+/⎕UCS⍞

Пояснення:

  • +/ сума
  • ⎕UCS значення unicode
  • введення символів

Який був би результат Hello World!?
Кнерд

@Knerd : 1085. Це було б неправильно, якби він дав інший вихід. Він підсумовує значення кодових точок символів Unicode.
marinus

добре, я не зрозумів, що означає;)
Кнерд,

1
@knerd: означає прочитати рядок з клавіатури
marinus

Чи знаєте ви перекладача APL, який безкоштовний?
Кнерд

6

Haskell 36

main=interact$show.sum.map fromEnum

Звідки він читає текст?
Кнерд

stdin. $ printf "Hello World!" | ./charsum
gxtaillon

ОК, я не зміг його запустити на своїй машині Windows, я спробую його на rpi, коли я вдома
Knerd

Коли я виконую ваш код, я просто отримую рядок "Hello World!" як вихід. Це мій командний рядок:ECHO "Hello World! | ghci charsum.hs
Кнерд

1
використовувати interactі showзамість getContents>>=print:main=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


Це чудова відповідь. CodeBlocks з компілятором GNU завжди скаржиться, якщо змінні не мають типу, наприклад, int c, main (int p). Тому я думаю, що це слід включити у вашу відповідь.
bacchusbeale

@bacchusbeale Я додав примітку про компіляційні попередження, але думаю, що це, як правило, однаковий курс, коли гольф у c. Поки код збирається та працює, як очікувалося, попередження можна ігнорувати. Див. Codegolf.stackexchange.com/a/2230/11259 та codegolf.stackexchange.com/a/2204/11259 . Звичайно, виробничий код - це зовсім інша справа.
Цифрова травма

@DigitalTrauma чи всі ці простори потрібні? Чи може Shell не ігнорувати пробіл і використовувати - для позначення нових параметрів?
Ешвін Гупта

@AshwinGupta Ви говорите про odкоманду? od -AntuCне робить те саме, що od -An -tuC.
Цифрова травма

@DigitalTrauma так, я був. Я мав у виду не могли б ви зробити od-An-tuCабоod -An-tuC
Ashwin Гупта

6

Javascript ( ES6 ) 51

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

@nderscore Чи можете ви пояснити, що робити ...до promptцього? Це нова штука ES6 чи це перед ES6?
WallyWest

1
@WallyWest Це називається оператором розповсюдження і це частина чернетки ES6.
nderscore

@nderscore Отож, якщо я розумію синтаксис оператора розповсюдження, то ваше використання [...prompt(x=0)]прийняло підказку зі значенням за замовчуванням 0 (яке пізніше буде використане в сумі) і застосує це введення як масив символів ... ? Який технічно був би такий же, як prompt(x=0).split(""), правда?
WallyWest

1
@WallyWest prompt(x=0)означає "встановити x на 0, подзвонити promptзі значенням налаштування x на 0", тобто 0. Це було б еквівалентно запису(x=0,prompt(x))
Cyoce

6

gs2 , 1 байт

d

d( 0x64/ sum), звичайно, підсумовує всі байти у стандартному вході.


5

Python 3 - 28 байт

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

Приклад виконання:

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

Отримує вхід від stdin, maps ordфункцію для нього, щоб отримати значення ASCII кожного символу, sums і prints.


Ніндзя, у мене була точно така ж ідея. +1 для цього.
seequ

@TheRare Так само я зробив, навіть якщо мій був довший, тому що я використовував Python 2.7. Я стає іржавим;)
ɐɔıʇǝɥʇuʎs

@Synthetica Я завжди використовую Python 2.7, на який відповідь була бprint sum(map(ord,raw_input()))
seequ

1
@TheRare Яка моя точна відповідь;)
ɐɔıʇǝɥʇuʎs

Тут мимоволі, але ви можете зробити це краще, змінивши map(ord,input())на input().encode(). Об'єкти байтів все ще можна підсумовувати, і він залишається однакової довжини.
cjfaure

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 байт; Мені потрібно решта, щоб надрукувати результат у десятковій нотації.

Вихідний код (подайте як вхід до debug.comасемблера DOS ):

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 для порожнього вводу
  • Не вдається обробити вихід, більший за 64 Кб
  • Інструкція за адресою 0x10d переписує себе (чистий збіг)
  • Доводиться використовувати емулятори DOS на зразок DosBox для збирання та запуску цієї програми

Як ви можете це зрозуміти? оо
Knerd


4

Befunge98, 6 байт, сума: 445

2j@.~+

Будь-який перекладач повинен бути добре. Я використовую CCBI .

Використовуйте наступним чином:

printf 'Hello World!' | ccbi calc.fg

Працює для багатобайтових символів та порожніх рядків.

Пояснення

  • 2j- перейти до наступних двох інструкцій ( @і .- див. нижче)
  • ~ - поклав наступний чар на стек
  • +- додати значення коду нового знака до поточної суми. Покажчик інструкцій завершується до початку і цикл повторюється
  • при ~зустрічі з EOF він перетворює напрямок вказівника і виконуються дві "приховані" інструкції:
  • . - надрукувати суму
  • @ - Вхід

4

Рубі, 13 12 байт

p~9+gets.sum

sum- це вбудована функція, яка підсумовує символи рядка. Віднімайте 10 для обліку нового рядка в кінціgets повернення значення.

(Відредаговано 4 роки потому, щоб змінити x-10на ~9+x... значення ~9є -10, але воно дозволяє нам видалити пробіл між pта його аргументом, зберігаючи байт.)


Я взагалі не знайомий з Рубі, чи не могли б ви пояснити свій код?
Кнерд

1
get - це функція, яка читає рядок зі стандартного в, доки не буде прочитаний новий рядок, він поверне String. Рядок # сума додає значення кожного символу, який повертає Fixnum. Fixnum # - це просто віднімання. pє методом виведення значення налагодження чогось у рядку.
Кайл Сміт

2

PowerShell - 27

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

Приклад

> SumChars.ps1 'Hello World!'

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

26, якщо ви використовуєте [char[]]"$args"|measure -s, поки є лише один $ arg аргумент.
TessellatingHeckler

2

Юлія - 11 7 символів, отримана сума = 943 536

Оскільки питання дозволяє вводити інформацію з будь-якого джерела, який ви хочете, я вибираю існуючу змінну. Припустимо, що Aмістить рядок, який ми бажаємо оцінити.

sum(A)1

Як виявляється, ви можете підсумовувати рядок безпосередньо, і він оцінить ... однак, завдяки тому, як обробляється підсумовування символів, якщо в рядку є непарна кількість символів, він виведе символ, а не ціле число будь-якого типу. Як такий, ми змушуємо його кидати на int шляхом множення на 1.

Стара версія:

sum(A.data)

Виведе в шістнадцятковій нотації (якщо сума менше 256, це буде 0x??, інакше це буде 8 байт 0x????????). Якщо використовується в коді, де використовується результат, він буде працювати так само, як і будь-яке інше число (саме так, як Джулія відображає неподписані вставки).

Щоб побачити значення результату в десятковій формі, додайте вище int(), як у int(sum(A.data)).

Для тих, хто не знає Джулії, ви призначаєте Aточно так само, як і інші завдання для змінних. Так, A="Hello World!"або A="sum(n.data)". У випадку, коли вам потрібно ввести "або 'символи, є кілька варіантів, найпростіший з яких (оскільки це дозволяє уникнути потреби в знаннях нюансів лінійних літералів Джулії) з A=readline()наступним просто введенням рядка в STDIN (переміг ' t обробляти нові рядки, хоча). Послідовність виходу для нового рядка є, як завжди, \nале я не вірю, що ви можете використовувати це з readline ().


+1 для проклятого розумного рішення ^^ Чи можете ви опублікувати, як призначити тестове значення змінній n? Я взагалі не знаю Юлі;)
Кнерд

@Knerd - я це відредагував. Сподіваюся, що це допомагає.
Глен О

Чудово, дякую. Я намагаюся перевірити це пізніше :)
Кнерд

Незначні зміни - перемкнено змінну з nна Aзменшити отриману суму з 988 до 943.
Glen O

Гаразд, набагато більша зміна - я зрозумів, що ви можете підсумовувати рядок безпосередньо, а не витягувати символи .data; але оскільки вони символи, вони створюють результат для символів для непарної кількості символів. Множення на 1 виправляє це.
Глен О

2

K5, 2 байти (функція), 5 байт (програма)

Функція

+/

Програма

+/0:`

Не впевнений, чи був створений K5 до або після публікації цього виклику. Незалежно ... ЦЕ ДУЖЕ !!

У K5, якщо ви виконуєте арифметичні операції на рядках, він перетворює символи в їх ASCII-коди. Тож для цього просто використовується оператор суми +/(насправді це плюс + понад).


2

Matlab / Octave 4 байти (бонус: 405)

Цей код є анонімною функцією, яка виконує завдання, він займе рядок і поверне потрібне число.

@sum

Я не впевнений у gs2відповіді, але, принаймні, з таким же підходом, що і відповідь Юлії, я все-таки повинен писати sum(A). Я думаю, що sumпоодинці це не нормально (навіть не було б дійсним кодом =).
недолік

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+

Це вимовляється як "Гольфіш?"
кіт

@cat Так, це гольф.
randomra

@randomra це "голь • риба" чи "гольф • іш"? Як у рибі з гольтом, чи щось подібне до гольфу?
Кіос

2

Javascript ES6, 41 байт

_=>[..._].map(y=>x+=y.charCodeAt(),x=0)|x

Завдяки @ETHproductions за 2 байти збережено!


1
Як щодо _=>[..._].map(y=>x+=y.charCodeAt(),x=0)|x?
ETHproductions

2

Пітон, 24 байти

Це коротше, ніж будь-яке рішення Python поки що: неназвана анонімна функція, яка бере аргумент як аргумент і повертає суму.

lambda x:sum(x.encode())

Спробуйте в Інтернеті!

По-перше, x.encode()перетворює його в bytesоб’єкт. Потім,sum додає значення char-коду. Оскільки це лямбда-функція, значення повертається імпліцитність.

Крім того, можна мати одне lambda x:sum(map(ord,x))і те ж число байтів.



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 біт; в Баш, echo $?.

правила були трохи широкими, тому я не використовував основні. я буду працювати над чим - то , можливо , більш коротким
Бебе

@bebe Я трохи змінив правила, щоб було зрозуміло, що потрібно;)
Knerd

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'до мого рядка - який порушує однорядковий вхід і може дати неправильну суму для Windows через CRLF, для 18 символів.


+1 за публікацію, навіть якщо ви знаєте, що не виграєте
Кнерд

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
Кнерд

Ви можете просто скористатися Firefox;)
core1024

1
Я був на роботі так: D
Кнерд

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

1
Got it down to 51 now :) alert([...prompt(x=0)].map(y=>x+=y.charCodeAt())|x)
nderscore

1

Delphi (87 83)

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

Ungolfed

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

Loops through S adding the ord value of the char to the result. where x==result

Edits:

Saved 4 characters by switching to int64 and changing the adding to the sum.


Do you have a free version of Delphi (insert you version here) availiable?
Knerd

Гм .. Не дуже шкода. Але я можу пояснити un-golfed, що відбувається там, де і робити тести, якщо хочете. Безкоштовний Pascal має більш-менш однаковий синтаксис, щоб ви могли це зробити.
Теун Пронк

Гаразд, я перевірю це.
Кнерд

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схожий на пітон [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 for the great explanation. One little question, where can I best execute J?
Knerd

1
@Knerd From the makers (jsoftware.com) I guess, I don't know any online interpreters. (Fun fact: they have an official console for Android.) jsoftware.com/download/j801
ɐɔıʇǝɥʇuʎs

@Synthectica That is cool :D Now I need an Android smartphone :P
Knerd

Renaming b to A results in a score of 449.
algorithmshark

@algorithmshark Oh, right! I'll claim that star for now ;)
ɐɔıʇǝɥʇuʎs

1

R, 35 characters (sum of 3086) 26 bytes (sum of 2305)

sum(utf8ToInt(readline()))

readline() is one character longer than scan(,"") but scan split the input on spaces by default.

Usage:

> 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 bytes (non-competing)

This answer is non-competing because Japt was created after this challenge was posted.

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

Out of curiosity, why didn't you assign ¬ to a negation of some sort?
Conor O'Brien

@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.
ETHproductions

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.
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴ Thanks, I'll consider that.
ETHproductions

1

PlatyPar, 2 bytes (non-competing)

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).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.