Jumlah bilangan bulat positif. [Tutup]


14

Masalah:

Diberikan satu set bilangan bulat, temukan jumlah semua bilangan bulat positif di dalamnya.

Memasukkan:

  • t - jumlah kasus uji [ t <1000]
  • Pada setiap baris t berikutnya , sebuah bilangan bulat N [-1000 ≤ N ≤ 1000]

Keluaran

Program harus menampilkan jumlah semua bilangan bulat positif.

Periksa kode Anda di juri online

Skor

Skor sama dengan ukuran kode sumber program Anda kecuali simbol dengan kode ASCII ≤ 32.

Berikut adalah daftar skor terbaik: Skor Terbaik Python ( Skor terbaik adalah 29)


13
Ada lebih banyak tantangan codegolf di spoj.pl/SHORTEN . Namun, jangan melihat titik menggandakannya di sini.
hallvabo

3
mengapa pertanyaan ini ditandai dengan python .. Apakah kami hanya tertarik pada solusi python?
Aman ZeeK Verma

24
Saya tidak berpikir pertanyaan dari situs kontes harus diposting di sini.
fR0DDY

2
Saya sudah melakukan ini di SPOJ. Beberapa waktu yang lalu mereka mempromosikan semua jawaban Python2.6 untuk Python3 walaupun beberapa dari mereka tidak akan berjalan di bawah Python3 dan akan lebih lama di Python3 - misalnya harus menggunakan int (input ()) bukan input () dan cetak (x) sebagai gantinya cetak x. Jadi saya tidak menganggap SPOJ dengan sangat serius lagi. Saya terikat dengan Tim Peters dan itu cukup baik bagi saya :)
gnibbler

4
Saya hanya ingin menunjukkan, bahwa melompati T(jumlah ... errr ... angka (?)) Bukan pilihan ... karena testcases melibatkan data tambahan setelah Tangka ... kode Anda akan gagal di SPOJ. Semua orang (3 jawaban di bawah) tampaknya telah dengan cerdik melewatkan bilangan bulat pertama.
st0le

Jawaban:


34

Spasi, 0

Saya tidak bisa menolak. S= spasi, T= tab, N= baris baru, semua memiliki kode ASCII <= 32.

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

Base64 disandikan untuk mudah disalin & tempel.

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=

3
(+1) Program yang bagus! "FWIW" mungil: 9 karakter dapat dihapus karena 9 contoh yang tidak dibutuhkan Sdalam pengkodean biner dari suatu angka. Ini semua dalam instruksi push-number-to-stack formulir SSSS...N, di mana Skode ke-4 memimpin 0. (Tentu saja ini tidak berpengaruh pada skor.)
res

13

Elemen, 17 karakter plus 1 spasi

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

Ini adalah bahasa buatan saya yang pertama. Ini dirancang agar sangat kompak dan dapat dibaca manusia. Semua instruksi panjangnya satu karakter dan melakukan satu fungsi.

Elemen memiliki dua tumpukan dan hash sebagai struktur memori. Dua tumpukan disebut tumpukan utama dan tumpukan kontrol. Tumpukan utama adalah tempat aritmatika, I / O, dan manipulasi hash terjadi. Tumpukan kontrol adalah tempat operasi logika terjadi, dan tumpukan ini mengontrol while dan untuk loop.

Ide dasar di balik Elemen adalah bahwa ada hash yang menyimpan angka / string, sementara tumpukan digunakan untuk melakukan perhitungan pada angka-angka ini. Hasil perhitungan ini kemudian dapat menetapkan tempat tertentu dalam hash untuk digunakan di masa mendatang. Konten hash yang berbeda disebut elemen, sehingga mirip dengan array tetapi dapat memiliki nama non-numerik.

EDIT: Anda dapat menemukan penerjemah untuk Elemen (ditulis dalam Perl) di sini .

Berikut adalah daftar operator: Dalam beberapa contoh ini, m dan n mewakili angka yang sudah ada di tumpukan.

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 \

Berikut ini adalah panduan tentang cara kerja program:

_'[    --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
Entri seperti ini akan jauh lebih baik dengan pointer ke lingkungan kerja.
dmckee --- ex-moderator kitten

5
Saya tidak berpikir Anda mengerti apa artinya "dapat dibaca manusia".
wchargin

