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


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.