Additionnez les chiffres sur la norme en


32

Considérez un flux / fichier avec un entier par ligne. Par exemple:

123
5
99

Votre code doit afficher la somme de ces nombres, c'est-à-dire 227.

Le format d'entrée est strictement un entier par ligne. Vous ne pouvez pas, par exemple, supposer que l'entrée se trouve sur une seule ligne sous la forme d'un tableau d'entiers.

Vous pouvez saisir des données soit de STDIN, sous la forme d'un nom de fichier, soit d'un fichier avec un nom de votre choix; vous pouvez choisir lequel. Aucun autre moyen d'obtenir des entrées n'est autorisé.

L'entrée contiendra au moins un entier. Vous pouvez supposer que tous les entiers sont non négatifs et que leur somme totale est inférieure à .232


2
Y a-t-il une nouvelle ligne de fuite? Cette nouvelle ligne est-elle facultative?
Arrêtez d'être méchant

9
Salut! J'ai rétrogradé ce défi car il va à l'encontre des normes de notre communauté pour les formats d'entrée / sortie acceptables en ayant un format d'entrée restrictif.
AdmBorkBork

1
@AdmBorkBork et moi en avons discuté longuement dans la salle de chat. Nous avons convenu d'être en désaccord :)

22
En tant qu'auteur des choses à éviter de la lourdeur des E / S et de la neutralisation arbitraire des défauts , je souhaite défendre cette contestation pour ces motifs. Ici, l'entrée de traitement est la viande du défi, pas un travail supplémentaire qui distrait du défi principal. Ce n'est pas «ajouter des numéros» avec des exigences d'E / S étranges, c'est «faire ces E / S» avec l'ajout comme étape. La neutralisation des E / S standard est nécessaire pour que les réponses ne raccourcissent pas la tâche principale.
xnor

2
Pourquoi l'entrée de fonction ne peut-elle pas être utilisée?
CalculatorFeline

Réponses:


15

05AB1E , 2 octets

|O

Explication:

|   Get input as array
 O  Sum

Essayez-le en ligne!


7
C'est ridicule :)

Est-ce que cela se lit à partir de la norme?

1
@Lembik c'est le cas.
2017 à 8h38

