Suma dodatnich liczb całkowitych. [Zamknięte]

14

Problem:

Biorąc pod uwagę zestaw liczb całkowitych, znajdź w nim sumę wszystkich dodatnich liczb całkowitych.

Wejście:

  • t - liczba przypadków testowych [ t <1000]
  • W każdym z kolejnych t wierszy liczba całkowita N [-1000 ≤ N ≤ 1000]

Wynik

Program powinien wypisać sumę wszystkich liczb całkowitych dodatnich.

Sprawdź swój kod w internetowym sądzie

Wynik

Wynik jest równy rozmiarowi kodu źródłowego twojego programu, z wyjątkiem symboli z kodem ASCII ≤ 32.

Oto lista najlepszych wyników: Najlepsze wyniki w Pythonie (najlepszy wynik to 29)

gmunkhbaatarmn
źródło
13
Na spoj.pl/SHORTEN jest o wiele więcej wyzwań dla codegolfa . Nie widzę tu jednak sensu ich kopiowania.
hallvabo
3
dlaczego to pytanie jest oznaczone pythonem. Czy interesuje nas tylko rozwiązanie python?
Aman ZeeK Verma
24
Nie sądzę, aby pytania z witryn konkursowych były zamieszczane tutaj.
fR0DDY
2
Zrobiłem już to na SPOJ. Jakiś czas temu promowali wszystkie odpowiedzi Python2.6 na Python3, chociaż niektóre z nich nie działają pod Python3 i będą dłuższe w Python3 - np. Zamiast tego należy używać int (input ()) zamiast input () i print (x) wydruku x. Więc nie biorę już SPOJ bardzo poważnie. Jestem związany z Timem
Peterem
4
Chcę tylko zaznaczyć, że pominięcie T(liczba ... errr ... liczb (?)) Nie jest opcją ... ponieważ przypadki testowe zawierają dodatkowe dane po Tliczbach ... twój kod zawiedzie w SPOJ. Wydawało się, że wszyscy (3 odpowiedzi poniżej) sprytnie pominęli pierwszą liczbę całkowitą.
st0le

Odpowiedzi:

34

Biała spacja, 0

Nie mogłem się oprzeć. S= spacja, T= tab, N= nowa linia, wszystkie mają kody ASCII <= 32.

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

Kodowane w standardzie Base64 dla łatwego kopiowania i wklejania.

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=
hammar
źródło
3
(+1) Niezły program! Małe „FWIW”: 9 znaków można usunąć z powodu 9 przypadków niepotrzebnego Skodowania binarnego liczby. Są to wszystkie instrukcje w formularzu push-number-stack SSSS...N, w których 4. Skoduje zbędne wiodące 0. (Oczywiście nie ma to wpływu na wynik.)
res
13

Element, 17 znaków plus 1 spacja

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

To jest mój pierwszy skonstruowany język. Został zaprojektowany tak, aby był bardzo kompaktowy i czytelny dla człowieka. Wszystkie instrukcje mają długość jednego znaku i spełniają jedną funkcję.

Element ma dwa stosy i skrót jako struktury pamięci. Dwa stosy nazywane są stosem głównym i stosem kontrolnym. Główny stos to miejsce, w którym występuje manipulacja arytmetyczna, we / wy i mieszania. Stos sterujący to miejsce, w którym zachodzą operacje logiczne, a stos ten steruje pętlą while i for.

Podstawową ideą elementu jest to, że istnieje skrót przechowujący liczby / ciągi znaków, podczas gdy stos służy do wykonywania obliczeń na tych liczbach. Wyniki tych obliczeń mogą następnie przypisać określone miejsce w haszu do przyszłego wykorzystania. Różne treści skrótu są nazywane elementami, więc jest podobny do tablicy, ale może mieć nazwy nienumeryczne.

EDIT: Można znaleźć tłumacza Element (napisany w Perlu) tutaj .

Oto lista operatorów: W niektórych z tych przykładów min oznaczają liczby już na stosie.

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 \

Oto przewodnik na temat działania programu:

_'[    --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
źródło
6
Wpis taki zostałby znacznie ulepszony dzięki wskaźnikowi do środowiska pracy.
dmckee --- były moderator kociąt
5
Nie sądzę, żebyś rozumiał, co oznacza „czytelny dla człowieka”.
wchargin
3
@WChargin jest przyzwyczajony do Perla ...
Caridorc
@WChargin Każdy język jest nieczytelny, dopóki go nie nauczysz. ;)
Martin Ender,
8

