Підсумовуйте числа за стандартними в


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 це робить.
Окс

Я вважаю, що ваша відповідь на 2 байти була першою. Ви переможець! (Якщо хтось не знайде відповідь у 1 байт.)

4
@ Лембік Або відповідь у 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? Якщо так, то, будь ласка, дивіться оновлене пояснення. Гарне питання.
seshoumara

paste -s -d+|bcце 15 байт
Девід Конрад

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

14

MATL , 2 байти

Us

Це очікує введення в текстовому файлі під назвою defin.

Gif або цього не сталося :

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

Або спробуйте в Інтернеті! ( дякую Деннісу за налаштування! )

Пояснення

Коли програма 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методу на його вхід і друкує його додатковим новим рядком.

Що це за перл 5?

15
це звучить як lolcode
Bryan

@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

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


Перетворити в одинарний:

.*
$*

Порахуйте кількість 1s:

1

1
Цікаво, як Retina як мова на основі регулярних виразів може скласти суму в менших байтах, ніж найкоротший баш-відповідь, розміщений до цих пір. +1
seshoumara

Це читання від стандартного в?

2
@ Лембік Так.
Райлі

Якщо введення в одинаковому режимі було дозволено, це був би лише один байт.
mbomb007

@ mbomb007 Я вже спробував це в sed.
Райлі

8

Мозок-Флак , 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
@ Лембік accolades, мабуть.
Майкл Транспорт

7

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

Дякуємо @KevinCruijssen за байт!

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

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


3
Дуже приємно і чисто.

Я ніколи не програмую на Bash , але чи не можливо видалити пробіл між ними do ((? TIO , здається, працює.
Kevin Cruijssen

@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) тому що сума очікує якихось числових неявних перетворень від String або в цьому випадку явного.
Стефан Алексич

6

PHP, 22 байти

<?=array_sum(file(t));

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

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



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

Пітон, 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
Я вважаю, що ви також можете це зробити за допомогою стандартного введення, зателефонувавши «відкрити (0)». Не впевнений, чи можна це використати для скорочення вашої відповіді.
коул

@Cole dennis вже має таке рішення, тому свою відповідь я залишу так.
Rɪᴋᴇʀ

Моя помилка, вибачте за це; Я не читав все це до того, як прийшов до вашої відповіді.
коул

@Cole це нормально, я не проти.
Rɪᴋᴇʀ

4

Математика, 19 байт

Передбачає середовище ноутбука Mathematica.

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

Очікує, що вхід буде у файлі a.


Це божевільна мова :)

4
@ Лембік звичайні люди писали б це з легкістю як 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може бути також і для наочності.
Ерік Аутгольфер


4

Чистий баш, 30

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

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

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

+1 Дуже приємно. Чи читається також останній рядок вхідного файлу? Я запитую, тому що якщо його замінити на "+", $[]розділ буде помилковим через "+".
seshoumara

@seshoumara Виявляється, що readвідкидає остаточні кінцеві нові рядки, навіть якщо розмежувач рядків перекреслений на _. Це, можливо, застереження read, але воно добре справляється з цією ситуацією.
Цифрова травма

Я завжди радий бачити чисте баш-рішення.



3

jq , 5 байт

add, плюс прапор командного рядка -s.

Наприклад:

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

6 байт . Оскільки -saddне вийде, порахуйте пробіл.
agc

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

1
@ThisGuy, добре, -sпрапор короткий за " --slurp ", (прочитайте весь вхідний потік у великий масив та запустіть фільтр лише один раз), що змінює як jqінтерпретацію вхідних даних, так і спосіб роботи коду. Це не так, як -eу sedякому просто повідомляється, sedщо наступний рядок є кодом. Це -sбільше схоже на частину самої jqмови, і тому 6-байтний пробіл був би занадто.
agc


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.