3
@WChargin dia terbiasa dengan Perl ...
Caridorc

@WChargin Setiap bahasa tidak dapat dibaca sampai Anda mempelajarinya. ;)
Martin Ender

8

Perl, 31

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

Tidakkah menggunakan sayini sedikit lebih pendek? Itu akan cocok dengan 29 karakter terbaik.
Tn. Llama

Tidak, karena saytidak built-in dan (setidaknya) membutuhkan saklar baris perintah yang akan dihitung terhadap jumlah karakter.
Timwi

Ini dapat disingkat menjadi 29 byte dengan menggunakan $\ alih-alih $i:<>;$\+=$_*($_>0)while<>;print
Heiko Oberdiek

5

Ruby 1.9.2, 37

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

Sebut seperti ruby ​​scriptname file_with_ints.


Saya tidak bisa membaca banyak Ruby, tetapi apakah itu bahkan membaca jumlah test case?
Joey

Tidak, itu tidak ...
st0le

@ st0le: Hanya memperhatikan bahwa ternyata tidak ada solusi saat ini menyelesaikan tugas.
Joey


5

Haskell, 58

Hanya beroperasi dengan benar pada tbilangan bulat. Belum menjalankannya terhadap Spoj karena saya hanya tidak mau mendaftar di sana.

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

Apa itu " tbilangan bulat"?
wchargin

4

kode dalam C 89 karakter


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

Saya mencoba banyak untuk mengurangi kode saya kurang dari 63 byte, tetapi saya bisa menguranginya hanya menjadi 89 byte. Tolong bantu saya untuk menguranginya menjadi 63 byte atau bahkan kurang.


1) Saya telah menghitung 90 karakter. 2) return 0;tidak perlu, forsiklus dapat dikontrak untuk for(scanf(x,&t);t--;scanf(x,&a),a>0?b+=a:a);== yang membuat 78 karakter ...
VX

Tidak mengkompilasi dengan 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

Meskipun ruang itu diperlukan, jadi rasanya aneh untuk tidak menghitungnya. Oh well, aturannya adalah aturannya.

Hmm. Saya mungkin bisa lolos dengan menggunakan nama variabel yang tidak diperhitungkan total. Masalahnya, saya tidak yakin bagaimana saya akan menempelkan kode itu.


Tunjukkan saja sebagai $ ^ A - $ ^ Z, tetapi berhati-hatilah karena banyak dari variabel tersebut memiliki makna khusus.
ninjalj

3

Clojure, 71

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

Ini tidak menghasilkan output apa pun, dan gagal karena *in*bukan java.io.BufferedReader, seperti yang disyaratkan oleh line-seq.
John Cromartie

Juga mengabaikan jumlah baris input t .
John Cromartie

3

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

dengan asumsi saya adalah file, yang berisi int.

¹) salah, termasuk jumlah baris, dan menambahkan 1 baris terlalu sedikit.

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

(ruang ekstra untuk kejelasan, karena tidak diperhitungkan)

Haskell menarik ..., karena Anda cenderung mendapatkan program dengan jumlah ruang yang signifikan.


2
Anda lupa 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; }

Setelah upaya besar lainnya, kode kurang satu karakter, tolong bantu saya untuk mengurangi lebih banyak.


6
cukup edit jawaban asli lain kali
ratchet freak