Perl, 31

<>;$i+=$_*($_>0)while<>;print$i
Timwi
źródło
Czy użycie saytego nie uczyniłoby tego nieco krótszym? Najlepiej pasowałby do 29 postaci.
Pan Llama,
Nie, ponieważ saynie jest wbudowany i (przynajmniej) wymaga przełącznika wiersza polecenia, który byłby liczony do liczby znaków.
Timwi
Można go skrócić do 29 bajtów za pomocą $\ zamiast $i:<>;$\+=$_*($_>0)while<>;print
Heiko Oberdiek
5

Ruby 1.9.2, 37

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

Wywołaj jak rubinowa nazwa skryptu file_with_ints.

steenslag
źródło
Nie umiem czytać dużo Rubiego, ale czy to w ogóle odczytuje liczbę przypadków testowych?
Joey,
Nie, nie robi ...
st0le,
@ st0le: Właśnie zauważyłem, że najwyraźniej żadne rozwiązanie obecnie nie rozwiązuje zadania.
Joey
5

Ruby, 52

t=gets.to_i;s=0;t.times{i=gets.to_i;s+=i if i>0};p s
david4dev
źródło
Nie widzę, gdzie drukujesz wartość s.
Wile E. Coyote
tak, zapomniałem
david4dev
5

Haskell, 58

Prawidłowo działa tylko na tliczbach całkowitych. Nie uruchomiłem tego przeciwko Spojowi, bo po prostu nie mam ochoty się tam zarejestrować.

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

źródło
Co to są „ tliczby całkowite”?
wchargin
4

kod w C 89 znaków


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

Dużo próbowałem zredukować mój kod do mniej niż 63 bajtów, ale mogę go zmniejszyć tylko do 89 bajtów. Pomóż mi zmniejszyć go do 63 bajtów lub nawet mniej.

avinashse
źródło
1) Naliczyłem 90 znaków. 2) return 0;nie jest konieczne, forcykl może zostać for(scanf(x,&t);t--;scanf(x,&a),a>0?b+=a:a);skrócony do ==, co powoduje, że 78 znaków ...
VX 5'14
Nie kompiluje się z 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

Chociaż przestrzeń jest niezbędna, dziwne wydaje się jej nie liczenie. No cóż, reguły są zasadami.

Hmm Prawdopodobnie mógłbym odejść od używania nazwy zmiennej, która również nie liczy się do sumy. Chodzi o to, że nie jestem pewien, jak wkleiłbym kod.

Peter Taylor
źródło
Po prostu pokaż je jako $ ^ A - $ ^ Z, ale uważaj, że wiele z tych zmiennych ma specjalne znaczenie.
ninjalj
3

Clojure, 71

