Somme d'entiers positifs. [fermé]


14

Problème:

Étant donné un ensemble d'entiers, trouvez la somme de tous les entiers positifs qu'il contient.

Contribution:

  • t - nombre de cas de test [ t <1000]
  • Sur chacune des t lignes suivantes, un entier N [-1000 ≤ N ≤ 1000]

Production

Le programme doit sortir la somme de tous les entiers positifs.

Vérifiez votre code dans juge en ligne

But

Le score est égal à la taille du code source de votre programme, à l'exception des symboles avec un code ASCII ≤ 32.

Voici la liste des meilleurs scores : Meilleurs scores Python (le meilleur score est 29)


13
Il y a beaucoup plus de défis de codegolf sur spoj.pl/SHORTEN . Cependant, ne voyez pas l'intérêt de les dupliquer ici.
hallvabo

3
pourquoi cette question est-elle étiquetée python. Sommes-nous intéressés par la solution python uniquement?
Aman ZeeK Verma

24
Je ne pense pas que les questions des sites du concours devraient être publiées ici.
fR0DDY

2
J'ai déjà fait celui-ci sur SPOJ. Il y a quelque temps, ils ont promu toutes les réponses Python2.6 à Python3 même si certains d'entre eux ne fonctionneront pas sous Python3 et seraient plus longs en Python3 - par exemple, doivent utiliser int (input ()) au lieu de input () et print (x) à la place d'impression x. Donc je ne prends plus SPOJ très au sérieux. Je suis à égalité avec Tim Peters et c'est assez bon pour moi :)
gnibbler

4
Je veux juste souligner que sauter le T(nombre de ... errr ... nombres (?)) N'est pas une option ... puisque les cas de test impliquent des données supplémentaires après les Tnombres ... votre code échouera au SPOJ. Tout le monde (3 réponses ci-dessous) semblait avoir intelligemment sauté le premier entier.
st0le

Réponses:


34

Espace, 0

Je n'ai pas pu résister. S= espace, T= tabulation, N= nouvelle ligne, tous ont des codes ASCII <= 32.

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

Encodé en Base64 pour un copier-coller facile.

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=

3
(+1) Bon programme! Un minuscule "FWIW": 9 caractères peuvent être supprimés en raison de 9 instances d'un inutile Sdans le codage binaire d'un nombre. Tout cela se trouve dans les instructions push-number-to-stack du formulaire SSSS...N, où le 4ème Scode un 0 de tête superflu. (Bien sûr, cela n'a aucun effet sur le score.)
res

13

Élément, 17 caractères plus 1 espace

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

Ceci est ma première langue construite. Il est conçu pour être très compact et lisible par l'homme. Toutes les instructions comportent un caractère et remplissent une seule fonction.

L'élément a deux piles et un hachage comme structures de mémoire. Les deux piles sont appelées la pile principale et la pile de contrôle. La pile principale est l'endroit où se produisent l'arithmétique, les E / S et la manipulation de hachage. La pile de contrôle est l'endroit où les opérations logiques se produisent, et cette pile contrôle les boucles while et for.

L'idée de base derrière Element est qu'il existe un hachage qui stocke les nombres / chaînes, tandis que la pile est utilisée pour effectuer des calculs sur ces nombres. Les résultats de ces calculs peuvent ensuite être attribués une certaine place dans le hachage pour une utilisation future. Les différents contenus du hachage sont appelés éléments, il est donc similaire à un tableau mais peut avoir des noms non numériques.

EDIT: Vous pouvez trouver un interprète pour Element (écrit en Perl) ici .

Voici la liste des opérateurs: Dans certains de ces exemples, m et n représentent des nombres déjà sur la pile.

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 \

Voici une procédure pas à pas sur le fonctionnement du programme:

_'[    --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
Une entrée comme celle-ci serait bien améliorée avec un pointeur vers un environnement de travail.
dmckee --- chaton ex-modérateur

5
Je ne pense pas que vous compreniez ce que signifie "lisible par l'homme".
wchargin

3
@WChargin, il est habitué à Perl ...
Caridorc

@WChargin Chaque langue est illisible jusqu'à ce que vous l'appreniez. ;)
Martin Ender

