atcorderのチュートリアルを紐解く
問題はatcorderのサイトから。会員登録が必要です。無料なので登録してみましょう!
AtCoderの練習用ページ
チュートリアルの解答がこちら。
// inputに入力データ全体が入る
function Main(input) {
// 1行目がinput[0], 2行目がinput[1], …に入る
input = input.split("\n");
tmp = input[1].split(" ");
//文字列から10進数に変換するときはparseIntを使います
var a = parseInt(input[0], 10);
var b = parseInt(tmp[0], 10);
var c = parseInt(tmp[1], 10);
var s = input[2];
//出力
console.log('%d %s',a+b+c,s);
}
//*この行以降は編集しないでください(標準入出力から一度に読み込み、Mainを呼び出します)
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
ひとつずつ紐解いて行きましょう。
関数Mainと、最後の関数呼び出しはこういうものだとして放置します。
1. 出力結果を確認する
出力結果を確認するには、nodeがインストールされていることが前提です。
nodeのインストール方法はこちら。
Macにnode.jsをインストールする手順。
nodeがインストールできれば、次はターミナルで以下のように入力します。
node atcorder.js
node <対象ファイル> と書きます。そうすると、標準出力が可能になります。
次に、関数Mainを以下のようにします。
// inputに入力データ全体が入る
function Main(input) {
console.log('inputの中身は' + input + 'ですよ');
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
では、node <対象ファイル>で標準出力が可能な状態にしてから10と入力しましょう。
node atcorder.js
10
そのあと、「ctr + D」を入力してください。
場合によっては2回入力が必要かもしれません。
そうすれば、結果が出力されます。
node atcorder.js
10inputの中身は10ですよ
となります。つまり10を入力できたわけです。
node atcorder.js
1
10
100
とします。最後にEnterを押して改行を含めると
node atcorder.js
1
10
100inputの中身は1
10
100
ですよ
となります。
1
が一つの入力になるわけです。
10
100
\n
ただし、このままだと入力が一つしかできません。
2. 入力できる数を増やしたい
最初のチュートリアルを見てみましょう。
// inputに入力データ全体が入る
function Main(input) {
// 1行目がinput[0], 2行目がinput[1], …に入る
input = input.split("\n");
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
split()メソッドで、inputの文字列を改行で分割しています。つまり1行目に1つ目の入力を、2行目に2つ目の入力を、というように入力を分ける事ができるわけです。またsplitメソッドで分割し配列に変換したものをinput自身に返しているので、input = [入力1, 入力2, 入力3, ...]
となります。
以下のコードで確認してみましょう。
// inputに入力データ全体が入る
function Main(input) {
// 1行目がinput[0], 2行目がinput[1], …に入る
input = input.split("\n");
console.log('\n' + input[0] + 'と' + input[1]);
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
見やすくするために最初に改行を入れています。
結果は以下のようになります。
node atcorder.js
10
20
10と20
入力がわかれて、文字列連結ができていますね。
間違えてはいけないのが、"文字列"で入力されていること。
数値として扱う場合は変換しなければいけません。
3. 文字列を数値に変換
そこでもう一度、チュートリアル。
function Main(input) {
input = input.split("\n");
//文字列から10進数に変換するときはparseIntを使います
var a = parseInt(input[0], 10);
}
//*この行以降は編集しないでください(標準入出力から一度に読み込み、Mainを呼び出します)
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
parseIntメソッドを使い、inputの値を10進数の数字に変換していますね。さらに、inputはsplitメソッドによって配列になっています。1行目がinput[0]、2行目がinput[1]ですね。
4. 同じ行で、入力できる数を増やす。
チュートリアルでさらに、2行目の入力をさらに分割しています。
function Main(input) {
input = input.split("\n");
tmp = input[1].split(" ");
//文字列から10進数に変換するときはparseIntを使います
var a = parseInt(input[0], 10);
var b = parseInt(tmp[0], 10);
var c = parseInt(tmp[1], 10);
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));
2行目の入力をinput[1]をsplitで空白文字で分割し、tmpに代入しています。こうすることで、2行目に2つ以上の値を入力することが可能になります。
これで入力形式を揃えることができました。
あとはconsoleで出力するだけです。
ただ%d %s
の意味がわかりません。誰か教えてください、、、
これで終了です。一通り理解できたでしょうか?
間違いはどんどん指摘ください、よろしくお願いします。