Soma de números inteiros positivos. [fechadas]


14

Problema:

Dado um conjunto de números inteiros, encontre a soma de todos os números inteiros positivos.

Entrada:

  • t - número de casos de teste [ t <1000]
  • Em cada uma das próximas linhas t , um número inteiro N [-1000 ≤ N ≤ 1000]

Resultado

O programa deve gerar a soma de todos os números inteiros positivos.

Verifique seu código no juiz online

Ponto

A pontuação é igual ao tamanho do código fonte do seu programa, exceto os símbolos com código ASCII ≤ 32.

Aqui está a melhor pontuação: Python Best Scores (Best score is 29)


13
Existem muito mais desafios de codegolf em spoj.pl/SHORTEN . Não vejo o ponto de duplicá-los aqui, no entanto.
Hallvabo

3
por que essa pergunta está marcada com python? Estamos interessados ​​apenas na solução python?
Aman zeek Verma

24
Não acho que as perguntas dos sites dos concursos devam ser postadas aqui.
FR0DDY

2
Eu já fiz este no SPOJ. Há algum tempo, eles promoveram todas as respostas do Python2.6 para o Python3, embora algumas delas não sejam executadas no Python3 e seriam mais longas no Python3 - por exemplo, precisam usar int (input ()) em vez de input () e print (x) de impressão x. Portanto, não levo mais a sério o SPOJ. Eu estou amarrado com Tim Peters e isso é bom o suficiente para mim :)
gnibbler

4
Eu só quero ressaltar que pular o T(número de ... err ... números (?)) Não é uma opção ... já que os casos de teste envolvem dados extras após Tnúmeros ... seu código falhará no SPOJ. Todos (3 respostas abaixo) pareciam ter pulado o primeiro número inteligente.
st0le

Respostas:


34

Espaço em branco, 0

Eu não pude resistir. S= espaço, T= tabulação, N= nova linha, todos têm códigos ASCII <= 32.

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

Codificado em Base64 para fácil copiar e colar.

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=

3
(+1) Bom programa! Um pequeno "FWIW": 9 caracteres pode ser removido devido a 9 instâncias desnecessárias Sna codificação binária de um número. Estas são todas as instruções em push-número-a-pilha do formulário SSSS...N, onde o 4º Scódigos de um supérfluo líder 0. (É claro que isso não tem efeito sobre a pontuação.)
res

13

Elemento, 17 caracteres mais 1 espaço

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

Esta é a minha primeira linguagem construída. Ele foi projetado para ser muito compacto e legível por humanos. Todas as instruções têm um caractere e executam uma única função.

O elemento possui duas pilhas e um hash como estruturas de memória. As duas pilhas são chamadas de pilha principal e pilha de controle. A pilha principal é onde ocorre a manipulação aritmética, de E / S e de hash. A pilha de controle é onde as operações lógicas ocorrem, e essa pilha controla o tempo e os loops.

A idéia básica por trás do Element é que existe um hash que armazena números / strings, enquanto a pilha é usada para realizar cálculos nesses números. Os resultados desses cálculos podem ser atribuídos a um determinado local no hash para uso futuro. Os diferentes conteúdos do hash são chamados de elementos, portanto, é semelhante a uma matriz, mas pode ter nomes não numéricos.

EDIT: Você pode encontrar um intérprete para Element (escrito em Perl) aqui .

Aqui está a lista de operadores: Em alguns desses exemplos, m e n representam números já na pilha.

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 \

Aqui está uma explicação de como o programa funciona:

_'[    --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
Uma entrada como essa seria muito melhorada com um ponteiro para um ambiente de trabalho.
dmckee --- ex-moderador gatinho

5
Acho que você não entende o que significa "legível por humanos".
Wchargin # 25/14

3
@WChargin ele está acostumado a Perl ...
Caridorc

@WChargin Todo idioma é ilegível até você aprender. ;)
Martin Ender

8

Perl, 31

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

Usar não saytornaria isso um pouco mais curto? Seria o melhor personagem com 29 caracteres.
Mr. Llama

Não, porque saynão é interno e (pelo menos) requer uma opção de linha de comando que contaria para a contagem de caracteres.
Timwi

Ele pode ser encurtado para 29 bytes usando $\ em vez de $i:<>;$\+=$_*($_>0)while<>;print
Heiko Oberdiek

5

Ruby 1.9.2, 37

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

Chame como ruby ​​scriptname file_with_ints.


Não consigo ler muito Ruby, mas isso lê o número de casos de teste?
Joey

Não, não ...
st0le

@ st0le: Acabei de perceber que aparentemente nenhuma solução atualmente resolve a tarefa.
Joey


5

Haskell, 58

Funciona corretamente apenas em tnúmeros inteiros. Não joguei contra Spoj porque eu simplesmente não me importo em me registrar lá.

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

O que são " tnúmeros inteiros"?
wchargin

4

código em caracteres C 89


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

Eu tentei muito reduzir meu código para menos de 63 bytes, mas posso reduzi-lo apenas para 89 bytes. Por favor, ajude-me a reduzi-lo para 63 bytes ou até menos.


1) Eu contei 90 caracteres. 2) return 0;Não é necessário, o forciclo pode ser contratada para for(scanf(x,&t);t--;scanf(x,&a),a>0?b+=a:a);== que fazem que 78 caracteres ...
VX

Não compila com o 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

Embora o espaço seja necessário, parece estranho não contar. Bem, as regras são as regras.

Hmm. Eu provavelmente poderia usar um nome de variável que também não conta para o total. O problema é que não tenho certeza de como colaria o código então.