8

Perl, 31

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

Est- sayce que l' utilisation ne rendrait pas cela un peu plus court? Ce serait mieux avec les 29 personnages.
M. Llama

Non, car il sayn'est pas intégré et (au moins) nécessite un commutateur de ligne de commande qui compterait pour le nombre de caractères.
Timwi

Il peut être réduit à 29 octets en utilisant $\ au lieu de $i:<>;$\+=$_*($_>0)while<>;print
Heiko Oberdiek

5

Rubis 1.9.2, 37

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

Appelez comme ruby ​​scriptname file_with_ints.


Je ne peux pas lire beaucoup Ruby, mais est-ce que cela lit le nombre de cas de test?
Joey

Non, ce n'est pas le cas ...
st0le

@ st0le: Je viens de remarquer qu'apparemment aucune solution ne résout actuellement la tâche.
Joey


5

Haskell, 58

Fonctionne correctement uniquement sur des tnombres entiers. Je ne l'ai pas couru contre Spoj parce que je m'en fous de m'inscrire.

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

Que sont les « tentiers»?
wchargin

4

code en C 89 caractères


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

J'ai beaucoup essayé de réduire mon code à moins de 63 octets, mais je ne peux le réduire qu'à 89 octets. Veuillez m'aider à le réduire à 63 octets ou même moins.


1) J'ai compté 90 caractères. 2) return 0;n'est pas nécessaire, le forcycle peut être contracté à for(scanf(x,&t);t--;scanf(x,&a),a>0?b+=a:a);== ce qui fait que 78 caractères ...
VX

Ne compile pas avec 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

Bien que l'espace soit nécessaire, il semble donc étrange de ne pas le compter. Eh bien, les règles sont les règles.

Hmm. Je pourrais probablement m'en tirer avec un nom de variable qui ne compte pas non plus dans le total. Le truc, c'est que je ne sais pas comment coller le code alors.


Montrez-les simplement comme $ ^ A - $ ^ Z, mais attention, beaucoup de ces variables ont des significations spéciales.
ninjalj

3

Clojure, 71

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

Cela ne produit aucune sortie et échoue car ce *in*n'est pas un java.io.BufferedReader, comme requis par line-seq.
John Cromartie

Il ignore également le nombre de lignes saisies 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))

en supposant que i est le fichier contenant les entiers.

¹) était faux, incluait le nombre de lignes et ajoutait 1 ligne de moins.

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

(espaces supplémentaires pour plus de clarté, car ils ne comptent pas)

Haskell est ... intéressant, car vous avez tendance à obtenir des programmes avec un nombre important d'espaces nécessaires.


2
Vous avez oublié un 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; }

Après un autre gros effort, le code est un caractère de moins, veuillez m'aider à le réduire davantage.


6
il suffit de modifier la réponse originale la prochaine fois
ratchet freak

supprimer les ( return 0;) et ( {}pourfor )
l0n3sh4rk

b,x="%d";main(a,t){for(scanf(x,&t);t--&&scanf(x,&a);)b+=(a>0)*a;printf(x,b);} <- 77 octets
walpen

@walpen: ils ont utilisé le fait que leur paramètre "argc" était mis à 1, votre b n'est pas initialisé ...
VX

2

Befunge-98 (24)

(Assurez-vous que vous utilisez un interpréteur capable de lire les nombres négatifs (semble être un bogue quelque peu courant, mais RcFunge fonctionne))

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

Perl (25)

