まだまだ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()を何度かする、というやり方で文字数減らせることもあるんですね。へぇ〜〜〜〜〜〜
という、自分に向けてのまとめ。引き続き頑張る〜〜〜