Tổng các số nguyên dương. [đóng cửa]


14

Vấn đề:

Cho một tập hợp các số nguyên, tìm tổng của tất cả các số nguyên dương trong đó.

Đầu vào:

  • t - số trường hợp thử nghiệm [ t <1000]
  • Trên mỗi dòng t tiếp theo , một số nguyên N [-1000 N 1000]

Đầu ra

Chương trình sẽ xuất tổng của tất cả các số nguyên dương.

Kiểm tra mã của bạn trong thẩm phán trực tuyến

Ghi bàn

Điểm bằng với kích thước mã nguồn của chương trình của bạn ngoại trừ các ký hiệu có mã ASCII ≤ 32.

Dưới đây là danh sách điểm tốt nhất: Điểm số tốt nhất của Python ( Điểm cao nhất là 29)


13
Có rất nhiều thử thách về codegolf tại spoj.pl/SHORTEN . Đừng nhìn thấy điểm trùng lặp chúng ở đây.
hallvabo

3
Tại sao câu hỏi này được gắn thẻ python .. Chúng ta chỉ quan tâm đến giải pháp python?
Aman ZeeK Verma

24
Tôi không nghĩ câu hỏi từ các trang web của cuộc thi nên được đăng ở đây.
fR0DDY

2
Tôi đã làm điều này trên SPOJ. Trước đây, họ đã quảng cáo tất cả các câu trả lời Python2.6 cho Python3 mặc dù một số trong số chúng không chạy trong Python3 và sẽ dài hơn trong Python3 - ví dụ: phải sử dụng int (input ()) thay vì input () và print (x) thay thế của bản in x. Vì vậy, tôi không coi trọng SPOJ nữa. Tôi bị ràng buộc với Tim Peters và điều đó đủ tốt cho tôi :)
gnibbler

4
Tôi chỉ muốn chỉ ra rằng, bỏ qua T(số ... errr ... số (?)) Không phải là một lựa chọn ... vì các testcase liên quan đến dữ liệu bổ sung sau Tsố ... mã của bạn sẽ thất bại tại SPOJ. Mọi người (3 câu trả lời dưới đây) dường như đã khéo léo bỏ qua số nguyên đầu tiên.
st0le

Câu trả lời:


34

Khoảng trắng, 0

Tôi không thể cưỡng lại. S= dấu cách, T= tab, N= dòng mới, tất cả đều có mã ASCII <= 32.

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

Base64 được mã hóa để dễ dàng sao chép và dán.

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=

3
(+1) Chương trình hay! Một "FWIW" nhỏ: 9 ký tự có thể bị xóa do 9 trường hợp không cần thiết Strong mã hóa nhị phân của một số. Đây là tất cả các hướng dẫn đẩy số-xếp-chồng của biểu mẫu SSSS...N, trong đó Smã thứ 4 dẫn đầu không cần thiết 0. (Tất nhiên điều này không ảnh hưởng đến điểm số.)
res

13

Yếu tố, 17 ký tự cộng với 1 khoảng trắng

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

Đây là ngôn ngữ được xây dựng đầu tiên của tôi. Nó được thiết kế rất nhỏ gọn và dễ đọc cho con người. Tất cả các hướng dẫn đều dài một ký tự và thực hiện một chức năng.

Phần tử có hai ngăn xếp và hàm băm dưới dạng cấu trúc bộ nhớ. Hai ngăn xếp được gọi là ngăn xếp chính và ngăn xếp điều khiển. Ngăn xếp chính là nơi xảy ra thao tác số học, I / O và hàm băm. Ngăn xếp điều khiển là nơi xảy ra các hoạt động logic và ngăn xếp này điều khiển các vòng lặp trong và cho các vòng lặp.

Ý tưởng cơ bản đằng sau Element là có một hàm băm lưu trữ số / chuỗi, trong khi ngăn xếp được sử dụng để thực hiện các phép tính trên các số này. Các kết quả cho các tính toán này sau đó có thể được chỉ định một vị trí nhất định trong hàm băm để sử dụng trong tương lai. Các nội dung khác nhau của hàm băm được gọi là các phần tử, vì vậy nó tương tự như một mảng nhưng có thể có các tên không phải là số.

EDIT: Bạn có thể tìm thấy một trình thông dịch cho Element (được viết bằng Perl) tại đây .

Dưới đây là danh sách các toán tử: Trong một số ví dụ này, m và n đại diện cho các số đã có trên ngăn xếp.

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 \

Đây là hướng dẫn về cách thức hoạt động của chương trình:

_'[    --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
Một mục như thế này sẽ được cải thiện nhiều với một con trỏ đến môi trường làm việc.
dmckee --- ex-moderator mèo con

5
Tôi không nghĩ bạn hiểu "con người có thể đọc được" nghĩa là gì.
wchargein

3
@WChargin anh ấy đã quen với Perl ...
Caridorc