Je crois que votre réponse de 2 octets était la première. Tu es le vainqueur! (Sauf si quelqu'un trouve une réponse de 1 octet.)

4
@Lembik Ou une réponse de 0 octet ....
Camarade SparklePony

21

Bash + coreutils, 16 octets

xargs|tr \  +|bc

Essayez-le en ligne!

Il y a deux espaces après le \. Cela fonctionne également pour les nombres négatifs.

Explication:

xargs             # known trick to turn newlines into spaces, while adding a
                  #trailing newline when printing the result (needed for bc)
|tr \  +          # turn spaces into '+'s
|bc               # calculates the sum

Vous vous demandez peut-être pourquoi ce tr \\n +|bcn'est pas mieux, car il transforme directement les sauts de ligne en «+». Eh bien, cela a 2 erreurs imprévues:

  • si l'entrée a un retour à la ligne final, alors il est converti en un «+» final, donc il n'y a pas de numéro après pour effectuer l'addition
  • et le problème le plus étrange est que bc nécessite un retour à la ligne après l'entrée, mais vous venez de remplacer tous les retours à la ligne d'entrée par des «+».

1
J'aime ça. C'est sympa et intelligent.

Pourriez-vous utiliser tr \\ n + à la place sans xargs?

1
@Lembik Voulez-vous dire tr \\n +|bc? Si tel est le cas, veuillez consulter l'explication mise à jour. Bonne question.
seshoumara

paste -s -d+|bcest de 15 octets
David Conrad

1
@Lembik N'a pas considéré ce cas, mais heureusement, le script fonctionne toujours. xargs|tr \ +dans ce cas, ne fait rien et bc reçoit le numéro et l'imprime à nouveau.
seshoumara

14

MATL , 2 octets

Us

Cela attend l'entrée dans un fichier texte appelé defin.

Gif ou ce n'est pas arrivé :

entrez la description de l'image ici

Ou essayez-le en ligne! ( merci à Dennis pour la mise en place! )

Explication

Lorsqu'un programme MATL est exécuté, si un fichier appelé definest trouvé (le nom fait référence à "entrée par défaut"), son contenu est automatiquement chargé sous forme de texte et poussé vers la pile sous forme de chaîne avant d'exécuter le code.

La fonction Uévalue la chaîne pour la convertir en un vecteur de colonne de nombres et scalcule la somme, qui est implicitement affichée.


13

Japt , 2 octets

Nx

Explication

     Implicit: parse STDIN into array of numbers, strings, and arrays
N    Get the resulting parsed array.
 x   Sum.
     Implicit: output result of last expression

Essayez-le en ligne!


12

Coller + bc, 13 octets

paste -sd+|bc

Explication:

paste -s        Take one line at a time from input
        d+      Joining by '+'
          |bc   Pass as expression to bc

Une autre réponse shell!


1
Très soigné et bien rangé.

Ooh, j'avais paste -s -d+|bcet ne savais pas que je pouvais consolider les commutateurs. Soigné!
David Conrad

12

Perl 6 , 13 octets

say sum lines

L'essayer

Explication

  • lines()renvoie une liste de lignes $*INou $*ARGFILESun descripteur de ligne de commande «magique».
  • sum(…)a été ajouté à Perl 6 pour permettre [+] Listd'être optimisé pour les positionnels qui peuvent calculer leur somme sans générer toutes leurs valeurs comme 1..100000
    (je pensais juste que sumc'était trop mignon ici pour l'utiliser [+]comme je le ferais normalement)
  • say(…)appeler la .gistméthode sur son entrée et l'imprimer avec une nouvelle ligne supplémentaire.

Qu'est-ce que Perl 5?

15
cela ressemble à lolcode
Bryan Boettcher

@Lembik est clairement étiqueté comme Perl 6 , qui est une langue sœur de Perl 5 .
Brad Gilbert b2gills du

Il y avait une faute de frappe. Je veux dire qu'est-ce que c'est en Perl 5?

1
Fonctionne bien $a+=$_ for <>;print $aen Perl 5, mais il peut y avoir un chemin plus court.
Brad Gilbert b2gills

10

C, 53 octets

r;main(i){for(;~scanf("%d",&i);r+=i);printf("%d",r);}

C montrant à nouveau ses informations d'identification :)

2
Je pense qu'il devrait y avoir un chemin plus court, mais je ne le vois pas :)
Digital Trauma


9

Rétine , 11 7 octets

-4 merci à Martin Ender

.*
$*
1

Essayez-le en ligne!


Convertir en unaire:

.*
$*

Comptez le nombre de 1s:

1

1
Intéressant de voir comment Retina, en tant que langage basé sur l'expression régulière, peut faire la somme en moins d'octets que la réponse bash la plus courte publiée jusqu'à présent. +1
seshoumara

Cette lecture de la norme est-elle en?

2
@Lembik Oui, c'est ça.
Riley

Si l'entrée dans unaire était autorisée, ce ne serait qu'un octet.
mbomb007

@ mbomb007 J'ai déjà essayé ça dans sed.
Riley

8

Brain-Flak , 20 octets

(([]){[{}]{}([])}{})

Essayez-le en ligne!

Explication

Ceci est un golf hors d' une solution faite par Riley dans le chat . Sa solution était:

([])({<{}>{}<([])>}{})

Si vous êtes familier avec Brain-Flak, cela va de soi. Il pousse la hauteur de la pile et affiche une valeur pendant le décompte, à la fin, il pousse la somme de tous les passages.

C'est un très bon golf mais il met les deux à zéro {}et ([])cependant ceux-ci auront des valeurs qui ne diffèrent que par un, donc si à la place nous retirons les masques et rendons l'un des deux négatifs, ils devraient presque annuler.

([])({[{}]{}([])}{})

Puisqu'ils diffèrent toujours par un, nous avons la malheureuse circonstance où notre réponse est toujours décalée par la hauteur de la pile. Pour y remédier, il suffit de déplacer le début de la poussée pour englober la première hauteur de pile.

(([]){[{}]{}([])}{})

1
Je pensais à cela comme le pop négatif annule la hauteur précédente poussée (d'avant la boucle, ou la fin du temps précédent), et la dernière hauteur est 0, donc elle peut être ignorée.
Riley

8

Python 2, 40 octets

import sys;print sum(map(int,sys.stdin))

7

R, 11 octets

sum(scan())

scanprend l'entrée, un nombre par ligne. Et sumbien, des sommes.


7

Perl 5 , 9 octets

8 octets de code + -pindicateur.

$\+=$_}{

Essayez-le en ligne!

Avec -p, l'entrée est lue une ligne à la fois, stockée à $_chaque fois. Nous utilisons $\comme accumulateur, car grâce au -pdrapeau, il est implicitement imprimé à la fin. Les éléments inégalés }{sont utilisés de sorte que le -pdrapeau ne s'imprime qu'une $\fois à la fin au lieu d'imprimer $_et $\à chaque ligne, il se lit comme d' habitude .


Je ne peux même pas l'analyser! :) Explication s'il vous plaît.

@Lembik C'est parti.
Dada

La partie parenthèse inégalée est très obscure!

@Lembik Ce ne sont pas parenthesizes ... Ils sont soit français ou bouclés Accolades dépend de qui vous demandez, mais ils ne sont certainement pas)(
CraigR8806

1
@Lembik accolades, apparemment.
Michael Vehrs

7

Pure Bash, 37 36 octets

Merci à @KevinCruijssen pour un octet!

while read a;do((b+=a));done;echo $b

Essayez-le en ligne!


3
Très agréable et propre.

Je ne programme jamais en Bash , mais n'est-il pas possible de supprimer l'espace entre les deux do ((? Le TIO semble fonctionner.
Kevin Cruijssen

@KevinCruijssen Oui, il semble que cela fonctionne. J'utilise zsh comme shell quotidien et cela ne fonctionne pas dans zsh sans espace, j'ai juste supposé que cela ne fonctionnerait pas dans Bash mais apparemment c'est le cas.
betseg

6

Haskell, 32 octets

interact$show.sum.map read.lines

Essayez-le en ligne! .

interactcollecte l'intégralité de l'entrée de stdin, la transmet à la fonction donnée comme argument et affiche la chaîne qu'il récupère de cette fonction. La fonction est:

            lines   -- split input into list of lines at nl
      map read      -- convert every line to a number (read is polymorphic,
                    -- but as want to sum it later, the type checker knows
                    -- it has to be numbers)
    sum             -- sum the list of numbers
show                -- convert back to string

1
Cela me fait vraiment aimer Haskell. Dans Scala, je dois le faire lines.map(_.toInt) car sum attend une sorte de conversion implicite numérique de String ou dans ce cas une conversion explicite.
Stefan Aleksić

6

PHP, 22 octets

<?=array_sum(file(t));

Cela suppose qu'il existe un fichier nommé "t" avec une liste d'entiers.

file()ouvre un fichier et renvoie un tableau avec chaque ligne stockée un élément séparé dans le tableau. array_sum()additionne tous les éléments d'un tableau.


5

Awk, 19 octets

{s+=$1}END{print s}

Explication:

{s+=$1}                For all lines in the input, add to s
        END             End loop
           {print s}    Print s

1
"Explication coming soon ™" Ce serait mon nouveau slogan si ce n'était pas une marque déposée ...
ETHproductions

2
Dans la langue de awk, votre réponse n'est en fait que de 19 octets: {s+=$1}END{print s}:)
Digital Trauma

5

dc , 14 octets

0[+?z2=a]dsaxp

Essayez-le en ligne!

Explication:

 [      ] sa   # recursive macro stored in register a, does the following:
  +            # - sum both numbers on stack
               #   (prints to stderr 1st time since there's only 1)
   ?           # - read next line, push to stack as number
    z          # - push size of stack
     2         # - push 2
      =a       # - if stack size = 2, ? yielded something, so recurse
               # - otherwise end macro (implicit)
0              # push 0 (accumulator)
         d     # duplicate macro before storing it
            x  # Call macro
             p # The sum should be on the stack now, so print it

4

CJam , 5 octets

q~]1b

Essayez-le en ligne!

Comment ça marche

q     e# Read all input from STDIN.
 ~    e# Evaluate that input, pushing several integers.
  ]   e# Wrap the entire stack in an array.
   1b e# Convert from base 1 to integer.
      e# :+ (reduce by sum) would work as well, but 1b handles empty arrays.

Comment fait la 1bsomme des nombres?
Esolanging Fruit

CJam ne nécessite pas de représentation canonique pour la conversion des chiffres en nombres entiers; [<x> <y> <z> <w>]<b>bcalcule simplement b³x + b²y + bz + w . Lorsque b = 1 , cela donne x + y + z + w .
Dennis

4

Python, 38 30 octets

lambda n:sum(map(int,open(n)))

En python, les fichiers sont ouverts par open('filename')(évidemment). Ce sont cependant des itérables. Chaque fois que vous parcourez le fichier, vous obtenez la ligne suivante. La carte itère donc sur chaque liste, l'appelle int, puis additionne la liste résultante.

Appelez avec le nom de fichier en entrée. (ie f('numbers.txt'))

8 octets enregistrés en utilisant map(int, open(n))au lieu d'une compréhension de liste. Code d'origine:

lambda n:sum([int(i)for i in open(n)]) 

1
Je crois que vous pouvez également le faire avec une entrée standard en appelant «open (0)». Je ne sais pas si cela peut être utilisé pour raccourcir votre réponse.
cole

@Cole dennis a déjà cette solution, je vais donc laisser ma réponse comme ça.
Rɪᴋᴇʀ

Mon erreur, désolé pour ça; Je n'ai pas lu tout le long avant d'arriver à votre réponse.
cole

@Cole ça va, ça ne me dérange pas.
Rɪᴋᴇʀ

4

Mathematica, 19 octets

Suppose l'environnement de bloc-notes de Mathematica.

Tr[#&@@@Import@"a"]

Attend que l'entrée soit dans un fichier a.


C'est une langue folle :)

4
Les gens normaux de @Lembik écriraient ceci de façon très lisible comme Total @ Flatten @ Import @ "a"ou même "a" // Import // Flatten // Total. ;)
Martin Ender

Ne serait pas Tr[#&@@@Import@#]&également autorisé?
ngenisis

4

Gelée , 9 8 octets

ƈFпFỴVS

STDIN n'est pas vraiment le truc de Jelly ...

Essayez-le en ligne!

Comment ça marche

ƈFпFỴVS  Main link. No arguments. Implicit argument: 0

  п      While loop; while the condition returns a truthy value, execute the body
          and set the return value to the result. Collect all results (including 0,
          the initial return value) in an array and return that array.
ƈ           Body: Yield a character from STDIN or [] if the input is exhausted.
 F          Condition: Flatten, mapping 0 to [], '0' to "0", and [] to [] (falsy).
    F     Flatten the result.
     Ỵ    Split at newlines.
      V   Evaluate the resulting strings.
       S  Take the sum.

1
La seconde Fpourrait aussi être un , pour plus de clarté.
Erik the Outgolfer


4

Pure bash, 30

read -d_ b
echo $[${b//'
'/+}]

Essayez-le en ligne.

  • reads le fichier d'entrée en une seule fois dans la variable b. -d_indique readque le délimiteur de ligne est _au lieu denewline
  • ${b//'newline'/+}remplace les sauts de ligne bavec+
  • echo $[ ... ] évalue arithmétiquement l'expression résultante et la renvoie.

+1 Très sympa. La nouvelle ligne de fin d'un fichier d'entrée est-elle également lue? Je demande parce que s'il est remplacé par «+», la $[]section affichera une erreur en raison d'un «+» de fin.
seshoumara

@seshoumara Il semble que les readdernières lignes finales soient ignorées , même si le délimiteur de ligne est remplacé par _. C'est peut-être une mise en garde read, mais cela fonctionne bien pour cette situation.
Digital Trauma

Je suis toujours heureux de voir une pure solution bash.

3

Vim, 16 octets / touches

:%s/\n/+
C<C-r>=<C-r>"<C-h>

Étant donné que V est rétrocompatible, vous pouvez l' essayer en ligne!


S'agit-il de la lecture de la norme dans ou d'un fichier?

Ouais, Vim pourrait ne pas être autorisé ... :(
CalculatorFeline


3

jq , 5 octets

add, plus l'indicateur de ligne de commande -s.

Par exemple:

% echo "1\n2\n3\n4\n5" | jq -s add
15

6 octets . Puisque -saddne fonctionnera pas, comptez l'espace.
agc

@agc Corrigez-moi si je me trompe mais le code lui-même est add(3 octets) et vous devez ajouter 2 octets pour l' -sindicateur. L'espace ne compte pas comme le code ou le drapeau: c'est le séparateur de ligne de commande utilisé par le langage.
caird coinheringaahing

1
@ThisGuy, Eh bien, l' -sindicateur est l'abréviation de " --slurp " (lire le flux d'entrée entier dans un grand tableau et exécuter le filtre une seule fois), ce qui change à la fois la façon dont jqles données d'entrée sont interprétées et la façon dont il exécute le code. Ce n'est pas comme le -edans sedlequel indique simplement sedque la chaîne suivante est du code. Le -sest plus comme une partie du jqlangage lui-même, et donc cet espace de 6 octets le serait aussi.
agc

3

En fait , 2 octets

Essayez-le en ligne!

Explication:

kΣ
    (implicit input - read each line, evaluate it, and push it to the stack)
k   pop all stack elements and push them as a list
 Σ  sum
    (implicit output)

3

dc, 22

[pq]sq0[?z2>q+lmx]dsmx

Cela semble plus long qu'il ne devrait l'être, mais il est difficile de décider quand la fin du fichier est atteinte. La seule façon de penser à cela est de vérifier la longueur de la pile après la ?commande.

Essayez-le en ligne .

[pq]                    # macro to `p`rint top-of-stack, then `q`uit the program
    sq                  # save the above macro in the `q` register
      0                 # push `0` to the stack.  Each input number is added to this (stack accumulator)
       [         ]      # macro to:
        ?               # - read line of input
         z              # - push stack length to stack
          2             # - push 2 to the stack
           >q           # - if 2 > stack length then invoke macro stored in `q` register
             +          # - add input to stack accumulator
              lmx       # - load macro stored in `m` register and execute it
                  d     # duplicate macro
                   sm   # store in register `m`
                     x  # execute macro

Notez que la macro mest appelée récursivement. Modern dcimplémente la récursivité de queue pour ce genre de chose, donc il ne devrait pas y avoir de soucis pour déborder la pile.


Bienvenue chez PPCG! Veuillez noter que s'il n'y a pas suffisamment d'explications, il passera par le filtre des messages de faible qualité .
Matthew Roh

@SIGSEGV aucun accueil nécessaire - je suis ici depuis un moment ;-). Oui, j'écrivais mon explication pendant que vous commentiez. Voir modifier.
Digital Trauma

1
Je vous dois un octet pour l'astuce de duplication de la macro avant de la stocker.
Brian McCutchon

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.