Сумма натуральных чисел. [закрыто]


14

Проблема:

Учитывая набор целых чисел, найдите сумму всех положительных чисел в нем.

Входные данные:

  • t - количество тестов [ t <1000]
  • В каждой из следующих t строк целое число N [-1000 ≤ N ≤ 1000]

Выход

Программа должна вывести сумму всех натуральных чисел.

Проверьте свой код в онлайн-судье

Гол

Оценка равна размеру исходного кода вашей программы, за исключением символов с кодом ASCII ≤ 32.

Вот список лучших результатов: Лучшие результаты Python (лучший результат - 29)


13
На spoj.pl/SHORTEN гораздо больше проблем с Codegolf . Не вижу смысла дублировать их здесь.
hallvabo

3
почему этот вопрос помечен как python. Нас интересует только решение на python?
Aman ZeeK Verma

24
Я не думаю, что вопросы с сайтов конкурса должны быть размещены здесь.
fR0DDY

2
Я уже сделал это на SPOJ. Некоторое время назад они продвинули все ответы Python2.6 на Python3, хотя некоторые из них не будут работать под Python3 и будут длиннее в Python3 - например, придется использовать int (input ()) вместо input () и print (x) вместо печати х. Поэтому я больше не отношусь к SPOJ очень серьезно. Я связан с Тимом Питерсом, и этого достаточно для меня :)
gnibbler

4
Я просто хочу отметить, что пропуск T(число ... errr ... цифр (?)) Не вариант ... так как тестовые случаи содержат дополнительные данные после Tчисел ... ваш код не будет работать в SPOJ. Каждый (3 ответа ниже), казалось, умело пропустил первое целое число.
st0le

Ответы:


34

Пробел, 0

Я не мог устоять. S= пробел, T= табуляция, N= перевод строки, все имеют коды ASCII <= 32.

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

Base64 кодируется для легкого копирования и вставки.

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=

3
(+1) Хорошая программа! Крошечный «FWIW»: 9 символов могут быть удалены из-за 9 случаев ненужного Sдвоичного кодирования числа. Это все в инструкциях типа push-number-to-stack в форме SSSS...N, где четвертое Sкодирует лишний ведущий 0. (Конечно, это не влияет на счет.)
res

13

Элемент, 17 символов плюс 1 пробел

_'[_ 2:n;0>[n~+]]`

Это мой первый построенный язык. Это разработано, чтобы быть очень компактным и удобочитаемым. Все инструкции состоят из одного символа и выполняют одну функцию.

Элемент имеет два стека и хэш в качестве структуры памяти. Два стека называются основным стеком и стеком управления. Основной стек - это место, где происходит арифметика, ввод-вывод и манипулирование хешем. В стеке управления выполняются логические операции, и этот стек управляет циклами while и for.

Основная идея Element заключается в том, что есть хеш, который хранит числа / строки, в то время как стек используется для вычисления этих чисел. Результаты этих вычислений затем могут быть назначены определенное место в хеш для будущего использования. Разное содержимое хеша называется элементами, поэтому оно похоже на массив, но может иметь нечисловые имена.

РЕДАКТИРОВАТЬ: Вы можете найти переводчика для элемента (написанный на Perl) здесь .

Вот список операторов: В некоторых из этих примеров m и n представляют числа уже в стеке.

