Node.jsでバックグラウンドで質問に答えるときに入力を処理する


質問する


Javascript学習アルゴリズムを使うのは初めてなので、始める前にI/O方法を学び始めました.以前に他の言語で解いた問題は,学習の過程で1259問の解答を開始した(ファリンドロンすう).
私は今回JavaScriptでアルゴリズムを解き始め、Githubに記録を残すためにvscodeで問題を解きます.私が最初に書いたコードは次のとおりです.
// 1259.txt
121
1231
12421
0
const input = require('fs')
    .readFileSync('baekjoon/1000~/1259.txt')	// 1259.txt는 백준의 입력 예시가 똑같이 저장된 파일입니다.
    .toString()
    .split('\n');

	const arr = input.filter((e) => e !== '0');

	arr.forEach((e) => {
  		let reverse = e.split('').reverse().join('');
  		console.log(reverse.trim() === e.trim() ? 'yes' : 'no');
	})
最後のconsole.log()reversearr.[i]に対してtrim()が行われたのは、すべての結果がnoとして出力されるため、これらの結果が追加されてプリアンブルが削除されるからである.
vscodeでの実行結果はyes\n no\n yesで正しく、このコードをコミットしました.
結果は틀렸습니다でした.
私のアルゴリズムは間違っていると思います.修正後何度も提出しましたが、틀렸습니다しか確認できませんでした.最後に、最後の提出も間違っていることを確認し、googlingで正解者のコードをコピーし、私のコードと比較して勉強し、コードをコピーすることにしました.

解決する

let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n"); // (1)
input.pop();

// (2)
for (let i = 0; i < input.length; i++) {
	let reverseStr = input[i].split("").reverse().join("");
	console.log(input[i] === reverseStr ? "yes" : "no");	// (3)
}
ソース
私のコードと次のコードの比較の違いは、
(1)inputでtrim()を行う
(2)forforEach()を用いて巡回配列
(3)最後の3つの演算子はtrim()を使用しません.
私がコードを修正するポイントは(1)、(3)で、次のアルゴリズムの違いではありません.
const input = require('fs')
    .readFileSync('baekjoon/1000~/1259.txt')
    .toString()
	.trim()		// 새로 추가된 부분
    .split('\n');

	...

	arr.forEach((e) => {
  		let reverse = e.split('').reverse().join('');
  		console.log(reverse === e ? 'yes' : 'no');	// trim() 제거
	})
vscodeの出力結果はno\n no\n noで間違いかと思いましたが、百駿に提出すれば정답입니다だと思います.
ここで私は2つの疑問を生んだ.
  • の上のコードからtrim()を再び削除して提出すれば、틀렸습니다にはどんな違いがありますか?
  • の最後のconsole.log()の3つの演算子では、開行文字の存在はあまり影響しませんか?
  • 1日は解決しましたが2日は理由が分かりません
    1つ目の理由はgooglingで分かったことですが、白駿入力の最後にアルファベットを1文字追加することが多いので、trim()を使うのが望ましいです.
    この問題は、問題の入力例がそうではないかもしれませんが、コミット時に入力される可能性があることを示しています.(入力例を無条件に信じない)
    2日ならなぜかわかる方メッセージをお願いします
    参考になる文章
    Node.jsでBaek Jun(BOJ)問題を解く際の注意点