おはやし日記

テーマ……バイク←プログラミング←旅

javascript(Node.js)でAtCoderを解く

Node.jsの標準入出力めんどくさすぎて半ギレになりながらもまとめました

閲覧はPC推奨です

環境

  • macOS Mojave 10.14.6
  • Node.js v12.18.1

入力

//in.txt
3 5
2.5 4
hoge

雛形

参考 : paizaプログラミングスキルチェックの値取得・出力サンプルコード | ITエンジニア向け転職・就活・学習サービス【paiza】

その1

process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin, output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line.split(" "));
});
reader.on('close', solve);

function getInt(strArr){
  var rtn = [];
  for(elem of strArr)rtn.push(parseInt(elem));
  return rtn;
}

function getFloat(strArr){
  var rtn = [];
  for(elem of strArr)rtn.push(parseFloat(elem));
  return rtn;
}

function solve(){
  var [a,b] = getInt(lines[0]);
  var [c,d] = getFloat(lines[1]);
  var [s] = lines[2];

  console.log(a+b);
  console.log(c*d);
  console.log(s);
}
$ node test.js
3 5[Enter]
2.5 4[Enter]
hoge[Enter][Ctrl+C]
8
10
hoge
$ node test.js
3 5[Enter]
2.5 4[Enter]
hoge[Enter][Ctrl+D]
8
10
hoge
$ node test.js <in.txt >out.txt
----------
//out.txt
8
10
hoge

その2

var inputs = require("fs").readFileSync("/dev/stdin", "utf8").split("\n");
var lines = [];
for(x of inputs){
  lines.push(x.split(" "));
}
solve();

function getInt(strArr){
  var rtn = [];
  for(elem of strArr)rtn.push(parseInt(elem));
  return rtn;
}

function getFloat(strArr){
  var rtn = [];
  for(elem of strArr)rtn.push(parseFloat(elem));
  return rtn;
}

function solve(){
  var [a,b] = getInt(lines[0]);
  var [c,d] = getFloat(lines[1]);
  var [s] = lines[2];

  console.log(a+b);
  console.log(c*d);
  console.log(s);
}
$ node test.js
3 5[Enter]
2.5 4[Enter]
hoge[Enter][Ctrl+C]
^C
$ node test.js
3 5[Enter]
2.5 4[Enter]
hoge[Enter][Ctrl+D]
8D
10
hoge
`8D`は、`^D`にNode.jsの出力`8`が被ったものと思われる
$ node test.js <in.txt >out.txt
----------
//out.txt
8
10
hoge

まとめ

その1の方が何かと安定していそう。

lineがどうこうと書いてある先頭の部分で一気に入力を処理している。

その後のfunction getInt()では、文字列の配列となっているlines[i]parseIntして数字の配列にしている。さらに分割代入を用いて複数の変数に振り分けている。

実践

上の方を省略してsolve()だけ書く。c++を併記している時は#include <bits/stdc++.h> using namespace std;が省略されている。javascriptでの完全な提出へのリンクは貼ります。

解説的なのは省略。

ABC151-A

function solve(){
  var [z] = lines[0];
  console.log( String.fromCharCode(z.charCodeAt()+1) );
}

Submission #14927043 - AtCoder Beginner Contest 151

ABC152-A

function solve(){
  var [N,M] = getInt(lines[0]);
  console.log(N==M ? "Yes" : "No")
}

Submission #14927344 - AtCoder Beginner Contest 152

ABC152-B

//javascript
function solve(){
  var [a,b] = getInt(lines[0]);

  if(b>a)[a,b]=[b,a];

  var ans = "";
  for(i=0; i<a; i++)ans+=b;
  console.log(ans);
}
//c++
int main(){
  int a, b;
  cin>>a>>b;
  if(b>a)swap(a, b);


  for(int i=0; i<a; i++)cout<<b;
  cout<<endl;
}

[a,b]=[b,a]でswapできる。おそらく

var temp = [b,a];
[a,b] = temp;

といった感じに処理されている。

ABC152-C

//javascript
function solve(){
  var [N] = getInt(lines[0]);
  var P = getInt(lines[1]);
  var m=200001, ans=0;
  for(i=0; i<N; i++){

    if(P[i]<m)ans++;
    m = Math.min(m, P[i]);
  }
  console.log(ans);
}
//c++
int main(){
  int N;cin>>N;

  int p, m=200001, ans=0;
  for(int i=0; i<N; i++){
    cin>>p;
    if(p<m)ans++;
    m = min(m, p);
  }
  cout<<ans<<endl;
}

javascriptで、Nは単一の変数なので要素数1の配列であるgetInt(lines[0])から分割代入で放り込んでいるが、Pは配列なのでgetInt(lines[1])をそのまま放り込んでいる。

Submission #14927579 - AtCoder Beginner Contest 152

おしまい

なんでC++で解けるのにjavascriptで解くんですか?

プライバシーポリシー ・お問い合わせはこちら