Суммируйте числа по стандарту в


32

Рассмотрим поток / файл с одним целым числом в строке. Например:

123
5
99

Ваш код должен выводить сумму этих чисел, то есть 227.

Формат ввода строго одно целое число в строке. Вы не можете, например, предположить, что вход находится в одной строке как массив целых чисел.

Вы можете получить ввод из STDIN в виде имени файла или файла с именем по вашему выбору; Вы можете выбрать какой. Другие способы получения входных данных не допускаются.

Ввод будет содержать как минимум одно целое число. Вы можете предположить, что все целые числа неотрицательны и что их общая сумма меньше, чем .232


2
Есть ли завершающий символ новой строки? Это новая строка необязательно?
Пожалуйста, перестань быть злым

9
Здравствуй! Я отклонил эту задачу, потому что она идет вразрез со стандартами нашего сообщества для приемлемых форматов ввода / вывода, поскольку имеет ограниченный формат ввода.
AdmBorkBork

1
@AdmBorkBork и я подробно обсудили это в чате. Мы согласились не согласиться :)

22
Как автор вещей, которых следует избегать из-за громоздких операций ввода-вывода и произвольного переопределения значений по умолчанию , я хочу защитить эту проблему на этих основаниях. Здесь входные данные для обработки - это основная задача, а не дополнительная работа, которая отвлекает от основной задачи. Это не «добавление чисел» со странными требованиями к вводу / выводу, это «сделать этот ввод / вывод» с добавлением в качестве шага. Превышение стандартного ввода / вывода необходимо, чтобы ответы не проходили через основную задачу.
xnor

2
Почему нельзя использовать функциональный ввод?
CalculatorFeline

Ответы:


15

05AB1E , 2 байта

|O

Объяснение:

|   Get input as array
 O  Sum

Попробуйте онлайн!


7
Это смешно :)

Это читается из стандартного в?

1
@Lembik это делает.
Okx

Я считаю, что ваш 2-байтовый ответ был первым. Вы - победитель! (Если кто-то не находит 1-байтовый ответ.)

4
@Lembik Или 0-байтовый ответ ....
Товарищ SparklePony

21

Bash + coreutils, 16 байт

xargs|tr \  +|bc

Попробуйте онлайн!

Есть два пробела после \. Это работает и для отрицательных чисел.

Объяснение:

xargs             # known trick to turn newlines into spaces, while adding a
                  #trailing newline when printing the result (needed for bc)
|tr \  +          # turn spaces into '+'s
|bc               # calculates the sum

Вы можете спросить, почему tr \\n +|bcне лучше, так как он превращает новые строки прямо в «+». Хорошо, что есть 2 непредвиденные ошибки:

  • если вход имеет завершающий символ новой строки, то он преобразуется в завершающий «+», следовательно, после него нет номера для выполнения сложения
  • и самая странная проблема заключается в том, что bc требует завершающего символа новой строки после ввода, но вы просто заменили все входные символы новой строки на «+».

1
Мне это нравится. Это красиво и умно.

Не могли бы вы использовать tr \\ n + вместо xargs?

1
@Lembik Вы имеете в виду tr \\n +|bc? Если это так, пожалуйста, смотрите обновленное объяснение. Хороший вопрос.
Сешумара

paste -s -d+|bcсоставляет 15 байтов
Дэвид Конрад

1
@Lembik Не рассматривал этот случай, но, к счастью, сценарий все еще работает. xargs|tr \ +в этом случае ничего не происходит, и bc получает номер и печатает его обратно.
сешумара

14

MATL , 2 байта

Us

Это ожидает ввода в текстовом файле с именем defin.

Гиф или этого не случилось :

введите описание изображения здесь

Или попробуйте онлайн! ( спасибо Деннису за настройку! )

объяснение

При запуске программы MATL, если вызванный файл definнайден (имя относится к «вводу по умолчанию»), его содержимое автоматически загружается в виде текста и передается в стек в виде строки перед выполнением кода.

Функция Uоценивает строку, чтобы преобразовать ее в вектор-столбец чисел, и sвычисляет сумму, которая отображается неявно.



12

Вставить + bc, 13 байт

paste -sd+|bc

Объяснение:

paste -s        Take one line at a time from input
        d+      Joining by '+'
          |bc   Pass as expression to bc

Еще один ответ оболочки!


