唐突に、手元にある各言語で標準入力から1行ずつ読み込んで、行の先頭の数値として解析できる部分を数値に変換して標準出力に吐き出すプログラムを書いてみようと思ったメモ。
例えば、「+123i456」という行があったら、「+123」までが数値として解析できる(その後ろの「i」が数値を構成する要素でない)ので、「123」と出力する(数値型に変換したら、普通の言語では「+」記号は出力されないため)。
環境
手元にあるものということで、環境は以下のものに限定する。
- CentOS 7
- Java (openjdk version "1.8.0_131")
- C (gcc (GCC) 4.8.5)
-std=gnu11
でコンパイル
- C++ (g++ (GCC) 4.8.5)
-std=gnu++1y
でコンパイル
- PHP (PHP 5.4.16 (cli))
- Python 2 (Python 2.7.5)
- Python 3 (Python 3.6.3)
- ソースからビルドしたもの
- Ruby (ruby 2.0.0p648)
- Perl (v5.16.3)
- Go (go version go1.8.3 linux/amd64)
- bash (4.2.46(1)-release)
- Awk (GNU Awk 4.0.2)
入力ファイル
- 001.txt
123 123# 123i456 123 789 0x123 +123 +123# +123i456 +123 789 +0x123 -123 -123# -123i456 -123 789 -0x123
期待される出力
- 001.txt
123 123 123 123 0 123 123 123 123 0 -123 -123 -123 -123 0
Java
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) { try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in))) { String buf; while ((buf = in.readLine()) != null) { buf = buf.replaceAll("^([+-]?[0-9]+).*$", "$1"); int num = Integer.parseInt(buf); System.out.println(num); } } catch (IOException e) { e.printStackTrace(); } } }
C
#include <stdio.h> int main(int argc, char** argv) { char buf[1024]; while (fgets(buf, sizeof(buf), stdin)) { int num; sscanf(buf, "%d", &num); printf("%d\n", num); } return 0; }
C++
#include <iostream> using namespace std; int main(int argc, char** argv) { char buf[1024]; while (cin.getline(buf, sizeof(buf))) { int num; sscanf(buf, "%d", &num); cout << num << endl; } return EXIT_SUCCESS; }
PHP
<?php $lines = file('php://stdin'); foreach ($lines as $line) { $num = (int)$line; printf("%d\n", $num); }
Python 2
import sys import re patStr = r'^[+-]?[0-9]+' pattern = re.compile(patStr) while True: line = sys.stdin.readline() if line == '': break matcher = pattern.match(line) line = line[matcher.start():matcher.end()] num = int(line) print num
Python 3
import sys import re patStr = r'^[+-]?[0-9]+' pattern = re.compile(patStr) while True: line = sys.stdin.readline() if line == '': break matcher = pattern.match(line) line = line[matcher.start():matcher.end()] num = int(line) print(num)
Ruby
while line = STDIN.gets num = line.to_i print num,"\n" end
Perl
my $line; while ($line = readline(STDIN)) { my $num = $line + 0; print $num,"\n"; }
Go
package main import ( "bufio" "fmt" "io" "os" "strconv" "regexp" ) func main() { 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) s = regexp.MustCompile(`^([+-]?[0-9]+).*`).ReplaceAllString(s, "$1") num, err2 := strconv.Atoi(s) if err2 != nil { panic(err2) } fmt.Println(num) buf = make([]byte, 0, 1024) } }
bash
#! /bin/bash while IFS=$'\n' read line ; do num=$(echo ${line} | sed -e 's/^\([+-]*[0-9][0-9]*\).*/\1/') num=$((num+0)) echo ${num} done
Awk
{ s = gensub(/^([-+]?[0-9]+).*$/, "\\1", "g", $0); print s + 0; }