Apenas mostre-os como $ ^ A - $ ^ Z, mas tenha cuidado que muitas dessas variáveis ​​têm significados especiais.
Ninjalj

3

Clojure, 71

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

Isso não produz nenhuma saída e falha porque *in*não é um java.io.BufferedReader, conforme exigido por line-seq.
9789 John DeMillie,

Também ignora o número de linhas inseridas t .
9789 John DeMillie,

3

Em memória Dennis M. Ritchie

unix 57¹ 72:

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

assumindo que i é o arquivo, contendo as entradas.

Was) estava errado, incluiu o número de linhas e adicionou 1 linha a menos.

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

(espaços extras para maior clareza, pois não contam)

Haskell é ... interessante, pois você tende a obter programas com um número significativo de espaços necessários.


2
Você esqueceu um 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; }

Após outro grande esforço, o código tem um caractere a menos, por favor, ajude-me a reduzi-lo mais.


6
basta editar a resposta original próxima vez
aberração catraca

remover o ( return 0;) e ( {}para 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: eles usaram o fato de que o parâmetro "argc" foi definido como 1, seu b não foi inicializado ...
VX

2

Befunge-98 (24)

(Certifique-se de usar um intérprete que possa ler números negativos (parece ser um bug um tanto comum, mas o RcFunge funciona))

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

Perl (25)

(O Perl permite caracteres de controle em nomes de variáveis, nomeei minha variável ^ B (ASCII 2) para que não conte para o objetivo.)

<>; $ ^ B + = $ _ *! / - / para <>; imprime $ ^ B

(Variante normal (27 caracteres)):

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

i primeiro ignorou sua resposta perl quando vi a nomenclatura de variáveis e completamente perdido o excelente que está abaixo dela
ardnew

2

APL (10)

+/{0⌈⎕}¨⍳⎕

Explicação:

  • ⍳⎕: lê uma linha, fornece uma lista [1..N] para a entrada do usuário N
  • ¨: para cada elemento nesta lista ... (ou seja, N vezes)
  • 0⌈⎕: leia uma linha, retorne o máximo de 0 e o N inserido
  • Agora temos uma lista com todos os Ns positivos inseridos pelo usuário e 0s em que o usuário inseriu algo negativo.
  • +/ dá a soma desta lista.
  • O resultado é produzido por padrão (porque não estamos fazendo mais nada com ele).

2

Mathematica: 18 16

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

Função agradável, mas como isso lida com a entrada separada por nova linha especificada? Como ele não incorpora o número de casos de teste, parâmetro t, como parte da soma? Como isso soma apenas o número de casos de teste especificado, mesmo que mais sejam fornecidos?
Jonathan Van Matre

1

PowerShell, 44

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

1

Q, 12

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

uso de amostra

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

1

befunge, 35 24

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

com um pouco de inspiração ao ver a resposta de marinus, também consegui 24 caracteres. mas eu tenho uma abordagem completamente diferente.


1

PYTHON 2.x, 50 caracteres

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

1

C, 70 72 caracteres

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

Os resultados no site do SPOJ definitivamente parecem irreais - não tenho idéia de como reduzir isso para 63.

No entanto, 68 caracteres são acessíveis em alguns compiladores, abusando de comportamentos indefinidos. O seguinte funciona no Linux x86 com gcc de 32 bits, no qual todos os argumentos são transmitidos na pilha.

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

contar t em A1, restante dos dados a2 e abaixo


1

Clojure, 108

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

Eu realmente gostaria de poder evitar a java.io.BufferedReader.peça, uma vez que custa 24 caracteres. Mas o AFAIK não tem a possibilidade de ler linhas do STDIN sem ele.


1

Perl, 20

Eu sei que é antigo e trivial, mas a resposta Perl ainda pode ser melhorada:

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

Isso é incrível! Mas o que }{significa / faz?
Daniero 19/07/2015

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 caracteres. Precisa otimizá-lo para 90. Alguma sugestão?


2
Apenas os truques padrão: o retorno é desnecessário no padrão C ++ ou C99, há um implícito return 0no main. Ao tornar as variáveis ​​globais, você pode descartar a =0inicialização. Finalmente, for(;;)é o mesmo número de caracteres while(), mas você tem dois lugares extra para colocar uma expressão no.
han

Isso já é antiga, mas também, escrevendo std::antes cine coute livrar-se do using namespace std;pode salvar mais 5 caracteres.
Morwenn

0

PHP, 71

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

0

Python: (92 caracteres)

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

Usar a=raw_inpute r=rangee usar a()e r()mais tarde podem salvar alguns caracteres.
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
Bem-vindo ao CodeGolf.SE! Se você olhar para a outra resposta, verá que elas possuem código formatado e um cabeçalho mínimo, observando a linguagem de implementação; Em desafios mais complicados, muitos também têm notas sobre a implementação e quaisquer limites ou surpresas no código. Sem isso, é improvável que você responda bem.
dmckee --- gatinho ex-moderador

Contei os caracteres, adicionei o recuo para fazer o layout do código funcionar e removi a decoração da saída. Oh - agora tenho que contar novamente. :)
usuário desconhecido

Nome do idioma adicionado. Há muito espaço para reduções aqui - sumpode ser reduzido a s, a cadeia de saída pode ser apenas "%d", etc.
Gareth


0

45 caracteres em python

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

1
Como você contou isso? Isso me dá 54 caracteres.
Manatwork

@manatwork, esta pergunta tem regras de pontuação não padronizadas que não contam com espaço em branco.
Peter Taylor

OPA, desculpe. Eu senti falta disso. Obrigado, @ PeterTaylor.
Manatwork
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.