Pozitif tamsayıların toplamı. [kapalı]


14

Sorun:

Bir tamsayı kümesi verildiğinde, içindeki tüm pozitif tamsayıların toplamını bulun.

Giriş:

  • t - test vakası sayısı [ t <1000]
  • Sonraki t satırlarının her birinde , bir tam sayı N [-1000 ≤ N ≤ 1000]

Çıktı

Program, tüm pozitif tamsayıların toplamını vermelidir.

Çevrimiçi hakimde kodunuzu kontrol edin

Puan

Skor, ASCII kodu ≤ 32 olan simgeler hariç, programınızın kaynak kodunun boyutuna eşittir.

En iyi skor listesi: Python En İyi Skorlar (En iyi skor 29'dur)


13
Spoj.pl/SHORTEN'de çok daha fazla codegolf zorluğu var . Yine de burada çoğaltma noktasını görmüyorum.
hallvabo

3
neden bu soru python olarak etiketlenmiş .. Biz sadece python çözüm ilgileniyor musunuz?
Aman ZeeK Verma

24
Yarışma sitelerinden gelen soruların buraya gönderilmesi gerektiğini düşünmüyorum.
fR0DDY

2
Bunu SPOJ'da zaten yaptım. Bir süre önce, bazıları Python3 altında çalışmayacak ve Python3'te daha uzun sürecek olsa da Python3'e tüm Python2.6 yanıtlarını tanıttılar - örneğin, input () yerine int (input ()) ve print (x) kullanmak zorundalar baskı x. Bu yüzden artık SPOJ'u çok ciddiye almıyorum. Tim Peters ile bağlıyım ve bu benim için yeterince iyi :)
gnibbler

4
Sadece işaret etmek istiyorum, T(errr ... sayıları (?)) TAtlamak bir seçenek değil ... çünkü testcasları sayılardan sonra ekstra veri içerdiğinden ... kodunuz SPOJ'de başarısız olacaktır. Herkes (aşağıdaki 3 cevap) ilk tamsayıyı akıllıca atlamış gibiydi.
st0le

Yanıtlar:


34

Boşluk, 0

Dayanamadım. S= boşluk, T= sekme, N= satırsonu, hepsinde ASCII kodu <= 32 var.

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

Kolay kopyala ve yapıştır için Base64 kodlu.

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=

3
(+1) Güzel program! Küçük bir "FWIW": SBir sayının ikili kodlamasında 9 adedin gereksiz olması nedeniyle 9 karakter kaldırılabilir . Bunların hepsi formun itme-sayı-yığın talimatlarındadır SSSS...N, burada 4. Ssıra gereksiz bir 0 kodlar. (Tabii ki bu puan üzerinde hiçbir etkisi yoktur.)
res

13

Öğe, 17 karakter artı 1 boşluk

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

Bu benim ilk inşa ettiğim dil. Çok kompakt ve insan tarafından okunabilir olacak şekilde tasarlanmıştır. Tüm talimatlar bir karakter uzunluğundadır ve tek bir işlevi yerine getirir.

Elemanın bellek yapısı olarak iki yığını ve bir karması vardır. İki yığın ana yığın ve kontrol yığını olarak adlandırılır. Ana yığın, aritmetik, I / O ve karma manipülasyonun gerçekleştiği yerdir. Kontrol yığını, mantık işlemlerinin gerçekleştiği yerdir ve bu yığın, while ve döngüler için kontrol eder.

Elemanın arkasındaki temel fikir, sayıları / dizeleri saklayan bir karma olmasıdır, bu arada yığın bu sayılar üzerinde hesaplamalar yapmak için kullanılır. Bu hesaplamanın sonuçları daha sonra kullanım için karma içinde belirli bir yere atanabilir. Karma'nın farklı içeriğine elemanlar denir, bu nedenle bir diziye benzer ancak sayısal olmayan adlara sahip olabilir.

DÜZENLEME: Sen (Perl ile yazılmış) Elemanı için bir tercüman bulabilirsiniz burada .

İşleçlerin listesi: Bu örneklerin bazılarında, m ve n zaten yığında bulunan sayıları temsil eder.

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 \

İşte programın nasıl çalıştığına dair bir adım:

_'[    --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
Böyle bir giriş, bir çalışma ortamına yönelik bir işaretçi ile çok geliştirilecektir.
dmckee --- eski moderatör yavru kedi

