Suma de enteros positivos. [cerrado]


14

Problema:

Dado un conjunto de enteros, encuentre la suma de todos los enteros positivos en él.

Entrada:

  • t - número de casos de prueba [ t <1000]
  • En cada una de las siguientes líneas t , un número entero N [-1000 ≤ N ≤ 1000]

Salida

El programa debería generar la suma de todos los enteros positivos.

Revise su código en juez en línea

Puntuación

La puntuación es igual al tamaño del código fuente de su programa, excepto los símbolos con código ASCII ≤ 32.

Aquí está la mejor lista de puntajes: Python Best Scores (Best score is 29)


13
Hay muchos más desafíos de codegolf en spoj.pl/SHORTEN . Sin embargo, no veo el punto de duplicarlos aquí.
hallvabo

3
¿Por qué esta pregunta está etiquetada como Python? ¿Estamos interesados ​​solo en la solución Python?
Aman ZeeK Verma

24
No creo que las preguntas de los sitios de concursos se publiquen aquí.
fR0DDY

2
Ya hice este en SPOJ. Hace un tiempo promocionaron todas las respuestas de Python2.6 a Python3 a pesar de que algunas de ellas no se ejecutarían en Python3 y serían más largas en Python3; por ejemplo, deben usar int (input ()) en lugar de input () e imprimir (x) en su lugar de impresión x. Así que ya no tomo SPOJ muy en serio. Estoy empatado con Tim Peters y eso es lo suficientemente bueno para mí :)
gnibbler

44
Solo quiero señalar que omitir el T(número de ... errr ... números (?)) No es una opción ... ya que los casos de prueba involucran datos adicionales después de los Tnúmeros ... su código fallará en SPOJ. Todos (3 respuestas a continuación) parecían haber omitido hábilmente el primer entero.
st0le

Respuestas:


34

Espacio en blanco, 0

No pude resistirme. S= espacio, T= tabulación, N= nueva línea, todos tienen códigos ASCII <= 32.

SSSSNSSSSNTTSSSSSTNTNTTNSSSNSSSSTNTTTNTSTNSSSSTNSSSSTNTTTSSSSTNTSSTTTSSSSSTSNTNTTSSSSTSNTTTNTTSNSSSSNSSSSTSNTTTSSSSNTTTTSSSTTSNSNSNNSSTNSSSSNTTTTNSTSSSSTSTSNTNSSNNN

Base64 codificada para copiar y pegar fácilmente.

ICAgIAogICAgCgkJICAgICAJCgkKCQkKICAgCiAgICAJCgkJCQoJIAkKICAgIAkKICAgIAkKCQkJ
ICAgIAkKCSAgCQkJICAgICAJIAoJCgkJICAgIAkgCgkJCQoJCSAKICAgIAogICAgCSAKCQkJICAg
IAoJCQkJICAgCQkgCiAKIAoKICAJCiAgICAKCQkJCQogCSAgICAJIAkgCgkKICAKCgo=

3
(+1) ¡Buen programa! Un pequeño "FWIW": se pueden eliminar 9 caracteres debido a 9 instancias innecesarias Sen la codificación binaria de un número. Estas son todas las instrucciones en push-número-de la pila de la forma SSSS...N, donde el 4º Scódigos superflua 0 inicial (Por supuesto esto no tiene ningún efecto sobre la puntuación.)
res

13

Elemento, 17 caracteres más 1 espacio

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

Este es mi primer lenguaje construido. Está diseñado para ser muy compacto y legible para los humanos. Todas las instrucciones son de un solo carácter y realizan una sola función.

Element tiene dos pilas y un hash como estructuras de memoria. Las dos pilas se denominan pila principal y pila de control. La pila principal es donde se produce la aritmética, E / S y manipulación de hash. La pila de control es donde ocurren las operaciones lógicas, y esta pila controla los bucles while y for.