1
Очень аккуратно и аккуратно.

Ох, я имел paste -s -d+|bcи не понимал, что смогу объединить коммутаторы. Ухоженная!
Дэвид Конрад

12

Perl 6 , 13 байт

say sum lines

Попытайся

объяснение

  • lines()возвращает список строк из $*INили $*ARGFILES«волшебной» ввода командной строки ручки.
  • sum(…)был добавлен в Perl 6, чтобы позволить [+] Listбыть оптимизированным для Позиционеров, которые могут вычислять их сумму, не генерируя все их значения, как 1..100000
    (я просто подумал, sumчто здесь слишком мило, чтобы использовать, [+]как обычно)
  • say(…)вызовите .gistметод для его ввода и напечатайте его с дополнительной новой строкой.

Что это за Perl 5?

15
это читается как лолкод
Брайан

@Lembik это четко обозначено как Perl 6 , который является родственным языком Perl 5 .
Брэд Гилберт b2gills

Была опечатка. Я имел ввиду что это в Perl 5?

1
Хорошо $a+=$_ for <>;print $aработает в Perl 5, но может быть и более короткий путь.
Брэд Гилберт b2gills

10

C, 53 байта

r;main(i){for(;~scanf("%d",&i);r+=i);printf("%d",r);}

C снова показывает свои учетные данные :)

2
Я чувствую, что должен быть более короткий путь, но я его не вижу :)
Digital Trauma


9

Сетчатка , 11 7 байт

-4 спасибо Мартину Эндеру

.*
$*
1

Попробуйте онлайн!


Преобразовать в одинарный:

.*
$*

Подсчитайте количество 1с:

1

1
Интересно, что Retina, как язык на основе регулярных выражений, может делать сумму в меньшем количестве байтов, чем самый короткий ответ bash, опубликованный до сих пор. +1
сешумара

Это чтение из стандартного в?

2
@Lembik Да, это так.
Райли

Если бы разрешен ввод в унарном виде, это был бы только один байт.
mbomb007

@ mbomb007 Я уже пробовал это в седе.
Райли

8

Brain-Flak , 20 байтов

(([]){[{}]{}([])}{})

Попробуйте онлайн!

объяснение

Это решение, созданное Райли в чате . Его решение было:

([])({<{}>{}<([])>}{})

Если вы знакомы с Brain-Flak, это довольно очевидно. Он увеличивает высоту стека и выдает одно значение при обратном отсчете, а в конце - сумму всех прогонов.

Это довольно хороший гольф, но он обнуляет оба, {}и, тем не ([])менее, они будут иметь значения, которые будут отличаться только на единицу, поэтому, если вместо этого мы удалим маски и сделаем одно из двух отрицательных значений, они должны почти аннулироваться.

([])({[{}]{}([])}{})

Так как они всегда отличаются на единицу, у нас есть неудачное обстоятельство, когда наш ответ всегда не соответствует высоте стека. Чтобы исправить это, мы просто перемещаем начало толчка, чтобы охватить первую высоту стека.

(([]){[{}]{}([])}{})

1
Я думал об этом, как отрицательный щелчок отменяет предыдущую высоту (перед циклом или конец предыдущего времени), а последняя высота равна 0, поэтому ее можно игнорировать.
Райли


7

R 11 байт

sum(scan())

scanпринимает входные данные, один номер в строке. И sum, ну, суммы.


7

Perl 5 , 9 байт

8 байтов кода + -pфлаг.

$\+=$_}{

Попробуйте онлайн!

При -pэтом вход считывается по одной строке за раз, сохраняется в $_каждый раз. Мы используем в $\качестве аккумулятора, потому что благодаря -pфлагу он неявно печатается в конце. Используются несоответствующие }{, поэтому -pфлаг печатает только $\один раз в конце вместо печати, $_и $\в каждой строке он читает, как обычно.


Я даже не могу разобрать это! :) Пояснения, пожалуйста.

@Lembik Вот, пожалуйста.
Дада

Непревзойденная часть скобок очень неясна!

