ผลรวมของจำนวนเต็มบวก [ปิด]


14

ปัญหา:

ให้ชุดของจำนวนเต็มหาผลรวมของจำนวนเต็มบวกทั้งหมดในนั้น

การป้อนข้อมูล:

  • t - จำนวนกรณีทดสอบ [ t <1,000]
  • ในแต่ละถัดเสื้อเส้นจำนวนเต็มN [-1000 ≤ N ≤ 1000]

เอาท์พุต

โปรแกรมควรแสดงผลรวมของจำนวนเต็มบวกทั้งหมด

ตรวจสอบรหัสของคุณในการตัดสินออนไลน์

คะแนน

คะแนนเท่ากับขนาดของซอร์สโค้ดของโปรแกรมยกเว้นสัญลักษณ์ที่มีรหัส ASCII ≤ 32

นี่คือรายการคะแนนที่ดีที่สุด: Python Best Scores ( คะแนนที่ดีที่สุดคือ 29)


13
มีความท้าทาย codegolf มากขึ้นที่มีspoj.pl/SHORTEN ไม่เห็นจุดที่ทำซ้ำพวกเขาที่นี่
hallvabo

3
ทำไมคำถามนี้ติดแท็กหลาม .. พวกเราสนใจวิธีแก้ปัญหางูหลามเท่านั้น?
Aman ZeeK Verma

24
ฉันไม่คิดว่าคำถามจากเว็บไซต์การประกวดควรโพสต์ที่นี่
fR0DDY

2
ฉันทำสิ่งนี้กับ SPOJ แล้ว ไม่นานมานี้พวกเขาเลื่อนขั้น Python2.6 คำตอบทั้งหมดไปที่ Python3 แม้ว่าบางคนจะไม่ทำงานภายใต้ Python3 และจะยาวกว่าใน Python3 เช่นจะต้องใช้ int (input ()) แทน input () และ print (x) แทน จากการพิมพ์ x ดังนั้นฉันไม่ได้ใช้ SPOJ อย่างจริงจังอีกต่อไป ฉันผูกกับทิมปีเตอร์สและที่ดีพอสำหรับฉัน :)
gnibbler

4
ฉันแค่ต้องการชี้ให้เห็นว่าการข้ามT(จำนวน ... errr ... หมายเลข (?)) ไม่ใช่ตัวเลือก ... เนื่องจากการทดสอบเกี่ยวข้องกับข้อมูลเพิ่มเติมหลังจากTตัวเลข ... รหัสของคุณจะล้มเหลวที่ SPOJ ทุกคน (3 คำตอบด้านล่าง) ดูเหมือนจะข้ามจำนวนเต็มตัวแรกอย่างชาญฉลาด
st0le

คำตอบ:


34

ช่องว่าง 0

ฉันไม่สามารถต้านทาน S= space, T= tab, N= newline ทั้งหมดมีรหัส ASCII <= 32

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

Base64 เข้ารหัสเพื่อให้คัดลอกและวางได้ง่าย

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=

3
(+1) โปรแกรมดีมาก! ตัวอักษร "FWIW" ขนาดจิ๋ว: 9 ตัวสามารถลบออกได้เนื่องจากอินสแตนซ์ที่ไม่จำเป็นSในการเข้ารหัสไบนารีของตัวเลข 9 ตัว ทั้งหมดนี้อยู่ในคำแนะนำแบบพุช - ทู - สแต็คของแบบฟอร์มSSSS...Nโดยที่Sรหัสที่4 นำไปสู่ฟุ่มเฟือย 0 (แน่นอนว่านี่ไม่มีผลต่อคะแนน)
res

13

องค์ประกอบ, 17 อักขระบวก 1 ช่องว่าง

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

นี่เป็นภาษาที่ฉันสร้างขึ้นเป็นครั้งแรก มันถูกออกแบบมาให้มีขนาดกะทัดรัดและอ่านง่าย คำแนะนำทั้งหมดมีความยาวหนึ่งตัวอักษรและดำเนินการฟังก์ชันเดียว

องค์ประกอบมีสองกองและแฮชเป็นโครงสร้างหน่วยความจำ ทั้งสองกองจะเรียกว่ากองหลักและกองควบคุม สแต็กหลักคือตำแหน่งที่การคำนวณทางคณิตศาสตร์ I / O และการแฮชเกิดขึ้น สแต็กควบคุมเป็นที่ที่การดำเนินการทางตรรกะเกิดขึ้นและสแต็กนี้จะควบคุม while และ for loop

แนวคิดพื้นฐานที่อยู่เบื้องหลังองค์ประกอบคือมีแฮชที่เก็บหมายเลข / สตริงในขณะที่สแต็กใช้สำหรับคำนวณตัวเลขเหล่านี้ ผลลัพธ์จากการคำนวณเหล่านี้สามารถกำหนดสถานที่บางแห่งในแฮชเพื่อใช้ในอนาคต เนื้อหาที่แตกต่างกันของแฮชเรียกว่าองค์ประกอบดังนั้นจึงคล้ายกับอาร์เรย์ แต่อาจมีชื่อที่ไม่ใช่ตัวเลข

