なぜやるのか
こういう系の記事はさぞQiitaに溢れているんだろうなと思ったら全然なかったので、備忘録としても役に立つので書いておきます。
GitHubのリポジトリはこちら
基準となるInput
予測不能な複数行の入力を取得し、一行ずつ配列に格納するコードのテンプレートを様々な言語で書いています。
例えば
Hello
World
かもしれないし、
How
are
you?
かもしれないというような、何行入力があるかわからないけど全行とりあえず配列に格納したい!という時に便利です。
ちなみに各コードの出力は基本的には
["Hello","World"]
の形で出力されるように書いていますがいくつかの言語はそうならない場合があります。ただどの言語でもarray[0]
もしくはarray(0)
を指定すれば"Hello"
が返ってくるようにはなっているのでご安心ください。
本題
JavaScript
function Main(input) {
let lines = input.split("\n");
lines.pop();
console.log(lines);
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
//=>[ 'Hello', 'World' ]
Python3
import sys
lines = [line.rstrip() for line in sys.stdin]
print(lines)
#=> ['Hello', 'World']
Ruby
lines = ARGF.map &:chomp
p lines
#=> ["Hello", "World"]
PHP
<?php
while ($line = fgets(STDIN)) {
$lines[] = trim($line);
}
foreach($lines as $array){
echo "$array\n";
}
?>
#=> Hello
#=> World
Swift
let lines = Array(AnyIterator { readLine() })
print(lines)
#=> ["Hello", "World"]
Java
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class StdIn {
public static void main(String[] args) {
try (var scanner = new Scanner(System.in)) {
List<String> lines = Stream.generate(() -> scanner)
.takeWhile(Scanner::hasNextLine)
.map(Scanner::nextLine)
.collect(Collectors.toList());
System.out.println(lines);
}
}
}ello, World]
C#
using System;
using System.Collections.Generic;
public class Hello
{
public static void Main()
{
string line;
var array = new List<string>();
while ((line = Console.ReadLine()) != null)
{
array.Add(line);
}
Console.WriteLine(array);
}
}
//=> System.Collections.Generic.List`1[System.String]
Kotlin
fun main() {
val lines = generateSequence { readLine() }.toList()
println(lines)
}
//=> [Hello, World]
Scala
object Main extends App {
val lines = io.Source.stdin.getLines().toSeq
println(lines)
}
//=> ListBuffer(Hello, World)
Perl
my @lines = map { chomp $_; $_ } <>;
print join ',', @lines;
#=> Hello,World
Go
package main
import (
"fmt"
"os"
"bufio"
"strings"
)
func main() {
array := []string{}
s := bufio.NewScanner(os.Stdin)
for s.Scan() {
array = append(array, s.Text())
}
fmt.Printf("%s\n",strings.Join(array,","))
}
//=> Hello,World
C++
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
string str;
vector<string> array;
while (std::cin)
{
getline(cin, str);
array.push_back(str);
}
for (auto lines : array)
{
cout << lines << endl;
}
return 0;
}
#=> Hello
#=> World
#=> (空白)
おわりに
後からコメントをいただいてmap系のイテレートは有能だということがわかりました。筆者はJavaScript以外ほとんど触ったことがないので冗長なコードがあればどしどしコメントを送ってください。