(Perl autorise les caractères de contrôle dans les noms de variables, j'ai nommé ma variable ^ B (ASCII 2) pour qu'elle ne compte pas dans l'objectif.)

<>; $ ^ B + = $ _ *! / - / pour <>; imprimer $ ^ B

(Variante normale (27 caractères)):

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

j'ai ignoré votre réponse perl pour la première fois quand j'ai vu la variable nommer et complètement raté l'excellent en dessous
ardnew

2

APL (10)

+/{0⌈⎕}¨⍳⎕

Explication:

  • ⍳⎕: lire une ligne, donne une liste [1..N] pour l'entrée utilisateur N
  • ¨: pour chaque élément de cette liste ... (ie faire N fois)
  • 0⌈⎕: lire une ligne, retourner le maximum de 0 et le N entré
  • Nous avons maintenant une liste avec tous les N positifs que l'utilisateur a saisis et 0 où l'utilisateur a entré quelque chose de négatif.
  • +/ donne la somme de cette liste.
  • Le résultat est affiché par défaut (car nous ne faisons rien d'autre avec).

2

Mathematica: 18 16

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

Belle fonction, mais comment cela gère-t-il l'entrée séparée par un saut de ligne spécifiée? Comment n'intègre-t-il pas le paramètre nombre de cas de test t dans la somme? Comment se résume-t-il uniquement au nombre de cas de test spécifié, même si d'autres sont fournis?
Jonathan Van Matre

1

PowerShell, 44

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

1

Q, 12

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

exemple d'utilisation

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

1

befunge, 35 24

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

avec un peu d'inspiration en voyant marinus répondre, j'ai aussi réussi 24 caractères. mais j'ai une approche complètement différente.


1

PYTHON 2.x, 50 caractères

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

1

C, 70 72 caractères

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

Les résultats sur le site SPOJ semblent définitivement irréels - je ne sais pas comment ramener cela à 63.

Cependant, 68 caractères sont accessibles sur certains compilateurs en abusant d'un comportement non défini. Ce qui suit fonctionne sur x86 Linux avec gcc 32 bits, sur lequel tous les arguments sont passés sur la pile.

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

compter t dans A1, reste des données a2 et plus bas


1

Clojure, 108

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

Je souhaite vraiment pouvoir éviter la java.io.BufferedReader.partie, car cela coûte 24 caractères lui-même. Mais AFAIK, il n'y a aucune possibilité de lire les lignes de STDIN sans lui.


1

Perl, 20

Je sais que c'est vieux et trivial, mais la réponse Perl peut encore être améliorée:

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

C'est génial! Mais que veut }{dire / faire?
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 caractères de long. Besoin de l'optimiser à 90. Des suggestions?


2
Juste les astuces standard: Le retour n'est pas nécessaire en C ++ ou C99 standard, il y a un implicite return 0dans main. En rendant les variables globales, vous pouvez supprimer l' =0initialisation. Enfin, for(;;)c'est le même nombre de caractères que while()mais vous avez deux endroits supplémentaires pour mettre une expression.
han

Ceci est déjà vieux, mais aussi, écrit std::avant cinet coutet se débarrasser de la using namespace std;peut sauver 5 caractères.
Morwenn

0

PHP, 71

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

0

Python: (92 caractères)

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

L'utilisation de a=raw_inputet r=rangeet l'utilisation de a()et r()plus tard peuvent enregistrer plusieurs caractères.
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
Bienvenue sur CodeGolf.SE! Si vous regardez l'autre réponse, vous verrez qu'ils ont du code formaté et un en-tête minimal notant le langage d'implémentation; sur des défis plus complexes, beaucoup ont également des notes sur la mise en œuvre et les limites ou surprises dans le code. Sans cela, il est peu probable que votre réponse soit bien reçue.
dmckee --- chaton ex-modérateur du

J'ai compté les caractères, ajouté l'indentation pour que la mise en page du code fonctionne et supprimé la décoration de la sortie. Oh - maintenant je dois encore compter. :)
utilisateur inconnu

Nom de langue ajouté. Il y a beaucoup de place pour les réductions ici - sumpeut être réduit à s, la chaîne de sortie peut simplement l'être "%d", etc.
Gareth


0

45 caractères en python

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

1
Comment avez-vous compté cela? Cela me donne 54 caractères.
manatwork

@manatwork, this question has non-standard scoring rules which don't count whitespace.
Peter Taylor

Oops, sorry. I missed that. Thanks, @PeterTaylor.
manatwork
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.