5
"İnsan tarafından okunabilir" in ne anlama geldiğini anladığınızı sanmıyorum.
wchargin

3
@WChargin Perl için kullanılır ...
Caridorc

@WChargin Siz öğrenene kadar her dil okunamaz. ;)
Martin Ender

8

Perl, 31

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

Kullanmak saybunu biraz daha kısaltmaz mı? En iyi 29 karakterle bağlanırdı.
Bay Llama

Hayır, çünkü sayyerleşik değildir ve (en azından) karakter sayısına göre sayılacak bir komut satırı anahtarı gerektirir.
Timwi

Bu kullanarak 29 bayt kısaltılabilir $\ yerine $i:<>;$\+=$_*($_>0)while<>;print
Heiko Oberdiek

5

Yakut 1.9.2, 37

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

Ruby scriptname file_with_ints gibi çağırın.


Çok fazla Ruby okuyamıyorum, ama bu test senaryolarının sayısını bile okuyor mu?
Joey

Hayır değil ...
st0le

@ st0le: Görünüşe göre hiçbir çözümün şu anda görevi çözmediğini fark ettim.
Joey


5

Haskell, 58

Sadece ttamsayılarda düzgün çalışır . Spoj'a karşı çalıştırmadım çünkü orada kayıt yaptırmak umurumda değil.

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

" tTamsayılar" nedir?
wchargin

4

C 89 karakterli kod


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

Kodumu en az 63 bayt azaltmak için çok denedim, ama sadece 89 bayt azaltabilir. Lütfen 63 bayta veya daha azına indirmeme yardım edin.


1) 90 karakter saydım. 2) return 0;gerekli değildir, fordöngü for(scanf(x,&t);t--;scanf(x,&a),a>0?b+=a:a);78 karakterle sonuçlanan == ile sözleşme yapılabilir ...
VX

Gcc 4.8.1 ile derlemezerror: initializer element is not computable at load time x="%d"
manav mn

4

Perl, 33

<>;while(<>){$i+=$_ if$_>0}print$i

Alan gerekli olmasına rağmen, sayılmamak garip görünüyor. Oh, kurallar kurallar.

Hmm. Muhtemelen toplamı da hesaba katmayan değişken bir isim kullanarak kaçabilirim. Şey, o zaman nasıl kodu yapıştırmak emin değilim.


Onları $ ^ A - $ ^ Z olarak gösterin, ancak bu değişkenlerin çoğunun özel anlamları olduğunu unutmayın.
ninjalj

3

Clojure, 71

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

Bu herhangi bir çıktı üretmez ve başarısız olur çünkü gerektiği gibi *in*a değildir . java.io.BufferedReaderline-seq
John Cromartie

Ayrıca t girişi satır sayısını da dikkate almaz .
John Cromartie

3

Anısına 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 varsayalım, ints içeren dosya.

¹) yanlıştı, satır sayısını içeriyordu ve 1 satır daha az eklenmişti.

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

(sayılmadıkları için açıklık için ekstra alanlar)

Haskell ... ilginç, çünkü önemli sayıda gerekli alana sahip programlar edinme eğilimindesiniz.


2
Sen unuttun 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; }

Başka bir büyük çabadan sonra, kod bir karakter daha az, lütfen daha fazla azaltmama yardımcı olun.


6
bir dahaki sefere orijinal cevabı düzenle
cırcır ucube

