Summe der positiven ganzen Zahlen. [geschlossen]


14

Problem:

Ermitteln Sie bei einer gegebenen Anzahl von Ganzzahlen die Summe aller positiven Ganzzahlen.

Eingang:

  • t - Anzahl der Testfälle [ t <1000]
  • In jeder der nächsten t Zeilen eine ganze Zahl N [-1000 ≤ N ≤ 1000]

Ausgabe

Das Programm sollte die Summe aller positiven ganzen Zahlen ausgeben.

Überprüfen Sie Ihren Code in Online-Richter

Ergebnis

Die Punktzahl entspricht der Größe des Quellcodes Ihres Programms, mit Ausnahme von Symbolen mit ASCII-Code ≤ 32.

Hier ist die Liste der besten Punkte: Python- Bestnoten ( Bestnote: 29)


13
Bei spoj.pl/SHORTEN gibt es viel mehr Codegolf-Herausforderungen . Sehen Sie hier jedoch nicht den Sinn, sie zu duplizieren.
Hallvabo

3
Warum ist diese Frage mit Python markiert? Sind wir nur an einer Python-Lösung interessiert?
Aman ZeeK Verma

24
Ich denke nicht, dass Fragen von Wettbewerbsseiten hier gepostet werden sollten.
Freitag,

2
Das habe ich schon bei SPOJ gemacht. Vor einiger Zeit haben sie alle Python2.6-Antworten auf Python3 umgestellt, obwohl einige von ihnen nicht unter Python3 ausgeführt werden und in Python3 länger sind - z. B. müssen Sie statt input () int (input ()) und statt print (x) verwenden Druck x. Also nehme ich SPOJ nicht mehr sehr ernst. Ich bin mit Tim Peters verbunden und das ist gut genug für mich :)
gnibbler

4
Ich möchte nur darauf hinweisen, dass das Überspringen der T(Anzahl der ... errr ... Zahlen (?)) Keine Option ist, da die Testfälle zusätzliche Daten nach den TZahlen enthalten ... Ihr Code schlägt bei SPOJ fehl. Jeder (3 Antworten unten) schien die erste Ganzzahl geschickt übersprungen zu haben.
st0le

Antworten:


34

Leerzeichen, 0

Ich konnte nicht widerstehen. S= Leerzeichen, T= Tabulator, N= Zeilenvorschub, alle haben ASCII-Codes <= 32.

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

Base64-codiert für einfaches Kopieren und Einfügen.

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=

3
(+1) Schönes Programm! Ein winziges "FWIW": 9 Zeichen können aufgrund von 9 nicht benötigten Instanzen Sin der Binärcodierung einer Zahl entfernt werden. Diese sind alle in Push-number-to-Stack Anweisungen der Form SSSS...N, in der die vierte SCodes überflüssig führende 0. (Natürlich ist dies keine Auswirkungen auf die Partitur hat.)
res

13

Element, 17 Zeichen plus 1 Leerzeichen

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

Dies ist meine erste konstruierte Sprache. Es ist sehr kompakt und für den Menschen lesbar. Alle Anweisungen sind ein Zeichen lang und führen eine einzelne Funktion aus.

Element hat zwei Stapel und einen Hash als Speicherstrukturen. Die beiden Stapel werden als Hauptstapel und Kontrollstapel bezeichnet. Im Hauptstapel werden Arithmetik, E / A und Hash-Manipulationen ausgeführt. Der Steuerungsstapel ist der Ort, an dem Logikoperationen stattfinden, und dieser Stapel steuert die while- und for-Schleifen.

Die Grundidee hinter Element ist, dass es einen Hash gibt, der Zahlen / Strings speichert, während der Stack verwendet wird, um Berechnungen mit diesen Zahlen durchzuführen. Die Ergebnisse dieser Berechnung können dann für die zukünftige Verwendung einer bestimmten Stelle im Hash zugewiesen werden. Die verschiedenen Inhalte des Hashs werden als Elemente bezeichnet. Sie ähneln also einem Array, können jedoch nicht numerische Namen haben.

EDIT: Einen Interpreter für Element (geschrieben in Perl) finden Sie hier .

Hier ist die Liste der Operatoren: In einigen dieser Beispiele stehen m und n für Zahlen, die sich bereits auf dem Stapel befinden.

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 \

Hier ist eine exemplarische Vorgehensweise, wie das Programm funktioniert:

_'[    --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
Ein Eintrag wie dieser würde durch einen Zeiger auf eine Arbeitsumgebung erheblich verbessert.
dmckee

5
Ich glaube nicht, dass Sie verstehen, was "lesbar" bedeutet.
wchargin