แก้ไข: คุณสามารถค้นหาล่ามธาตุ (เขียนใน 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 ทุกภาษาไม่สามารถอ่านได้จนกว่าคุณจะเรียนรู้ ;)
Martin Ender

8

Perl, 31

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

จะไม่ใช้หรือsayทำให้นี่สั้นลงสักหน่อยใช่ไหม มันจะผูกกับตัวละคร 29 ตัวที่ดีที่สุด
นาย Llama

ไม่เพราะsayไม่ใช่ในตัวและ (อย่างน้อย) ต้องใช้สวิตช์บรรทัดคำสั่งซึ่งจะนับรวมไปถึงจำนวนอักขระ
Timwi

สามารถย่อให้เหลือ 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 ไม่ได้มาก แต่อ่านจำนวนกรณีทดสอบได้หรือไม่
Joey

ไม่มันไม่ได้ ...
st0le

@ st0le: เพิ่งสังเกตเห็นว่าไม่มีทางออกในการแก้ปัญหาในขณะนี้
Joey


5

Haskell, 58

ทำงานอย่างถูกต้องกับtจำนวนเต็มเท่านั้น ยังไม่ได้เรียกใช้กับ Spoj เพราะฉันไม่สนใจที่จะลงทะเบียนที่นั่น

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 แต่ระวังว่าตัวแปรหลายตัวนั้นมีความหมายพิเศษ
ninjalj

3

Clojure, 71

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

นี้ไม่ได้ผลิตออกใด ๆ และล้มเหลวเนื่องจาก*in*ไม่ได้เป็นตามที่กำหนดไว้java.io.BufferedReader line-seq
John Cromartie

นอกจากนี้ยังจะละเว้นจำนวนของสายการป้อนข้อมูลที
John Cromartie

3

ใน memoriam Dennis M. Ritchie

unix 57¹ 72:

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

สมมติว่า i เป็นไฟล์ที่มี ints

¹) ผิดรวมจำนวนบรรทัดและเพิ่ม 1 บรรทัดน้อยเกินไป

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

(ช่องว่างเพิ่มเติมเพื่อความชัดเจนเนื่องจากไม่นับ)

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
เพียงแก้ไขคำตอบเดิมในครั้งถัดไป
ratchet freak

remove the (return 0;) and ({} for for)
l0n3sh4rk

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

@walpen: they used the fact, that their "argc" like parameter was set to 1, your b is uninitialized...
V-X

2

Befunge-98 (24)

(Make sure you use an interpreter that can read negative numbers (seems to be a somewhat common bug, but RcFunge works))

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

Perl (25)

(Perl allows control characters in variable names, I named my variable ^B (ASCII 2) so that it does not count towards the goal.)

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

(Normal variant (27 chars)):

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

i first ignored your perl answer when i saw the variable naming and completely missed the excellent one below it
ardnew

2

APL (10)

+/{0⌈⎕}¨⍳⎕

Explanation:

  • ⍳⎕: read a line, gives a list [1..N] for user's input N
  • ¨: for each element in this list... (i.e. do N times)
  • 0⌈⎕: read a line, return the maximum of 0 and the entered N
  • We now have a list with all positive Ns the user entered, and 0s where the user entered something negative.
  • +/ gives the sum of this list.
  • The result is output by default (because we're not doing anything else with it).

2

Mathematica: 18 16

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

Nice function, but how does this handle the specified newline-separated input? How does it not incorporate the number of test cases parameter t as part of the sum? How does it sum only up to the number of test cases specified, even if more are given?
Jonathan Van Matre



1

befunge, 3524

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

with a little inspiration by seeing marinus answer, I've also managed 24 characters. but I've got a completely different approach.



1

C, 70 72 characters

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

The results on the SPOJ site definitely seem unreal - I have no idea how to get this down to 63.

However, 68 characters is reachable on some compilers by abusing undefined behaviour. The following works on x86 Linux with 32-bit gcc, on which all arguments are passed on the stack.

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


1

Clojure, 108

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

I really wish I could avoid the java.io.BufferedReader. part, since it costs 24 chars itself. But AFAIK there's no facility to read lines from STDIN without it.



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 characters long. Need to optimize it to 90. Any suggestions ?


2
Just the standard tricks: The return is unnecessary in standard C++ or C99, there is an implicit return 0 in main. By making the variables global you can drop the =0 initialization. Finally, for(;;) is the same number of characters as while() but you get two extra places to put an expression in.
han

This is already old, but also, writing std:: before cin and cout and getting rid of the using namespace std; can save 5 more characters.
Morwenn


0

Python: (92 characters)

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.