@WChargin Mọi ngôn ngữ đều không thể đọc được cho đến khi bạn học nó. ;)
Martin Ender

8

Perl, 31

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

Sẽ không sử dụng saylàm cho điều này chỉ ngắn hơn một chút? Nó phù hợp nhất với 29 ký tự.
Ông Llama

Không, bởi vì saykhông được tích hợp sẵn và (ít nhất) yêu cầu một công tắc dòng lệnh sẽ được tính vào số lượng ký tự.
Timwi

Nó có thể được rút ngắn xuống còn 29 byte bằng cách sử dụng $\ thay vì $i:<>;$\+=$_*($_>0)while<>;print
Heiko Oberdiek

5

Ruby 1.9.2, 37

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

Gọi như ruby ​​scriptname file_with_ints.


Tôi không thể đọc nhiều Ruby, nhưng nó thậm chí có đọc số lượng test không?
Joey

Không, nó không ...
st0le

@ st0le: Chỉ cần lưu ý rằng dường như không có giải pháp nào hiện đang giải quyết nhiệm vụ.
Joey


5

Haskell, 58

Hoạt động đúng trên chỉ tsố nguyên. Không chạy nó với Spoj vì tôi không quan tâm đăng ký ở đó.

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

"Số tnguyên" là gì?
wchargein 10/2/2015

4

mã bằng C 89 ký tự


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; }

Tôi đã cố gắng rất nhiều để giảm mã dưới 63 byte, nhưng tôi chỉ có thể giảm mã xuống còn 89 byte. Xin hãy giúp tôi giảm xuống còn 63 byte hoặc thậm chí ít hơn.


1) Tôi đã đếm được 90 ký tự. 2) return 0;là không cần thiết, forchu trình có thể được ký hợp đồng thành for(scanf(x,&t);t--;scanf(x,&a),a>0?b+=a:a);== tạo ra 78 ký tự đó ...
VX

Không biên dịch với 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

Mặc dù không gian là cần thiết, vì vậy có vẻ kỳ lạ khi không tính nó. Oh tốt, các quy tắc là các quy tắc.

Hừm. Tôi có lẽ có thể thoát khỏi việc sử dụng một tên biến không được tính vào tổng số. Vấn đề là, tôi không chắc chắn làm thế nào tôi dán mã sau đó.


Chỉ hiển thị chúng là $ ^ A - $ ^ Z, nhưng hãy cẩn thận rằng nhiều biến đó có ý nghĩa đặc biệt.
ninjalj

3

Clojure, 71

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

Điều này không tạo ra bất kỳ đầu ra nào, và thất bại vì *in*không phải là java.io.BufferedReader, theo yêu cầu của line-seq.
John Cromartie

Ngoài ra, nó bỏ qua số lượng dòng đầu vào t .
John Cromartie

3

Trong bản ghi nhớ Dennis M. Ritchie

unix 57¹ 72:

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

giả sử tôi là tập tin, chứa ints.

) Đã sai, bao gồm số lượng dòng và thêm 1 dòng quá ít.

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


2

Haskell, 51

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

(không gian thêm cho rõ ràng, vì họ không tính)

Haskell là ... thú vị, vì bạn có xu hướng nhận được các chương trình với một số lượng đáng kể các không gian cần thiết.


2
Bạn đã quên a 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; }

Sau một nỗ lực lớn khác, mã là một ký tự ít hơn, xin vui lòng giúp tôi giảm bớt nó nhiều hơn.


6
chỉ cần chỉnh sửa câu trả lời ban đầu vào lần tới
ratchet freak

xóa ( return 0;) và ( {}cho for)
l0n3sh4rk

b,x="%d";main(a,t){for(scanf(x,&t);t--&&scanf(x,&a);)b+=(a>0)*a;printf(x,b);}<- 77 byte
walpen

@walpen: họ đã sử dụng thực tế là tham số like "argc" của họ được đặt thành 1, b của bạn chưa được khởi tạo ...
VX

2

Befunge-98 (24)

(Đảm bảo bạn sử dụng trình thông dịch có thể đọc các số âm (dường như là một lỗi khá phổ biến, nhưng RcFunge hoạt động))

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

Perl (25)

(Perl cho phép các ký tự điều khiển trong các tên biến, tôi đặt tên biến của mình ^ B (ASCII 2) để nó không được tính vào mục tiêu.)

<>; $ ^ B + = $ _ *! / - / cho <>; in $ ^ B

(Biến thể bình thường (27 ký tự)):

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

Lần đầu tiên tôi bỏ qua câu trả lời perl của bạn khi tôi thấy cách đặt tên biến và hoàn toàn bỏ lỡ câu trả lời xuất sắc bên dưới nó
ardew

2

APL (10)

+/{0⌈⎕}¨⍳⎕