3
@WChargin er ist Perl
gewohnt

@WChargin Jede Sprache ist unlesbar, bis Sie es lernen. ;)
Martin Ender

8

Perl, 31

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

Würde das mit nicht sayein bisschen kürzer werden? Es würde mit den 29 Charakteren am besten übereinstimmen.
Mr. Llama

Nein, da sayes nicht integriert ist und (zumindest) eine Befehlszeilenoption erfordert, die für die Anzahl der Zeichen berücksichtigt wird.
Timwi

Es kann auf 29 Bytes gekürzt werden, indem Folgendes $\ verwendet wird $i:<>;$\+=$_*($_>0)while<>;print
Heiko Oberdiek

5

Ruby 1.9.2, 37

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

Rufe wie ruby ​​scriptname file_with_ints auf.


Ich kann nicht viel Ruby lesen, aber liest das überhaupt die Anzahl der Testfälle?
Joey

Nein, tut es nicht ...
st0le

@st0le: Hab gerade gemerkt, dass anscheinend derzeit keine Lösung die Aufgabe löst.
Joey


5

Haskell, 58

Funktioniert nur ordnungsgemäß t ganzen Zahlen. Ich habe es nicht gegen Spoj laufen lassen, weil ich es einfach nicht mag, mich dort zu registrieren.

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

Was sind " tganze Zahlen"?
wchargin

4

Code ein C 89 Zeichen


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

Ich habe viel versucht, meinen Code auf weniger als 63 Bytes zu reduzieren, aber ich kann ihn nur auf 89 Bytes reduzieren. Bitte helfen Sie mir, es auf 63 Bytes oder noch weniger zu reduzieren.


1) Ich habe 90 Zeichen gezählt. 2) return 0;ist nicht erforderlich, der forZyklus kann auf for(scanf(x,&t);t--;scanf(x,&a),a>0?b+=a:a);== verkleinert werden, wodurch 78 Zeichen ...
VX

Kompiliert nicht mit 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

Obwohl der Raum notwendig ist, scheint es seltsam, ihn nicht zu zählen. Na ja, die Regeln sind die Regeln.

Hmm. Ich könnte wahrscheinlich mit einem Variablennamen davonkommen, der auch nicht zur Gesamtsumme zählt. Die Sache ist, ich bin nicht sicher, wie ich den Code dann einfügen würde.


Zeigen Sie sie einfach als $ ^ A - $ ^ Z an, aber beachten Sie, dass viele dieser Variablen spezielle Bedeutungen haben.
Ninjalj

3

Clojure, 71

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

Dies erzeugt keine Ausgabe und schlägt fehl, da *in*es sich nicht um eine handelt java.io.BufferedReader, wie von gefordert line-seq.
John Cromartie

Außerdem wird die Anzahl der eingegebenen Zeilen t ignoriert .
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))

Angenommen, i ist die Datei, die die Ints enthält.

¹) war falsch, enthielt die Anzahl der Zeilen und fügte 1 Zeile zu wenig hinzu.

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

(zusätzliche Leerzeichen für Klarheit, da sie nicht zählen)

Haskell ist ... interessant, da Sie in der Regel Programme mit einer erheblichen Anzahl von erforderlichen Leerzeichen erhalten.


2
Du hast a vergessen 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; }

Nach einer weiteren großen Anstrengung ist der Code ein Zeichen weniger. Bitte helfen Sie mir, ihn weiter zu reduzieren.


6
Bearbeiten Sie einfach die ursprüngliche Antwort beim nächsten Mal
Ratschenfreak