hapus ( return 0;) dan ( {}untuk 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: mereka menggunakan fakta, bahwa parameter "argc" mereka disetel ke 1, b Anda tidak diinisialisasi ...
VX

2

Befunge-98 (24)

(Pastikan Anda menggunakan juru bahasa yang bisa membaca angka negatif (sepertinya bug yang agak umum, tetapi RcFunge berfungsi))

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

Perl (25)

(Perl memungkinkan karakter kontrol dalam nama variabel, saya menamai variabel saya ^ B (ASCII 2) sehingga tidak dihitung ke arah tujuan.)

<>; $ ^ B + = $ _ *! / - / untuk <>; cetak $ ^ B

(Varian normal (27 karakter)):

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

Saya pertama kali mengabaikan jawaban perl Anda ketika saya melihat penamaan variabel dan benar-benar merindukan yang terbaik di bawahnya
ardnew

2

APL (10)

+/{0⌈⎕}¨⍳⎕

Penjelasan:

  • ⍳⎕: baca baris, berikan daftar [1..N] untuk input pengguna N
  • ¨: untuk setiap elemen dalam daftar ini ... (mis. lakukan N kali)
  • 0⌈⎕: baca baris, kembalikan maksimal 0 dan masukkan N
  • Kami sekarang memiliki daftar dengan semua Ns positif yang dimasukkan pengguna, dan 0s di mana pengguna memasukkan sesuatu yang negatif.
  • +/ memberikan jumlah daftar ini.
  • Hasilnya adalah keluaran secara default (karena kami tidak melakukan hal lain dengannya).

2

Mathematica: 18 16

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

Fungsi bagus, tetapi bagaimana ini menangani input yang dipisahkan baris baru yang ditentukan? Bagaimana tidak memasukkan jumlah parameter kasus uji t sebagai bagian dari jumlah? Bagaimana jumlahnya hanya sampai dengan jumlah kasus uji yang ditentukan, meskipun lebih banyak diberikan?
Jonathan Van Matre

1

PowerShell, 44

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

1

Q, 12

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

penggunaan sampel

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

1

befunge, 35 24

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

dengan sedikit inspirasi dengan melihat jawaban marinus, saya juga sudah mengelola 24 karakter. tapi saya punya pendekatan yang sama sekali berbeda.


1

PYTHON 2.x, 50 karakter

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

1

C, 70 72 karakter

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

Hasil di situs SPOJ jelas tampak tidak nyata - Saya tidak tahu cara mendapatkan ini hingga 63.

Namun, 68 karakter dapat dijangkau pada beberapa kompiler dengan menyalahgunakan perilaku yang tidak terdefinisi. Berikut ini berfungsi pada x86 Linux dengan 32-bit gcc, di mana semua argumen dilewatkan di stack.

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

hitung t dalam A1, sisa data a2 dan turun


1

Clojure, 108

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

Saya benar-benar berharap bisa menghindari java.io.BufferedReader.bagian itu, karena harganya 24 karakter itu sendiri. Tapi AFAIK tidak ada fasilitas untuk membaca baris dari STDIN tanpanya.


1

Perl, 20

Saya tahu ini sudah lama dan sepele, tetapi jawaban Perl masih dapat ditingkatkan:

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

Ini luar biasa! Tapi apa }{artinya / lakukan?
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 karakter. Perlu mengoptimalkannya hingga 90. Ada saran?


2
Hanya trik standar: Pengembalian tidak perlu dalam standar C ++ atau C99, ada yang tersirat return 0di main. Dengan membuat variabel global, Anda dapat menghapus =0inisialisasi. Akhirnya, for(;;)jumlah karakter yang sama seperti while()tetapi Anda mendapatkan dua tempat tambahan untuk berekspresi.
han

Ini sudah lama, tetapi juga, menulis std::sebelum cindan coutdan menyingkirkan using namespace std;dapat menyimpan 5 karakter lagi.
Morwenn

0

PHP, 71

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

0

Python: (92 karakter)

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

Menggunakan a=raw_inputdan r=rangemenggunakan a()dan r()kemudian dapat menyimpan beberapa karakter.
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
Selamat datang di CodeGolf.SE! Jika Anda melihat jawaban yang lain, Anda akan melihat bahwa mereka memiliki kode yang diformat dan header minimal yang mencatat bahasa implementasi; pada tantangan yang lebih rumit banyak juga memiliki catatan tentang implementasi dan batasan atau kejutan dalam kode. Tanpa beberapa dari ini, jawaban Anda kemungkinan tidak akan diterima dengan baik.
dmckee --- ex-moderator kitten

Saya menghitung karakter, menambahkan lekukan untuk membuat tata letak kode berfungsi, dan menghapus dekorasi output. Oh - sekarang saya harus menghitung lagi. :)
pengguna tidak diketahui

Nama bahasa ditambahkan. Ada banyak ruang untuk reduksi di sini - sumdapat dikurangi menjadi s, string keluaran bisa saja "%d", dll.
Gareth


0

45 karakter dalam python

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

1
Bagaimana Anda menghitungnya? Ini memberi saya 54 karakter.
manatwork

@manatwork, pertanyaan ini memiliki aturan penilaian non-standar yang tidak menghitung spasi.
Peter Taylor

Ups, maaf. Saya melewatkan itu. Terima kasih, @PeterTaylor.
manatwork
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.