text  --pushes the string "text" onto the main stack
'     --pops from main stack and pushes onto control stack
"     --pops from control stack and pushes onto main stack
#     --pops from main stack and destroys
[]    --FOR statement (view the top number number from control stack and eval those many times)
{}    --WHILE (loop until top number on control stack is 0)
(     --pops from main stack, removes first character, pushes the remaining string onto stack, and pushes the removed character onto stack
)     --pops from main stack, removes last character, pushes the remaining string onto stack, and pushes the removed character onto stack
~     --pops from main stack, pushes contents of the element with that name
+-*/%^ --pops two most recently named elements, adds/negates/multiplies/divides/modulates/exponentiates them, and places the result on the stack
mn;   --pops m and n and assigns element n the value of m
mn@   --pops m and n and moves mth thing in stack to move to place n in stack
m$    --pops m and pushs size of m onto the stack
mn:   --pops m and n and pushes m onto the stack n times
mn.   --pops m and n and pushes m concatonated with n
m?    --pops m and pushes 0 onto control stack if m is '0' or and empty string, else pushes 1 
\     --escapes out of next character, so it isn't an operator and con be pushed onto the stack
><=   --pops two numbers off of stack and tests, pushes 1 onto control stack if true and 0 if false
`     --pops from main stack and prints
&|    --pops two items from control stack, performs and/or respectively, and pushes result back onto control stack
!     --pops a number off of control stack, pushes 1 if 0 or empty string, 0 otherwise
_     --inputs a word and pushes onto main stack
m,    --pops m from main stack, coverts it to char and pushes, converts to num and pushes
Newlines and spaces separate different elements to be pushed onto the stack individually, but can pushed onto the stack using \

Вот пошаговое руководство по работе программы:

_'[    --take the first line of input, transfer it to the control stack, and start a for loop
_ 2:   --take one more line of input, and duplicate it so that there are two copies
n;     --take one copy and put into element n
0>     --push a zero onto the stack, remove the zero and the other copy of the input, and compare. A 1 will be placed on the control stack if the input was greater than zero, a 0 otherwise.
[      --starts another for loop if the comparison was true. This loop will be repeated once if the comparison was true and no times if it was false, so it is the same as an IF statement.
n~     --pushes n onto the main stack, then pops it ans replaces it with the contents of n, which is the number stored earlier
+      --takes the number and adds it to the running total, which is contained as the last item on the stack
]      --ends the inner for loop
]      --ends the outer for loop
`      --print the top item (also the only item) on the stack to output

6
Такая запись была бы значительно улучшена с указателем на рабочую среду.
dmckee --- котенок экс-модератора

5
Я не думаю, что вы понимаете, что означает «читабельное».
wchargin

3
@WChargin он привык к Perl ...
Caridorc

@WChargin Каждый язык не читается, пока вы не изучите его. ;)
Мартин Эндер

8

Perl, 31

<>;$i+=$_*($_>0)while<>;print$i

Не будет ли использование sayсделать это немного короче? Это будет лучше всего связано с 29 персонажами.
г-н Лама

Нет, потому что sayне является встроенным и (по крайней мере) требует переключателя командной строки, который будет учитываться при подсчете символов.
Тимви

Его можно сократить до 29 байт, используя $\ вместо $i:<>;$\+=$_*($_>0)while<>;print
Heiko Oberdiek

5

Руби 1.9.2, 37

p eval [*$<].join.gsub(/\A\d+|-\d+|\n/, '+0')

Вызовите как ruby ​​scriptname file_with_ints.


Я не могу много читать по Ruby, но это даже читает количество тестов?
Джои

Нет , это не ...
st0le

@ st0le: Просто заметил, что, по-видимому, в настоящее время ни одно решение не решает задачу.
Джои


5

Хаскелл, 58

Правильно оперирует только tцелыми числами. Я не спровоцировал это против Споя, потому что я просто не хочу там регистрироваться.

f (x:l) = take x l
main = interact $ show . sum . f . map (max 0.read) . lines

Что такое " tцелые числа"?
wchargin

4

код в C 89 символов


x="%d";  main(b,a,t)  {  
  for(scanf(x,&t);t;t--)
    {  scanf(x,&a); a>0?b+=a:a; }  printf(x,b-1);
       return 0; }

Я много пытался уменьшить свой код менее 63 байт, но я могу уменьшить его только до 89 байт. Пожалуйста, помогите мне уменьшить его до 63 байт или даже меньше.


1) Я насчитал 90 символов. 2) return 0;нет необходимости, forцикл может быть сокращен до for(scanf(x,&t);t--;scanf(x,&a),a>0?b+=a:a);==, что составляет 78 символов ...
VX

