LoginSignup
24
16

More than 5 years have passed since last update.

atcorderの標準出力がわからん!のでメモ。(JavaScriptの場合)

Last updated at Posted at 2018-09-06

atcorderのチュートリアルを紐解く

問題はatcorderのサイトから。会員登録が必要です。無料なので登録してみましょう!
AtCoderの練習用ページ

チュートリアルの解答がこちら。

js
// 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を以下のようにします。

js
// 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. 入力できる数を増やしたい

最初のチュートリアルを見てみましょう。

js
// 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, ...]となります。

以下のコードで確認してみましょう。

js
// 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. 文字列を数値に変換

そこでもう一度、チュートリアル。

js
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行目の入力をさらに分割しています。

js
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の意味がわかりません。誰か教えてください、、、

これで終了です。一通り理解できたでしょうか?
間違いはどんどん指摘ください、よろしくお願いします。

24
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
16