La idea básica detrás de Element es que hay un hash que almacena números / cadenas, mientras que la pila se usa para realizar cálculos sobre estos números. Los resultados de estos cálculos se pueden asignar a un lugar determinado en el hash para uso futuro. Los diferentes contenidos del hash se denominan elementos, por lo que es similar a una matriz pero puede tener nombres no numéricos.

EDITAR: Puede encontrar un intérprete para Element (escrito en Perl) aquí .

Aquí está la lista de operadores: en algunos de estos ejemplos, myn representan números que ya están en la pila.

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 \

Aquí hay un tutorial sobre cómo funciona el programa:

_'[    --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

66
Una entrada como esta mejoraría mucho con un puntero a un entorno de trabajo.
dmckee --- ex-gatito moderador

55
No creo que entiendas lo que significa "legible por humanos".
wchargin

3
@WChargin está acostumbrado a Perl ...
Caridorc

@WChargin Cada idioma es ilegible hasta que lo aprenda. ;)
Martin Ender

8

Perl, 31

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

¿No usaría sayhacer esto un poco más corto? Se vincularía con los 29 personajes mejor.
Sr. Llama

No, porque sayno está integrado y (al menos) requiere un cambio de línea de comando que contaría para el recuento de caracteres.
Timwi

Se puede acortar a 29 bytes usando en $\ lugar de $i:<>;$\+=$_*($_>0)while<>;print
Heiko Oberdiek

5

Ruby 1.9.2, 37

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

Llame como ruby ​​scriptname file_with_ints.


No puedo leer mucho Ruby, pero ¿eso incluso lee el número de casos de prueba?
Joey

No, no lo hace ...
st0le

@ st0le: Acabo de notar que aparentemente ninguna solución actualmente resuelve la tarea.
Joey


5

Haskell, 58

Funciona correctamente solo con tenteros. No lo he enfrentado a Spoj porque no me importa registrarme allí.

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

¿Qué son los " tenteros"?
wchargin

4

código en 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; }

Intenté mucho reducir mi código a menos de 63 bytes, pero solo puedo reducirlo a 89 bytes. Ayúdame a reducirlo a 63 bytes o incluso menos.


1) He contado 90 caracteres. 2) return 0;no es necesario, el forciclo se puede contraer a for(scanf(x,&t);t--;scanf(x,&a),a>0?b+=a:a);==, lo que hace que 78 caracteres ...
VX

No compila con 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

Aunque el espacio es necesario, parece extraño no contarlo. Oh bueno, las reglas son las reglas.

Hmm Probablemente podría salirse con la suya usando un nombre de variable que tampoco cuenta para el total. La cuestión es que no estoy seguro de cómo pegaría el código entonces.


Simplemente muéstrelos como $ ^ A - $ ^ Z, pero tenga en cuenta que muchas de esas variables tienen significados especiales.
ninjalj

3

Clojure, 71

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

Esto no produce ningún resultado y falla porque *in*no es un java.io.BufferedReader, como lo requiere line-seq.
John Cromartie

También ignora el número de líneas de entrada 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))

suponiendo que i es el archivo que contiene los ints.

¹) estaba equivocado, incluyó el número de líneas y agregó 1 línea demasiado 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

(espacios adicionales para mayor claridad, ya que no cuentan)

Haskell es ... interesante, ya que tiendes a obtener programas con un número significativo de espacios necesarios.


2
Olvidaste a 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; }

Después de otro gran esfuerzo, el código es un carácter menos, por favor ayúdame a reducirlo más.


66
solo edite la respuesta original la próxima vez
ratchet freak