Giải trình:

  • ⍳⎕: đọc một dòng, đưa ra danh sách [1..N] cho đầu vào N của người dùng
  • ¨: cho mỗi phần tử trong danh sách này ... (nghĩa là N lần)
  • 0⌈⎕: đọc một dòng, trả về giá trị tối đa là 0 và N đã nhập
  • Bây giờ chúng tôi có một danh sách với tất cả Ns dương mà người dùng đã nhập và 0 trong đó người dùng đã nhập nội dung nào đó.
  • +/ đưa ra tổng của danh sách này.
  • Kết quả là đầu ra theo mặc định (vì chúng tôi không làm gì khác với nó).

2

Toán học: 18 16

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

Chức năng đẹp, nhưng làm thế nào để xử lý đầu vào phân tách dòng mới được chỉ định này? Làm thế nào nó không kết hợp số lượng tham số trường hợp thử nghiệm t như là một phần của tổng? Làm thế nào để nó chỉ tổng hợp lên đến số lượng các trường hợp thử nghiệm được chỉ định, ngay cả khi nhiều hơn được đưa ra?
Jonathan Van Matre

1

PowerShell, 44

($i=$input|%{+$_})[1..$i[0]]-gt0-join'+'|iex

1

Q, 12

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

sử dụng mẫu

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

1

befunge, 35 24

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

với một chút cảm hứng bằng cách xem câu trả lời của bến, tôi cũng đã quản lý 24 ký tự. nhưng tôi đã có một cách tiếp cận hoàn toàn khác.


1

PYTHON 2.x, 50 ký tự

r=input
print sum(i for i in (r() for j in range(r())) if i>0)

1

C, 70 72 ký tự

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

Các kết quả trên trang SPOJ chắc chắn có vẻ không thực tế - tôi không biết làm thế nào để giảm xuống còn 63.

Tuy nhiên, 68 ký tự có thể truy cập được trên một số trình biên dịch bằng cách lạm dụng hành vi không xác định. Phần sau hoạt động trên x86 Linux với gcc 32 bit, trên đó tất cả các đối số được truyền vào ngăn xếp.

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

1

xuất sắc, 27

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

đếm t trong A1, phần còn lại của dữ liệu a2 trở xuống


1

Clojure, 108

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

Tôi thực sự muốn tôi có thể tránh được java.io.BufferedReader.phần này, vì nó có giá 24 ký tự. Nhưng AFAIK không có cơ sở để đọc các dòng từ STDIN mà không có nó.


1

Perl, 20

Tôi biết nó đã cũ và tầm thường, nhưng câu trả lời Perl vẫn có thể được cải thiện:

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

Điều này thật tuyệt! Nhưng có }{nghĩa là gì / làm gì?
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;
}

Dài 115 ký tự. Cần tối ưu hóa nó đến 90. Bất kỳ đề xuất?


2
Chỉ là các thủ thuật tiêu chuẩn: Sự trở lại là không cần thiết trong tiêu chuẩn C ++ hoặc C99, có một ẩn ý return 0trong main. Bằng cách làm cho các biến toàn cục, bạn có thể bỏ việc =0khởi tạo. Cuối cùng, for(;;)có cùng số lượng ký tự while()nhưng bạn có thêm hai vị trí để đặt biểu thức vào.
han

Điều này đã cũ, nhưng cũng vậy, viết std::trước cincoutthoát khỏi using namespace std;có thể lưu thêm 5 ký tự.
Morwenn

0

PHP, 71

<?for($s=0,$t=fgets(STDIN)+0;$t--;$s+=($n=fgets(STDIN))>0?$n:0);echo$s;

0

Python: (92 ký tự)

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

Sử dụng a=raw_inputr=rangesử dụng a()r()sau này có thể lưu khá nhiều ký tự.
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
Chào mừng bạn đến với CodeGolf.SE! Nếu bạn nhìn vào câu trả lời khác, bạn sẽ thấy rằng họ có mã được định dạng và một tiêu đề tối thiểu lưu ý ngôn ngữ thực hiện; về những thách thức phức tạp hơn, nhiều người cũng có ghi chú về việc thực hiện và bất kỳ giới hạn hoặc bất ngờ nào trong mã. Nếu không có một số điều này, bạn trả lời không có khả năng được đón nhận.
dmckee --- ex-moderator mèo con

Tôi đếm các ký tự, thêm phần thụt vào để làm cho bố cục mã và loại bỏ trang trí của đầu ra. Oh - bây giờ tôi phải đếm lại. :)
người dùng không xác định

Đã thêm tên ngôn ngữ. Có rất nhiều chỗ để giảm ở đây - sumcó thể giảm xuống s, chuỗi đầu ra chỉ có thể "%d", v.v.
Gareth


0

45 ký tự trong trăn

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

1
Làm thế nào bạn đếm được điều đó? Nó cho tôi 54 ký tự.
manatwork

@manatwork, câu hỏi này có quy tắc chấm điểm không chuẩn, không tính khoảng trắng.
Peter Taylor

Ối xin lỗi. Tôi đã bỏ lỡ nó. Cảm ơn, @PeterTaylor.
manatwork
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.