Input/Output for pairs of numbers
From lines of input starting with a line containing the numbers of pairs to follows, followed by that number of pairs of integers separated by a space on separate lines from STDIN, output the sum of each pair to STDOUT.
- Sample input with corresponding output
Input
5 1 2 10 20 -3 5 100 2 5 5
Output
3 30 2 102 10
ALGOL 68
Simple version - there can be newlines before or between the numbers <lang algol68># read a number from stand in then read and add that many pairs of numbers from stand in #
- and write the sum to stand out. If non integer data is supplied, a runtime error will occur #
TO ( INT n; read( ( n, newline ) ); n ) DO
INT a, b; read( ( a, b, newline ) ); print( ( a + b, newline ) )
OD </lang> Strict version - the pairs of numbers must appear on the same line. <lang algol68>
- read a number from stand in then read and add that many pairs of numbers from stand in #
- and write the sum to stand out. If non integer data is supplied, a runtime error will occur #
- This version does not allow the pairs of numbers to be spread over several lines #
STRING line; FILE numbers; associate( numbers, line ); TO ( INT n
; read( ( line, newline ) ) ; reset( numbers ) ; get( numbers, ( n ) ) ; n )
DO
INT a, b; read( ( line, newline ) ); reset( numbers ); get( numbers, ( a, b ) ); print( ( a + b, newline ) )
OD</lang>
- Output:
+3 +30 +2 +102 +10
AWK
<lang awk>NR == 1 {n=$1; next} NR > n+1 {exit} {print $1+$2}</lang>
C
<lang C>#include <stdio.h>
- include <stdlib.h>
int main(void) { int i, n, a, b, *f; scanf("%d", &n); f = malloc(sizeof(*f) * n);
for (i = 0; i < n; i++) { if (2 != scanf("%d %d", &a, &b)) abort(); f[i] = a + b; }
for (i = 0; i < n; i++) printf("%d\n", f[i]);
return 0; }</lang>
Output for example input
3 30 2 102 10
C++
Modified in order to take in all inputs and then give the output, the original gave the output for each pair immediately. <lang cpp> /*Modified by Abhishek Ghosh, 19th March 2014, Rotterdam*/
- include <iostream>
using namespace std;
int doStuff(int a, int b) {
return a + b;
}
int main() {
int t, **list;
cin >> t;
list = new int*[t];
for(int j=0; j<t; j++){
list[j] = new int[2]; cin >> list[j][0]>> list[j][1];
}
cout << endl;
for(int j=0;j<t;j++){ cout << doStuff(list[j][0], list[j][1]) << endl;; } return 0; } </lang>
Run as per given input
5 1 2 10 20 -3 5 100 2 5 5 3 30 2 102 10
D
This works with any number of integers on lines. <lang d>void main() {
import std.stdio, std.string, std.conv, std.algorithm;
foreach (immutable _; 0 .. readln.strip.to!uint) readln.split.to!(int[]).sum.writeln;
}</lang>
Fortran
<lang fortran>program i_o_pairs
implicit none
integer :: npairs integer :: i integer, allocatable :: pairs(:,:)
read(*,*) npairs allocate(pairs(npairs,2)) do i = 1, npairs read(*,*) pairs(i,:) end do write(*, "(i0)") sum(pairs, 2)
end program</lang>
Haskell
This solution will actually add any number of integers placed on each line. Additionally, after removing the bits of code that cut out the specified number of lines, the solution will sum any number of lines of integers.
<lang Haskell>main = do
contents <- getContents let numberOfLines = read.head.lines$ contents nums = map (map read.words).take numberOfLines.tail.lines$ contents sums = map sum nums mapM_ print sums</lang>
Go
<lang go>package main
import ( "fmt" "log" )
func main() { var lines int n, err := fmt.Scanln(&lines) if n != 1 || err != nil { log.Fatal(err) }
var a, b int for ; lines > 0; lines-- { n, err = fmt.Scanln(&a, &b) if n != 2 || err != nil { log.Fatal(err) } fmt.Println(a + b) } }</lang>
J
<lang J> $ cat <<EOF | jconsole -js '([: exit 0: [: smoutput [: ,. [: ({. {. }.) [: (+/"1) [: (0&".;._2) (1!:1)) 3' > 5 > 1 2 > 10 20 > -3 5 > 100 2 > 5 5 > EOF
3 30 2
102
10
</lang> Considerably simpler than [explanation] output for lines of text, this sentence is a single fork. J pads the numeric arrays of 0&".;._2 (numbers cut) with 0 . We form the +/"1 (row sums), then take the sum of the first row of the beheaded sums ({. {. }.) for display. ,. (raveled items) reshapes the vector into a column-vector shaped matrix. And the [: (cap) causes the monadic form of the verb to cap's right.
Java
<lang java>import java.util.Scanner;
public class Main {
public static int doStuff(int a, int b){ int sum = a+b; return sum; }
public static void main(String[] args) { Scanner in = new Scanner(System.in);
int n = in.nextInt(); for(int i=0; i<n; i++){ int a = in.nextInt(); int b= in.nextInt(); int result = doStuff(a, b); System.out.println(result); } } }</lang>
PARI/GP
Interestingly, this task is not possible to implement directly in GP, since input()
, like the gp REPL itself, ignores spaces. One must use PARI:
<lang c>#include <stdio.h>
- include <stdlib.h>
- include <pari/pari.h>
int main(void);
int main() {
int i, n, a, b; GEN f, sum; pari_sp ltop; // 1 MB stack, not using prime table pari_init(1000000, 0); scanf("%d", &n); GEN f = cgetg(n+1, t_VEC);
for (i = 1; i <= n; i++) { if (2 != scanf("%d %d", &a, &b)) abort();
ltop = avma;
// Add a and b in PARI sum = addii(stoi(a), stoi(b));
// Store the sum in a vector, collecting garbage as you go. gel(f, i) = gerepileupto(ltop, sum);
}
pari_printf("%Ps", f); return 0;
}</lang> Of course for such a simple task this has very little advantage over C, but it does demonstrate the general principle.
Perl 6
<lang perl6>for ^get() { say [+] get.words }</lang> This does more than the task asks. It will sum as many numbers as you care to put on each line, and the numbers need not be integers, but may also be a mix of rational, floating-point, or complex numbers. More subtly, get can read from a file specified as a command-line argument, but defaults to taking STDIN if no filename is specified.
PowerShell
<lang PowerShell>
- script.ps1
$in, $line = (Get-Content $args[0]), 0 $nb = $in[$line++] 1..$nb | foreach {
$sum = 0 $in[$line++].Split() | foreach{ $sum += $_} $sum
}
- ./script file.txt
</lang>
Python
<lang python>def do_stuff(a, b): return a + b
t = input() for x in range(0, t): a, b = raw_input().strip().split() print do_stuff(int(a), int(b))</lang>
Python: Alternative
Or without the function do_stuff() and that works for Python 3 and Python 2: <lang python>>>> try: raw_input except NameError: raw_input = input
>>> for i in range(int(raw_input())): print(sum(int(numberstring) for numberstring in raw_input().strip().split()))
5
1 2
3
10 20
30
-3 5
2
100 2
102
5 5
10
>>> </lang>
(All but the first line of single numbers, (the 5), is output from the program).
Python: With prompts
More than is asked for by the task, but if working interactively then the following version adds prompts. <lang python>>>> for i in range(int(raw_input('lines: '))): print(sum(int(numberstring)
for numberstring in raw_input('two numbers: ').strip().split()))
lines: 5
two numbers: 1 2
3
two numbers: 10 20
30
two numbers: -3 5
2
two numbers: 100 2
102
two numbers: 5 5
10
>>> </lang>
Racket
<lang Racket>#lang racket
- (define line-number (read)) ;reads all kind of things
- (for ([i (in-range line-number)])
- (displayln (+ (read) (read))))
(define line-count (string->number ;only reads numbers
(string-trim (read-line))))
(for ([i (in-range line-count)])
(displayln (apply + (map string->number (string-split (read-line))))))</lang>
REXX
This version isn't limited to summing integers, any form of number that REXX supports can be used. <lang rexx>/*REXX pgm reads a number (from C.L.), reads that # of pairs, writes their sum*/
do linein() /*read the number of pairs to be add*ed*/ y=linein() /*read a line (a record) from the input*/ say word(y,1) + word(y,2) /*write the sum of a pair of numbers. */ end /*linein() */ /*keep getting pairs of # (the 1st get)*/
/*stick a fork in it, we're all done. */</lang>
Ruby
<lang ruby>n = gets.to_i n.times do
a, b = gets.split.map(&:to_i) puts a + b
end</lang>
Tcl
<lang tcl>gets stdin n while {$n > 0} {
if {[scan [gets stdin] "%d %d" a b] == 2} { puts [expr {$a + $b}] } incr n -1
}</lang>
UNIX Shell
<lang bash>read n while (( n > 0 )); do
read a b echo $((a+b)) ((n--))
done</lang>
Ursa
<lang ursa>decl int amount set amount (in int console)
decl int<> ints for (decl int i) (< i amount) (inc i)
decl string input set input (in string console) append (int (split input " ")<0>) (int (split input " ")<1>) ints
end for
out endl console
for (set i 0) (< i (size ints)) (set i (int (+ 2 i)))
out (int (+ ints ints<(int (+ i 1))>)) endl console
end for</lang>
zkl
Using the console as the input stream: <lang zkl>fcn pairs{
n:=ask("num pairs: ").toInt(); do(n){ask("1 pair: ").split(" ").sum().println()}
}</lang>
- Output:
pairs() num pairs: 5 1 pair: 1 2 3 1 pair: 10 20 30 1 pair: -3 5 2 1 pair: 100 2 102 1 pair: 5 5 10