今回は paiza の「taぬき」の問題に挑戦!
🦝 問題概要
与えられた文字列 S の中から、
文字 't' と 'a' をすべて削除した文字列を出力する。
入力例:
metdtiaum
出力例:
medium
✅OK例:
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
const s = lines[0]; // 入力文字列を取得
const ans = [];
for (let i = 0; i < s.length; i++) {
if (s[i] !== 't' && s[i] !== 'a') { // tでもaでもないなら残す
ans.push(s[i]);
}
}
console.log(ans.join('')); // 配列を文字列に戻して出力
});
🔍 もっと短く書くなら!
const s = require("fs").readFileSync(0, "utf8").trim();
console.log(s.replace(/[ta]/g, ""));
✅ 短縮版のポイント
-
.replace(/[ta]/g, "")
→ 正規表現で't'または'a'をすべて削除 -
gは “global”(全体置換)の意味
📝まとめ
- 文字列から特定の文字を除外する基本練習
- 2つのアプローチがある
🔹for文+条件分岐
🔹正規表現+replace() -
.join('')は配列を文字列に戻すメソッド -
!==は「でない」条件 -
"t"と"a"の両方に当てはまらないときだけ残す
💡おまけ:正規表現バージョンの解説
const s = require("fs").readFileSync(0, "utf8").trim();
console.log(s.replace(/[ta]/g, ""));
⭐ 1行目:入力を読み取り、改行を削る
const s = require("fs").readFileSync(0, "utf8").trim();
-
require("fs")
→ Node.js の組み込みモジュールfs(ファイル操作)を読み込む。 -
.readFileSync(0, "utf8")
→ ファイル記述子0は 標準入力 (stdin) を意味する。
→readFileSync(0, "utf8")はstdinを同期的に全て読み取り、UTF-8の文字列として返す、ということ。
たとえば入力がmetdtiaum\nなら戻り値は"metdtiaum\n"(改行付き)。 -
.trim()
→ 文字列の先頭と末尾の空白文字(スペースやタブ、改行)を除去する。
例:"metdtiaum\n".trim()→"metdtiaum"
この問題は入力が1行なので、行末の改行を落とすためにtrim()を使うのが自然。
注意:複数行をそのまま扱いたい場合はtrim()が不要/邪魔になることがあるので要注意。
結果として s は処理対象のクリーンな文字列になる。
⭐ 2行目:置換(削除)の実行
console.log(s.replace(/[ta]/g, ""));
-
s.replace(pattern, replacement)は、文字列sの中でpatternにマッチする箇所をreplacementに置き換えるメソッド。 -
Ppatternに使っている/[ta]/gは 正規表現(RegExp):-
/ ... /の中身がパターン。 -
[ta]は 文字クラス:'t'または'a'を意味する。
角括弧の中は「どれか1文字にマッチ」する。例えば[abc]はaまたはbまたはc。 -
gは global(グローバル)フラグ:文字列中の すべての一致箇所 を対象にする、という意味。gが無いと最初に見つかった1箇所だけしか置換されない。
-
-
replacementに""(空文字)を渡しているので、マッチした文字は 取り除かれる(削除される) ことになる。
まとめると、文字列中のすべての 't' と 'a' を空文字で置き換える=削除する、という動作。