Entfernen Sie die ( return 0;) und ( {}für 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: Sie benutzten die Tatsache, dass ihr "argc" -ähnlicher Parameter auf 1 gesetzt wurde, Ihr b ist nicht initialisiert ...
VX

2

Befunge-98 (24)

(Stellen Sie sicher, dass Sie einen Interpreter verwenden, der negative Zahlen lesen kann (scheint ein etwas häufiger Fehler zu sein, aber RcFunge funktioniert).)

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

Perl (25)

(Perl erlaubt Steuerzeichen in Variablennamen, ich habe meine Variable ^ B (ASCII 2) so benannt, dass sie nicht zum Ziel zählt.)

<>; $ ^ B + = $ _ *! / - / für <>; $ ^ B drucken

(Normale Variante (27 Zeichen)):

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

Ich habe Ihre Perl-Antwort zum ersten Mal ignoriert, als ich die Benennung der Variablen sah und die ausgezeichnete darunter völlig verpasst habe
zwar

2

APL (10)

+/{0⌈⎕}¨⍳⎕

Erläuterung:

  • ⍳⎕: Liest eine Zeile und gibt eine Liste [1..N] für die Benutzereingabe N aus
  • ¨: für jedes Element in dieser Liste ... (dh N-mal)
  • 0⌈⎕: Lies eine Zeile, gib das Maximum von 0 und das eingegebene N zurück
  • Wir haben jetzt eine Liste mit allen positiven Ns, die der Benutzer eingegeben hat, und 0s, bei denen der Benutzer etwas Negatives eingegeben hat.
  • +/ gibt die Summe dieser Liste an.
  • Das Ergebnis wird standardmäßig ausgegeben (da wir nichts anderes damit machen).

2

Mathematica: 18 16

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

Nette Funktion, aber wie geht das mit der spezifizierten Eingabe durch Zeilenumbruch um? Wie wird die Anzahl der Testfälle Parameter t nicht als Teil der Summe berücksichtigt? Wie summiert es sich nur bis zur angegebenen Anzahl von Testfällen, auch wenn mehr gegeben sind?
Jonathan Van Matre

1

PowerShell, 44

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

1

Q, 12

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

Probennutzung

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

1

befunge, 35 24

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

Mit ein wenig Inspiration durch die Antwort von Marinus habe ich auch 24 Charaktere verwaltet. aber ich habe einen ganz anderen ansatz.


1

PYTHON 2.x, 50 Zeichen

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

1

C, 70 bis 72 Zeichen

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

Die Ergebnisse auf der SPOJ-Website scheinen definitiv unwirklich - ich habe keine Ahnung, wie ich das auf 63 reduzieren kann.

Einige Compiler erreichen jedoch 68 Zeichen, wenn sie undefiniertes Verhalten missbrauchen. Das Folgende funktioniert unter x86-Linux mit 32-Bit-GCC, auf dem alle Argumente auf dem Stapel übergeben werden.

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

1

übertreffen, 27

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

Zählen Sie t in A1, Restdaten a2 und abwärts


1

Clojure, 108

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

Ich wünschte wirklich, ich könnte das java.io.BufferedReader.Teil vermeiden , da es 24 Zeichen selbst kostet. Aber AFAIK gibt es keine Möglichkeit, Zeilen von STDIN ohne es zu lesen.


1

Perl, 20

Ich weiß, dass es alt und trivial ist, aber die Perl-Antwort kann noch verbessert werden:

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

Das ist fantastisch! Aber was }{heißt / tun?
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 Zeichen lang. Müssen Sie es auf 90 optimieren. Irgendwelche Vorschläge?


2
Nur die Standard-Tricks: Die Rückgabe ist in Standard-C ++ oder C99 nicht notwendig, es gibt eine implizite return 0in main. Indem Sie die Variablen global machen, können Sie die =0Initialisierung löschen. Schließlich for(;;)ist die gleiche Anzahl von Zeichen wie, while()aber Sie erhalten zwei zusätzliche Stellen, um einen Ausdruck
einzufügen

Das ist schon alt, aber auch schriftlich std:: vor cinund coutund das Loswerden der using namespace std;kann weitere 5 Zeichen speichern.
Morwenn

0

PHP, 71

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

0

Python: (92 Zeichen)

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

Mit a=raw_inputund r=rangeund mit a()und r()später können einige Zeichen gespeichert werden.
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
Willkommen bei CodeGolf.SE! Wenn Sie sich die andere Antwort ansehen, werden Sie feststellen, dass sie formatierten Code und einen minimalen Header haben, in dem die Implementierungssprache angegeben ist. bei komplizierteren herausforderungen haben viele auch hinweise zur umsetzung und eventuelle grenzen oder überraschungen im code. Ohne einen Teil davon ist es unwahrscheinlich, dass Ihre Antwort gut aufgenommen wird.
dmckee

Ich zählte die Zeichen, fügte den Einzug hinzu, damit das Code-Layout funktioniert, und entfernte die Dekoration der Ausgabe. Oh - jetzt muss ich wieder zählen. :)
Benutzer unbekannt

Name der Sprache hinzugefügt. Hier gibt es viel Platz für Reduzierungen - sumkann auf reduziert werden s, die Ausgabezeichenfolge kann nur sein "%d", etc.
Gareth


0

45 Zeichen in Python

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

1
Wie hast du das gezählt? Es gibt mir 54 Zeichen.
Manatwork

@manatwork, diese Frage enthält nicht standardmäßige Bewertungsregeln, bei denen Leerzeichen nicht berücksichtigt werden.
Peter Taylor

Ups, Entschuldigung. Das habe ich vermisst. Vielen Dank, @PeterTaylor.
Manatwork
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.