@Lembik Это не скобки ... Они либо французские, либо фигурные скобки, зависит от того, кого вы спрашиваете, но определенно нет)(
CraigR8806

1
@Lembik accolades, по-видимому.
Майкл Вёрс

7

Чистый Баш, 37 36 байт

Спасибо @KevinCruijssen за байт!

while read a;do((b+=a));done;echo $b

Попробуйте онлайн!


3
Очень красиво и чисто.

Я никогда не программирую на Bash , но нельзя ли убрать пробел между ними do ((? TIO , кажется, работает.
Кевин Круйссен,

@KevinCruijssen Да, похоже, это работает. Я использую zsh как свою ежедневную оболочку, и она не работает в zsh без пробела, я просто предположил, что она не будет работать в Bash, но, очевидно, это работает.
Betseg

6

Haskell, 32 байта

interact$show.sum.map read.lines

Попробуйте онлайн! ,

interactсобирает весь ввод из stdin, передает его функции, указанной в качестве аргумента, и печатает строку, полученную из этой функции. Функция:

            lines   -- split input into list of lines at nl
      map read      -- convert every line to a number (read is polymorphic,
                    -- but as want to sum it later, the type checker knows
                    -- it has to be numbers)
    sum             -- sum the list of numbers
show                -- convert back to string

1
Это делает меня действительно похожим на Хаскелла. В Scala я должен сделать это, lines.map(_.toInt) потому что sum ожидает какое-то числовое неявное преобразование из String или, в данном случае, явное.
Стефан Алексич

6

PHP, 22 байта

<?=array_sum(file(t));

Предполагается, что существует файл с именем «t» со списком целых чисел.

file()открывает файл и возвращает массив, в каждой строке которого хранится отдельный элемент массива. array_sum()суммирует все элементы в массиве.


5

Awk, 19 байт

{s+=$1}END{print s}

Объяснение:

{s+=$1}                For all lines in the input, add to s
        END             End loop
           {print s}    Print s

1
«Объяснение скоро произойдет ™» Это была бы моя новая броская фраза, если бы она не была торговой маркой ...
ETHproductions

2
На языке awk ваш ответ на самом деле составляет всего 19 байтов: {s+=$1}END{print s}:)
Digital Trauma

5

постоянный ток , 14 байтов

0[+?z2=a]dsaxp

Попробуйте онлайн!

Объяснение:

 [      ] sa   # recursive macro stored in register a, does the following:
  +            # - sum both numbers on stack
               #   (prints to stderr 1st time since there's only 1)
   ?           # - read next line, push to stack as number
    z          # - push size of stack
     2         # - push 2
      =a       # - if stack size = 2, ? yielded something, so recurse
               # - otherwise end macro (implicit)
0              # push 0 (accumulator)
         d     # duplicate macro before storing it
            x  # Call macro
             p # The sum should be on the stack now, so print it

4

CJam , 5 байтов

q~]1b

Попробуйте онлайн!

Как это работает

q     e# Read all input from STDIN.
 ~    e# Evaluate that input, pushing several integers.
  ]   e# Wrap the entire stack in an array.
   1b e# Convert from base 1 to integer.
      e# :+ (reduce by sum) would work as well, but 1b handles empty arrays.

Как 1bсложить цифры?
Esolanging Fruit

CJam не требует канонического представления для преобразования цифр в целые числа; [<x> <y> <z> <w>]<b>bпросто вычисляет b³x + b²y + bz + w . Когда b = 1 , это дает x + y + z + w .
Деннис

4

Python, 38 30 байт

lambda n:sum(map(int,open(n)))

В python файлы открываются open('filename')(очевидно). Они, однако, итерируемы. Каждый раз, когда вы перебираете файл, вы получаете следующую строку. Таким образом, карта перебирает каждый список, вызывая intего, а затем суммирует полученный список.

Вызов с именем файла в качестве ввода. (то есть f('numbers.txt'))

8 байтов сохранены с использованием map(int, open(n))вместо понимания списка. Оригинальный код:

lambda n:sum([int(i)for i in open(n)]) 

1
Я считаю, что вы также можете сделать это со стандартным вводом, вызвав 'open (0)'. Не уверен, что это можно использовать для сокращения вашего ответа.
Коул

У @Cole Dennis уже есть такое решение, поэтому я оставлю свой ответ таким.
R

Моя ошибка, извините за это; Я не читал до конца, пока не пришел к твоему ответу.
Коул

@ Ладно, все в порядке, я не против.
17

4

Mathematica, 19 байт

Предполагается, что среда Mathematica для ноутбуков.

Tr[#&@@@Import@"a"]

Ожидает, что вход будет в файле a.


Это безумный язык :)

