手元にある各言語で、標準入力から数値列を読み込んで、昇順にソートしたうえで標準出力に吐き出すプログラムを書いてみようと思ったメモ。
標準入力から入力される数値列の要件は以下の通り。
- 1行に1つの数値が書かれている
- 不正入力のチェックは不要とする
- 最大で256個の数値が入力される
- 入力される数値は符号付32ビット整数とする
環境
手元にあるものということで、環境は以下のものに限定する。
- CentOS 7
入力ファイルの例
- 001.txt
0 1 -1 256 -256 32768 -32768 2147483647 -2147483648
期待される出力の例
- 001.txt
-2147483648 -32768 -256 -1 0 1 256 32768 2147483647
Java
入力される数値の上限数が分かっているということで、Javaでは2パターン作ってみた。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.Arrays; public class Main { public static void main(String[] args) { try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(System.out) ) { String buf; int count = 0; int[] ary = new int[256]; while ((buf = in.readLine()) != null) { ary[count] = Integer.parseInt(buf); ++count; } Arrays.sort(ary, 0, count); for (int i = 0; i < count; ++i) { out.println(ary[i]); } } catch (NumberFormatException e) { // 今回は不正入力のチェックは不要なので、RuntimeExceptionを投げておく。 throw new RuntimeException(e); } catch (IOException e) { e.printStackTrace(); } } }
import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { try (Scanner in = new Scanner(System.in); PrintWriter out = new PrintWriter(System.out) ) { List<Integer> list = new ArrayList<>(); while (in.hasNextInt()) { list.add(in.nextInt()); } Collections.sort(list); for (Integer num : list) { out.println(num); } } } }
C
#include <stdio.h> #include <stdlib.h> int cmp(const void* pa, const void* pb) { int a = *(const int*)pa; int b = *(const int*)pb; if (a < b) { return -1; } else if (a > b) { return 1; } else { return 0; } } int main(int argc, char** argv) { int ary[256]; int count = 0; while (scanf("%ld", &ary[count]) == 1) { ++count; } qsort(ary, count, sizeof(int), cmp); for (int i = 0; i < count; ++i) { printf("%d\n", ary[i]); } return 0; }
C++
#include <algorithm> #include <iostream> #include <vector> using namespace std; int main(int argc, char** argv) { vector<int> list; int num; int count = 0; while (cin >> num) { list.push_back(num); ++count; } sort(list.begin(), list.end()); for (int i = 0; i < list.size(); ++i) { cout << list[i] << endl; } return EXIT_SUCCESS; }
PHP
<?php $lines = file('php://stdin'); $ary = array(); foreach ($lines as $line) { $ary[] = (int)$line; } sort($ary); foreach ($ary as $num) { printf("%d\n", $num); }
Python 2
import sys list = [] while True: line = sys.stdin.readline() if line == '': break list.append(int(line)) list.sort() for num in list: print num
Python 3
import sys list = [] while True: line = sys.stdin.readline() if line == '': break list.append(int(line)) list.sort() for num in list: print(num)
Ruby
list = [] while line = STDIN.gets num = line.to_i list.push(num) end list = list.sort() for num in list print num,"\n" end
Perl
my $line; my @list = (); my $count = 0; while ($line = readline(STDIN)) { my $num = $line + 0; $list[$count] = $num; ++$count; } @list = sort {$a <=> $b} @list; for (my $i = 0; $i < $count; ++$i) { print "$list[$i]\n"; }
Go
package main import ( "bufio" "fmt" "io" "os" "strconv" "sort" ) func main() { tmp := make([]int, 256) count := 0 stdin := bufio.NewReader(os.Stdin) buf := make([]byte, 0, 1024) for { line, prefix, err := stdin.ReadLine() if err == io.EOF { break } buf = append(buf, line...) if prefix { continue } s := string(buf) num, err2 := strconv.Atoi(s) if err2 != nil { panic(err2) } tmp[count] = num count++ buf = make([]byte, 0, 1024) } ary := make([]int, count) for i := 0; i < count; i++ { ary[i] = tmp[i] } sort.Ints(ary) for i := 0; i < count; i++ { fmt.Println(ary[i]) } }
これが最適なコードなのかどうかよく分からん‥
bash
#! /bin/bash sort -n