HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

標準入力から1行ずつ読み込んで数値解析して標準出力に吐き出す

唐突に、手元にある各言語で標準入力から1行ずつ読み込んで、行の先頭の数値として解析できる部分を数値に変換して標準出力に吐き出すプログラムを書いてみようと思ったメモ。

例えば、「+123i456」という行があったら、「+123」までが数値として解析できる(その後ろの「i」が数値を構成する要素でない)ので、「123」と出力する(数値型に変換したら、普通の言語では「+」記号は出力されないため)。

環境

手元にあるものということで、環境は以下のものに限定する。

入力ファイル

  • 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;
}