4
@Lembik нормальные люди написали бы это очень легко Total @ Flatten @ Import @ "a"и просто "a" // Import // Flatten // Total. ;)
Мартин Эндер

Tr[#&@@@Import@#]&Также не будет разрешено?
ngenisis

4

Желе , 9 8 байт

ƈFпFỴVS

STDIN на самом деле не вещь желе ...

Попробуйте онлайн!

Как это работает

ƈFпFỴVS  Main link. No arguments. Implicit argument: 0

  п      While loop; while the condition returns a truthy value, execute the body
          and set the return value to the result. Collect all results (including 0,
          the initial return value) in an array and return that array.
ƈ           Body: Yield a character from STDIN or [] if the input is exhausted.
 F          Condition: Flatten, mapping 0 to [], '0' to "0", and [] to [] (falsy).
    F     Flatten the result.
     Ỵ    Split at newlines.
      V   Evaluate the resulting strings.
       S  Take the sum.

1
Второй Fможет быть также, для ясности.
Эрик Outgolfer


4

Чистая Баш, 30

read -d_ b
echo $[${b//'
'/+}]

Попробуйте онлайн.

  • reads входной файл за один раз входит в переменную b. -d_говорит, readчто разделитель строки _вместоnewline
  • ${b//'newline'/+}заменяет новые строки в bс+
  • echo $[ ... ] арифметически оценивает полученное выражение и выводит его.

+1 Очень мило. Также читается завершающий перевод строки входного файла? Я спрашиваю, потому что, если он будет заменен на «+», в $[]разделе произойдет ошибка из-за завершающего «+».
Сешумара

@seshoumara Похоже, что readотбрасывает последние завершающие переводы строки, даже если разделитель строк переопределяется _. Это, возможно, оговорка read, но она хорошо работает в этой ситуации.
Цифровая травма

Я всегда рад видеть чистое решение Bash.



3

JQ , 5 байт

addплюс флаг командной строки -s .

Например:

% echo "1\n2\n3\n4\n5" | jq -s add
15

6 байт . Так -saddкак не будет работать, посчитайте пространство.
АРУ

@agc Поправьте меня, если я ошибаюсь, но сам код add(3 байта), и вы должны добавить 2 байта для -sфлага. Пробел не считается ни кодом, ни флагом: это разделитель командной строки, используемый языком.
caird coinheringaahing

1
@ThisGuy, ну, у -sфлага есть сокращение --slurp , ( считайте весь входной поток в большой массив и запустите фильтр только один раз), который меняет как jqинтерпретацию входных данных, так и выполнение кода. Это не так , как -eв sedкоторый просто говорит о sedтом , что последующая строка кода. Это -sбольше похоже на часть самого jqязыка, и поэтому 6-байтовое пространство тоже будет.
АРУ


3

DC 22

[pq]sq0[?z2>q+lmx]dsmx

Это кажется более длинным, чем должно быть, но сложно решить, когда будет достигнут конец файла. Единственный способ сделать это - проверить длину стека после? команды.

Попробуйте онлайн .

[pq]                    # macro to `p`rint top-of-stack, then `q`uit the program
    sq                  # save the above macro in the `q` register
      0                 # push `0` to the stack.  Each input number is added to this (stack accumulator)
       [         ]      # macro to:
        ?               # - read line of input
         z              # - push stack length to stack
          2             # - push 2 to the stack
           >q           # - if 2 > stack length then invoke macro stored in `q` register
             +          # - add input to stack accumulator
              lmx       # - load macro stored in `m` register and execute it
                  d     # duplicate macro
                   sm   # store in register `m`
                     x  # execute macro

Обратите внимание, что макрос mвызывается рекурсивно. Современные средства dcреализуют хвостовую рекурсию для такого рода вещей, поэтому не стоит беспокоиться о переполнении стека.


Добро пожаловать в PPCG! Обратите внимание, что если объяснений недостаточно, они пройдут через фильтр сообщений низкого качества .
Мэтью Ро

@SIGSEGV нет необходимости приветствовать - я был здесь некоторое время ;-). Да, я писал свое объяснение, а ты комментировал. Смотрите редактировать.
Цифровая травма

1
Я должен вам байт за хитрость дублирования макроса перед его сохранением.
Брайан МакКатчон

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.