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


14

Проблема:

Давши набір цілих чисел, знайдіть у ньому суму всіх натуральних чисел.

Вхід:

  • t - кількість тестових випадків [ t <1000]
  • У кожному наступному t рядку ціле число N [-1000 ≤ N ≤ 1000]

Вихідні дані

Програма повинна вивести суму всіх натуральних чисел.

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

Оцінка

Оцінка дорівнює розміру вихідного коду вашої програми, за винятком символів з кодом ASCII ≤ 32.

Ось найкращий список результатів: кращі результати Python (найкраща оцінка - 29)


13
На з'єднанні.pl/SHORTEN є набагато більше викликів кодогольфа . Не бачу сенсу їх дублювати тут.
hallvabo

3
чому це питання позначене python .. Чи нас цікавить тільки рішення python?
Aman ZeeK Verma

24
Я не думаю, що питання з сайтів конкурсу не слід розміщувати тут.
fR0DDY

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

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у двійковому кодуванні числа. Усі вони містяться в інструкціях форми "номер-до-стеку" SSSS...N, де 4-й Sкодує зайве лідерство 0. (Зрозуміло, це не впливає на рахунок.)
res

13

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

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

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

Element має два стеки та хеш як структури пам'яті. Два стеки називаються основним стеком і контрольним стеком. Основний стек - це те, де відбувається арифметика, введення / виведення та хеш-маніпуляція. Контрольний стек - це місце, де відбуваються логічні операції, і цей стек контролює час і цикл.

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

EDIT: Ви можете знайти перекладача для 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

Перл, 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')

Телефонуйте як ім'я сценарію рубіну file_with_ints.


Я не можу прочитати багато Ruby, але це навіть читає кількість тестових випадків?
Джої,

Ні, це не ...
st0le

@ st0le: Щойно помітив, що, мабуть, жодне рішення не вирішує завдання.
Joey


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

Перл, 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: вони використали той факт, що їх параметр "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
  • Тепер у нас є список із усіма позитивними Ns, які ввів користувач, та 0s, де користувач ввів щось негативне.
  • +/ дає суму цього списку.
  • Результат виводиться за замовчуванням (тому що ми з ним нічого іншого не робимо).

2

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

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

Приємна функція, але як це обробляє вказаний ввід розділеного рядка? Як він не включає кількість тестових випадків параметр t як частину суми? Як він підсумовує лише кількість вказаних тестових випадків, навіть якщо їх подано більше?
Джонатан Ван Матре



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

підраховують t в 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

Перл, 20

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

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

Це круто! Але що }{означає / робити?
daniero

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

Пітон: (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]))

Using a=raw_input and r=range and using a() and r() later can save quite a few characters.
Morwenn


0

C

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
Welcome to CodeGolf.SE! If you look at the other answer, you'll see that they have formatted code and a minimal header noting the implementation language; on more complicated challenges many also have notes on the implementation and any limits or surprises in the code. Without some of this, you answer is unlikely to be well received.
dmckee --- ex-moderator kitten

I counted the chars, added the indentation to make code-layout work, and removed the decoration of the output. Oh - now I have to count again. :)
user unknown

Added language name. There's a lot of room for reductions here - sum can be reduced to s, the output string can just be "%d", etc.
Gareth


0

45 chars in python

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

1
How you counted that? It gives me 54 characters.
manatwork

@manatwork, this question has non-standard scoring rules which don't count whitespace.
Peter Taylor

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