Не компилируется с gcc 4.8.1error: initializer element is not computable at load time x="%d"
manav mn

4

Perl, 33

<>;while(<>){$i+=$_ if$_>0}print$i

Хотя пространство необходимо, так что кажется странным не считать его. Ну да ладно, правила есть правила.

Хм. Я мог бы, вероятно, сойти с рук с помощью имени переменной, которая не учитывается в общей сумме. Дело в том, что я не уверен, как бы я вставил код тогда.


Просто покажите их как $ ^ A - $ ^ Z, но помните, что многие из этих переменных имеют особое значение.
ниндзя

3

Clojure, 71

(reduce + (filter pos? (map #(Integer/parseInt %) (next (line-seq *in*)))))

Это не производит никакого вывода, и терпит неудачу, потому что *in*не является java.io.BufferedReader, как требуется line-seq.
Джон Кромарти

Также игнорируется количество строк ввода t .
Джон Кромарти

3

Памяти Денниса М. Ричи

Unix 57¹ 72:

n=$(head -n1 i); echo $(($(head -n $((n+1)) i | tail -n $n | grep -v "-" | tr '\n' '+')0))

при условии, что я - файл, содержащий целые числа.

¹) ошибся, включил количество строк и добавил на 1 строку меньше.

echo $ (($ (cat i | head -n $ (head -n1 i) | grep -v "-" | tr '\ n' '+') 0))


2

Хаскелл, 51

main = interact $ show . f . lines
f (x:l) = foldl (+) 0 $ map read l

(дополнительные пробелы для ясности, так как они не учитываются)

Haskell ... интересен, так как вы склонны получать программы со значительным количеством необходимых пробелов.


2
Вы забыли filter (>0).
FUZxxl

2

C, 88


x="%d";  main(b,a,t)  {  
for(scanf(x,&t);t--;)  
{  scanf(x,&a); a>0?b+=a:0; }  printf(x,b-1);
return 0; }

После еще одного большого усилия код становится на один символ меньше, помогите мне уменьшить его еще больше.


6
просто отредактируйте оригинальный ответ в следующий раз
трещотка урод

удалить ( return 0;) и ( {}для for)
l0n3sh4rk

b,x="%d";main(a,t){for(scanf(x,&t);t--&&scanf(x,&a);)b+=(a>0)*a;printf(x,b);}<- 77 байт
Walpen

@walpen: они использовали тот факт, что их параметр типа argc был установлен в 1, ваш b не инициализирован ...
VX

2

Befunge-98 (24)

(Убедитесь, что вы используете интерпретатор, который может читать отрицательные числа (кажется, довольно распространенная ошибка, но RcFunge работает))

<;-1\+*`0:&\_\#;.@;:;#&0 

Perl (25)

(Perl позволяет управлять символами в именах переменных, я назвал свою переменную ^ B (ASCII 2), чтобы она не учитывалась для достижения цели.)

<>; $ ^ B + = $ _ *! / - / для <>; выведите $ ^ B

(Нормальный вариант (27 символов)):

<>;$B+=$_*!/-/for<>;print$B

я сначала проигнорировал ваш ответ на Perl, когда увидел переменную с именами и полностью пропустил отличную
ardnew

2

APL (10)

+/{0⌈⎕}¨⍳⎕

Объяснение:

  • ⍳⎕: прочитать строку, выдает список [1..N] для ввода пользователем N
  • ¨: для каждого элемента в этом списке ... (т.е. сделать N раз)
  • 0⌈⎕: прочитать строку, вернуть максимум 0 и введенное N
  • Теперь у нас есть список всех положительных N, введенных пользователем, и 0, где пользователь ввел что-то отрицательное.
  • +/ дает сумму этого списка.
  • Результат выводится по умолчанию (потому что мы ничего не делаем с ним).

2

Математика: 18 16

Boole[#>0]&/@x.x

Хорошая функция, но как она обрабатывает указанный ввод, разделенный символом новой строки? Как это не включает в себя количество параметров тестовых случаев t как часть суммы? Как оно суммирует только до указанного количества тестовых случаев, даже если дано больше?
Джонатан Ван Матре


1

Вопрос, 12

{0+/x(&)x>0}

пример использования

q){0+/x(&)x>0} 1 -1 2 3 -1
6

1

befunge, 35 24

:0`j&1-\&:0`*+\:0`3*j$.@

с небольшим вдохновением, увидев ответ Маринус, я также управлял 24 персонажами. но у меня совершенно другой подход.



1

C 70 72 символов

s;main(i,c){for(;c--;i>0?s+=i:0)scanf("%d",s?&i:&c);printf("%d",s-1);}

Результаты на сайте SPOJ определенно кажутся нереальными - я понятия не имею, как снизить это до 63.

Тем не менее, 68 символов достижимы в некоторых компиляторах, злоупотребляя неопределенным поведением. Следующее работает на x86 Linux с 32-битным gcc, в котором все аргументы передаются в стек.

s;main(i,c){for(;c--;i>0?s+=i:0)scanf("%d",&i+!s);printf("%d",s-1);}

1

Excel, 27

=SUM(INDIRECT("A2:A"&1+A1))

считать т в A1, остальные данные a2 и вниз


1

Clojure, 108

(let [[n & m] (->> *in* java.io.BufferedReader. line-seq (map read-string))]
  (->> m (take n) (filter pos?) (apply +) println))

Я действительно хотел бы избежать этой java.io.BufferedReader.части, так как она стоит 24 символа. Но AFAIK нет возможности читать строки из STDIN без него.


1

Perl, 20

Я знаю, что он старый и тривиальный, но ответ на Perl можно улучшить:

#!perl -p
$.<2or$\+=$_*!/-/}{

Это круто! Но что }{значит / делает?
Даньеро

0

C ++:

#include<iostream>
using namespace std;
int main()
{
    int c,n,s=0;cin>>c;
    while(c--)
    {
        cin>>n;s+=n*(n>0);
    }
cout<<s;return 0;
}

115 символов в длину. Нужно оптимизировать его до 90. Есть предложения?


2
Просто стандартные приемы: возврат не требуется в стандартном C ++ или C99, есть неявное return 0в main. Делая переменные глобальными, вы можете отказаться от =0инициализации. Наконец, for(;;)такое же количество символов, как и у while()вас, но у вас есть два дополнительных места для выражения.
Хан

Это уже старое, но, кроме того, писать std::до cinи coutизбавиться от using namespace std;может спасти еще 5 символов.
Морвенн


0

Python: (92 символа)

t = int(raw_input())
n = [int(raw_input()) for i in range(t)]
print(sum([n[i] for i in range(t) if n[i]>0]))

Использование a=raw_inputи r=rangeи использование a()и r()позже может сохранить довольно много символов.
Morwenn


0

С

void main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
     {
     if(i>0)
     sum=sum+i;
     }
printf("sum of positive numbers is %d",sum);
}

1
Добро пожаловать в CodeGolf.SE! Если вы посмотрите на другой ответ, вы увидите, что они имеют отформатированный код и минимальный заголовок, отмечающий язык реализации; по более сложным задачам у многих также есть заметки о реализации и любых ограничениях или неожиданностях в коде. Без этого ваш ответ вряд ли будет хорошо принят.
dmckee --- котенок экс-модератора

Я посчитал символы, добавил отступ, чтобы сделать компоновку кода, и удалил оформление вывода. Ох - теперь я должен снова посчитать. :)
пользователь неизвестен

Добавлено название языка. Здесь есть много места для сокращений - sumможет быть уменьшено до s, выходная строка может быть просто "%d"и т. Д.
Гарет


0

45 символов в питоне

c=0
j=input
for i in j()*[0]:
    b=j()
    c+=b*(b>0)
print c

1
Как ты это посчитал? Это дает мне 54 символа.
Манатворк

@manatwork, у этого вопроса есть нестандартные правила оценки, которые не учитывают пробелы.
Питер Тейлор

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