プログラミングを上達させたい

プログラミングの勉強を始めた、情報学専攻の大学院生です。モチベーション維持のため、ブログに勉強したことを書いていきます。→就職。IT全然関係ない仕事をしています

競プロでのJavaScriptの標準入力について

まだまだCodinGameにハマっています。おもしろすぎ・・・
そんな中、CodinGameのClash of CodeでのコードゴルフのためにJavaScriptを使い始めました。そしてせっかくだしAtCoderでも使おうかなー、と。
そういうことをするときに立ちはだかるのが、(僕の場合は)入力、出力まわりなんですね。
ということで、そのあたり、まとめました。

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"));

何がややこしいって、readline()は読み込んだものの型は文字列であることなんですね。そして、split()で区切って[1,2,3]のような配列になっても、実際は["1","2","3"]と全部配列のままなんです。
だから、上のようにparseInt()で整数に直す必要があります。文字列のまま足し算も成立しますしね。("1"+"2"+"3"="123")

ただ、

var a = parseInt(input[0], 10);

は下記のようにもうちょい手を抜いて書けます。

var a = parseInt(input[0]);
var a = ~~input[0];

CodinGame

CodinGameの場合はもう少し楽で、上のようなややこしい仕組みは不要です。readline()で入力、print()で出力です。楽〜!

ただ、短く書く作戦も色々あるようで。ここではそっち重視で書きます。
他の方の解答で見つけたものを紹介。

[a,b]=readline().split` `

2つ別々の変数名で一気に入力できるの?そして何より、split(' ')じゃなくていいの?へぇ〜〜

また、2つの2進数が与えられ、ANDした2進数を出力する問題で見た、PGMさんという方の69文字の解答。

r=readline
a=r()
b=r().split('').map((c,i)=>c&a[i])
print(b.join(''))

こうやってreadlineをrとし、その後r()を何度かする、というやり方で文字数減らせることもあるんですね。へぇ〜〜〜〜〜〜


という、自分に向けてのまとめ。引き続き頑張る〜〜〜