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)

gmunkhbaatarmn
sumber
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=
hammar
sumber
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
PhiNotPi
sumber
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
Timwi
sumber
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.

steenslag
sumber
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

Ruby, 52

t=gets.to_i;s=0;t.times{i=gets.to_i;s+=i if i>0};p s
david4dev
sumber
Saya tidak melihat di mana Anda mencetak nilai s.
Dogbert
ya saya lupa
david4dev
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

sumber
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.

Avinashse
sumber
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.

Peter Taylor
sumber
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*)))))
Meikel
sumber
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))

Pengguna tidak diketahui
sumber
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.

Segera.
sumber
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.

Avinashse
sumber
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
marinus
sumber
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).
marinus
sumber
2

Mathematica: 18 16

Boole[#>0]&/@x.x
Corey Kelly
sumber
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
Joey
sumber
1

Q, 12

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

penggunaan sampel

q){0+/x(&)x>0} 1 -1 2 3 -1
6
tmartin
sumber
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.

Ali1S232
sumber
1

PYTHON 2.x, 50 karakter

r=input
print sum(i for i in (r() for j in range(r())) if i>0)
Joel Cornett
sumber
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);}
han
sumber
1

excel, 27

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

hitung t dalam A1, sisa data a2 dan turun

SeanC
sumber
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.

John Cromartie
sumber
1

Perl, 20

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

#!perl -p
$.<2or$\+=$_*!/-/}{
nutki
sumber
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?

CodeJunkie
sumber
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;
l0n3sh4rk
sumber
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]))
Rushil Paul
sumber
Menggunakan a=raw_inputdan r=rangemenggunakan a()dan r()kemudian dapat menyimpan beberapa karakter.
Morwenn
0

scala 55 54:

println ((for (r <- 1 to readInt;
  i=readInt;
    if i>0) yield i)sum)
Pengguna tidak diketahui
sumber
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);
}
sanchita sangiri
sumber
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
pengguna2274615
sumber
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