( return 0;) ve ( {}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 bayt
walpen

@ walpen: "argc" benzeri parametrelerinin 1 olarak ayarlandığı gerçeğini kullandılar, b'niz başlatılmadı ...
VX

2

Befunge-98 (24)

(Negatif sayıları okuyabilen bir yorumlayıcı kullandığınızdan emin olun (biraz yaygın bir hata gibi görünüyor, ancak RcFunge çalışıyor))

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

Perl (25)

(Perl, değişken adlarında kontrol karakterlerine izin verir, değişkenime ^ B (ASCII 2) adını verdim, böylece hedefe doğru sayılmaz.)

<>; $ ^ B + = $ _ *! / - / <> için; $ ^ B yazdır

(Normal varyant (27 karakter)):

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

i değişken adlandırma gördüğünüzde ve perl cevabınızı görmezden geldi ve tamamen altındaki mükemmel olanı kaçırdım
ardnew

2

APL (10)

+/{0⌈⎕}¨⍳⎕

Açıklama:

  • ⍳⎕: bir satırı okur, kullanıcının N girişi için bir liste verir [1..N]
  • ¨: bu listedeki her öğe için ... (yani N kez yapın)
  • 0⌈⎕: bir satır okuyun, maksimum 0 değerini ve girilen N değerini döndürün
  • Artık kullanıcının girdiği tüm pozitif N'leri ve kullanıcının negatif bir şey girdiği 0'ları içeren bir listemiz var.
  • +/ bu listenin toplamını verir.
  • Sonuç varsayılan olarak çıkarılır (çünkü onunla başka bir şey yapmıyoruz).

2

Mathematica: 18 16

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

Güzel bir işlev, ancak bu belirtilen yeni satırla ayrılmış girdiyi nasıl işler? Toplamın bir parçası olarak test örneği sayısı parametresi t'yi nasıl içermez? Daha fazla verilse bile sadece belirtilen test vakası sayısını nasıl toplar?
Jonathan Van Matre

1

PowerShell, 44

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

1

S, 12

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

örnek kullanım

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

1

sığır eti, 35 24

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

marinus cevabını görerek biraz ilham alarak 24 karakteri de yönettim. ama tamamen farklı bir yaklaşımım var.


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

SPOJ sitesindeki sonuçlar kesinlikle gerçek dışı görünüyor - bunu 63'e nasıl indireceğimi bilmiyorum.

Ancak, tanımlanmamış davranışı kötüye kullanarak bazı derleyicilere 68 karakter erişilebilir. Aşağıdakiler, tüm argümanların yığına iletildiği 32 bit gcc'li x86 Linux üzerinde çalışır.

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

A1'de t sayısı, geri kalan veri a2 ve aşağı


1

Clojure, 108

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

Keşke java.io.BufferedReader.24 karaktere mal olduğu için parçadan kaçınabilseydim . Ancak AFAIK, STDIN'den satırlar olmadan okuyacak bir tesis yok.


1

Perl, 20

Eski ve önemsiz olduğunu biliyorum, ancak Perl cevabı hala geliştirilebilir:

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

Bu harika! Peki ne }{demek / ne yapmak?
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 uzunluğunda. 90'a optimize etmeniz gerekiyor. Herhangi bir öneriniz var mı?


2
Sadece standart hileler: return standart C gereksizdir ++ veya C99, örtük var return 0içinde main. Değişkenleri global yaparak =0başlatmayı bırakabilirsiniz . Son olarak, for(;;)aynı sayıda karakter var, while()ancak bir ifade koymak için iki ekstra yer elde edersiniz.
han

Bu zaten eski değil, aynı zamanda, yazma std::öncesi cinve coutve kurtulmak alma using namespace std;5 daha fazla karakter kaydedebilirsiniz.
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]))

Kullanmak a=raw_inputve r=rangekullanmak a()ve r()daha sonra kullanmak birkaç karakter kaydedebilir.
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
CodeGolf.SE'ye hoş geldiniz! Diğer cevaba bakarsanız, kodları biçimlendirdiklerini ve uygulama dilini belirten minimum bir başlık olduğunu göreceksiniz; daha karmaşık zorluklarla ilgili olarak, birçoğunun uygulama ve koddaki sınırlamalar veya sürprizlerle ilgili notları da vardır. Bunlardan bazıları olmadan, cevabınızın iyi karşılanması pek olası değildir.
dmckee --- eski moderatör kedi yavrusu

Karakterleri saydım, kod düzenini yapmak için girintiyi ekledim ve çıktının dekorasyonunu kaldırdım. Oh - şimdi tekrar saymalıyım. :)
kullanıcı bilinmiyor

Dil adı eklendi. Burada indirimler için çok yer var - sumazaltılabilir s, çıkış dizesi sadece olabilir "%d", vb.
Gareth


0

Python'da 45 karakter

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

1
Bunu nasıl saydın? Bana 54 karakter veriyor.
manatwork

@manatwork, bu sorunun boşluk sayılmayan standart dışı puanlama kuralları vardır.
Peter Taylor

Ayy üzgünüm. Onu özledim. Teşekkürler @PeterTaylor.
manatwork
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.