eliminar el ( return 0;) y ( {}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: utilizaron el hecho de que su parámetro como "argc" se estableció en 1, su b no está inicializada ...
VX

2

Befunge-98 (24)

(Asegúrese de usar un intérprete que pueda leer números negativos (parece ser un error algo común, pero RcFunge funciona))

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

Perl (25)

(Perl permite caracteres de control en los nombres de las variables, puse el nombre de mi variable ^ B (ASCII 2) para que no cuente para el objetivo).

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

(Variante normal (27 caracteres)):

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

La primera vez que ignoraba su respuesta Perl cuando vi la variable de nomenclatura y se perdió por completo el excelente debajo de ella
ardnew

2

APL (10)

+/{0⌈⎕}¨⍳⎕

Explicación:

  • ⍳⎕: lee una línea, da una lista [1..N] para la entrada del usuario N
  • ¨: para cada elemento de esta lista ... (es decir, hacer N veces)
  • 0⌈⎕: lee una línea, devuelve el máximo de 0 y el N introducido
  • Ahora tenemos una lista con todas las N positivas que ingresó el usuario y 0s donde el usuario ingresó algo negativo.
  • +/ da la suma de esta lista.
  • El resultado se genera de forma predeterminada (porque no estamos haciendo nada más con él).

2

Mathematica: 18 16

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

Buena función, pero ¿cómo maneja esto la entrada separada por nueva línea especificada? ¿Cómo no incorpora el número de casos de prueba parámetro t como parte de la suma? ¿Cómo suma solo el número de casos de prueba especificados, incluso si se dan más?
Jonathan Van Matre

1

PowerShell, 44

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

1

Q, 12

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

uso de muestra

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

1

befunge, 35 24

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

con un poco de inspiración al ver la respuesta de marinus, también he logrado 24 personajes. Pero tengo un enfoque 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);}

Los resultados en el sitio de SPOJ definitivamente parecen irreales, no tengo idea de cómo reducir esto a 63.

Sin embargo, 68 compiladores son accesibles en algunos compiladores al abusar del comportamiento indefinido. Lo siguiente funciona en Linux x86 con gcc de 32 bits, en el que todos los argumentos se pasan en la pila.

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

cuenta t en A1, resto de datos a2 y hacia abajo


1

Clojure, 108

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

Realmente desearía poder evitar la java.io.BufferedReader.parte, ya que cuesta 24 caracteres en sí. Pero AFAIK no hay facilidad para leer líneas de STDIN sin él.


1

Perl, 20

Sé que es antiguo y trivial, pero la respuesta de Perl todavía se puede mejorar:

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

¡Esto es asombroso! Pero, ¿qué }{significa / hacer?
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 caracteres de largo. Necesita optimizarlo a 90. ¿Alguna sugerencia?


2
Solo los trucos estándar: el retorno es innecesario en C ++ estándar o C99, hay una implícita return 0en main. Al hacer que las variables sean globales, puede descartar la =0inicialización. Finalmente, for(;;)es el mismo número de caracteres que, while()pero obtienes dos lugares adicionales para poner una expresión.
Han

Esto ya es viejo, pero también, escribir std::antes ciny coutdeshacerse de él using namespace std;puede salvar 5 caracteres más.
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_inputy r=rangey usar a()y r()más tarde puede guardar bastantes 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
Bienvenido a CodeGolf.SE! Si observa la otra respuesta, verá que tienen código formateado y un encabezado mínimo que indica el lenguaje de implementación; En desafíos más complicados, muchos también tienen notas sobre la implementación y cualquier límite o sorpresa en el código. Sin algo de esto, es poco probable que su respuesta sea bien recibida.
dmckee --- ex gatito moderador

Conté los caracteres, agregué la sangría para que el diseño del código funcionara y eliminé la decoración de la salida. Oh, ahora tengo que contar de nuevo. :)
usuario desconocido el

Nombre de idioma agregado. Aquí hay mucho espacio para las reducciones: sumpuede reducirse a s, la cadena de salida puede ser "%d", etc.
Gareth


0

45 caracteres en python

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

1
¿Cómo contabas eso? Me da 54 caracteres.
manatwork el

@manatwork, esta pregunta tiene reglas de puntuación no estándar que no cuentan espacios en blanco.
Peter Taylor

Ups, lo siento. Me lo perdí. Gracias, @PeterTaylor.
manatwork el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.