(reduce + (filter pos? (map #(Integer/parseInt %) (next (line-seq *in*)))))
Meikel
źródło
Nie generuje to żadnych wyników i kończy się niepowodzeniem, ponieważ *in*nie jest to java.io.BufferedReader, jak wymaga tego line-seq.
John Cromartie,
Ignoruje również liczbę linii wejściowych t .
John Cromartie,
3

Na pamiątkę Dennis M. Ritchie

unix 57¹ 72:

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

zakładając, że i jest plikiem zawierającym ints.

¹) było błędne, zawierało liczbę linii i dodało 1 linię za mało.

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

nieznany użytkownik
źródło
2

Haskell, 51

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

(dodatkowe spacje dla przejrzystości, ponieważ się nie liczą)

Haskell jest ... interesujący, ponieważ masz tendencję do otrzymywania programów ze znaczną liczbą potrzebnych miejsc.

Zaraz.
źródło
2
Zapomniałeś 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; }

Po kolejnym dużym wysiłku kod jest o jeden znak mniej, pomóż mi bardziej go zmniejszyć.

avinashse
źródło
6
po prostu edytuj oryginalną odpowiedź następnym razem
maniak zapadkowy
usuń ( return 0;) i ( {}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 bajtów
walpen
@walpen: wykorzystali fakt, że ich parametr „argc” został ustawiony na 1, twoje b jest niezainicjowane ...
VX
2

Befunge-98 (24)

(Upewnij się, że używasz interpretera, który może odczytywać liczby ujemne (wydaje się to być dość powszechnym błędem, ale RcFunge działa))

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

Perl (25)

(Perl zezwala na znaki sterujące w nazwach zmiennych, nazwałem swoją zmienną ^ B (ASCII 2), aby nie liczyć się do celu.)

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

(Wariant normalny (27 znaków)):

<>;$B+=$_*!/-/for<>;print$B
marinus
źródło
po raz pierwszy zignorowałem twoją odpowiedź na perla, kiedy zobaczyłem nazywanie zmiennej i całkowicie przegapiłem doskonałą pod nią
nowy
2

APL (10)

+/{0⌈⎕}¨⍳⎕

Wyjaśnienie:

  • ⍳⎕: przeczytaj wiersz, podaje listę [1..N] dla danych wejściowych użytkownika N
  • ¨: dla każdego elementu na tej liście ... (tzn. wykonaj N razy)
  • 0⌈⎕: przeczytaj wiersz, zwróć maksymalnie 0 i wprowadzony N
  • Mamy teraz listę wszystkich pozytywnych N wprowadzonych przez użytkownika i 0, gdzie użytkownik wpisał coś negatywnego.
  • +/ daje sumę tej listy.
  • Wynik jest domyślnie wyprowadzany (ponieważ nie robimy z nim nic innego).
marinus
źródło
2

Mathematica: 18 16

Boole[#>0]&/@x.x
Corey Kelly
źródło
Fajna funkcja, ale w jaki sposób obsługuje to określone wejście oddzielone znakiem nowej linii? W jaki sposób nie uwzględnia parametru liczby przypadków testowych t jako części sumy? Jak sumuje się tylko do określonej liczby przypadków testowych, nawet jeśli podano więcej?
Jonathan Van Matre
1

PowerShell, 44

($i=$input|%{+$_})[1..$i[0]]-gt0-join'+'|iex
Joey
źródło
1

Pytanie 12

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

przykładowe użycie

q){0+/x(&)x>0} 1 -1 2 3 -1
6
tartin
źródło
1

befunge, 35 24

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

z niewielką inspiracją, widząc odpowiedź marinus, udało mi się również 24 znaki. ale mam zupełnie inne podejście.

Ali1S232
źródło
1

PYTHON 2.x, 50 znaków

r=input
print sum(i for i in (r() for j in range(r())) if i>0)
Joel Cornett
źródło
1

C, 70 72 znaków

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

Wyniki na stronie SPOJ zdecydowanie wydają się nierealne - nie mam pojęcia, jak sprowadzić to do 63.

Jednak w niektórych kompilatorach można osiągnąć 68 znaków poprzez nadużywanie niezdefiniowanego zachowania. Poniższe działa w systemie Linux x86 z 32-bitowym gcc, na którym wszystkie stosy są przekazywane na stos.

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

excel, 27

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

policz t w A1, reszta danych a2 i w dół

SeanC
źródło
1

Clojure, 108

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

Naprawdę chciałbym uniknąć tej java.io.BufferedReader.części, ponieważ sama kosztuje 24 znaki. Ale AFAIK bez tego nie ma możliwości odczytu linii ze STDIN.

John Cromartie
źródło
1

Perl, 20

Wiem, że jest stary i trywialny, ale odpowiedź na Perla można jeszcze poprawić:

#!perl -p
$.<2or$\+=$_*!/-/}{
nutki
źródło
To jest niesamowite! Ale co to }{znaczy / robi?
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 znaków. Potrzebujesz zoptymalizować do 90. Jakieś sugestie?

CodeJunkie
źródło
2
Tylko standardowe sztuczki: powrót jest konieczne w standardowej C ++ lub C99, istnieje niejawna return 0w main. Ustawiając zmienne globalne, możesz porzucić =0inicjalizację. W końcu for(;;)jest taka sama liczba znaków, while()ale masz dwa dodatkowe miejsca na wyrażenie.
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

PHP, 71

<?for($s=0,$t=fgets(STDIN)+0;$t--;$s+=($n=fgets(STDIN))>0?$n:0);echo$s;
l0n3sh4rk
źródło
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]))
Rushil Paul
źródło
Using a=raw_input and r=range and using a() and r() later can save quite a few characters.
Morwenn
0

scala 55 54:

println ((for (r <- 1 to readInt;
  i=readInt;
    if i>0) yield i)sum)
user unknown
źródło
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
źródło
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
0

45 chars in python

c=0
j=input
for i in j()*[0]:
    b=j()
    c+=b*(b>0)
print c
user2274615
źródło
1
How you counted that? It gives me 54 characters.
manatwork
@manatwork, this question has non-standard scoring rules which don't count whitespace.
Peter Taylor
Oops, sorry. I missed that. Thanks, @PeterTaylor.
manatwork