JavaScriptで反対方向の移動を相殺して最終的な進行方向を求める方法
問題
単一文字の配列 arr を引数として受け取り、配列全体の移動を処理した後に残る最終的な進行方向を返すJavaScript関数を作成する必要があります。
配列に含められるのは、次の4種類の文字のみです。
- 'N' → 北(North)方向への移動
- 'S' → 南(South)方向への移動
- 'W' → 西(West)方向への移動
- 'E' → 東(East)方向への移動
各文字は、その方向へ単位距離だけ移動することを表します。そして、配列内のどこかで反対同士の方向('S' と 'N'、または 'E' と 'W')が隣接して現れた場合、それらは互いの移動を打ち消し合います。したがって、この関数の役割は、すべての打ち消しを適用した結果として残る方向を求めることです。
例として、関数への入力が以下の場合を考えてみましょう。
入力
const arr = ['N', 'S', 'S', 'E', 'W', 'N', 'W'];
出力
const output = 'W';
出力の解説
まず最初の 'N' と 'S' が互いに打ち消し合い、続いて 'E' と 'W' も打ち消し合います。さらに、その後にもう一度 'N' と 'S' が打ち消し合うため、最終的に残るのは 'W' のみとなります。
コード例
以下がその実装コードです。
const arr = ['N', 'S', 'S', 'E', 'W', 'N', 'W'];
const cancelDirections = (arr = []) => {
let str = arr.join('');
while(str.includes('NS') || str.includes('SN') || str.includes('EW') || str.includes('WE')){
str = str.replace('NS', '');
str = str.replace('SN', '');
str = str.replace('EW', '');
str = str.replace('WE', '');
};
return str.split('');
};
console.log(cancelDirections(arr));出力結果
['W']
コードの仕組み
このアプローチでは、まず join('') を使って配列を1つの文字列に結合します。次に while ループを回しながら、文字列の中に反対方向のペア('NS'、'SN'、'EW'、'WE')が存在する限り、それらを replace() で空文字に置き換えて削除していきます。すべてのペアが取り除かれた時点でループが終了し、最後に split('') で文字列を再び配列に変換して返しています。
-
JavaScriptで文字列に含まれる母音の数を数えて返す方法
ここでは、アルファベットを含む可能性のある文字列を引数として受け取り、その文字列の中に存在する母音(a・e・i・o・u)の個数を数えて返すJavaScript関数の作成方法を解説します。実装のポイントは以下の通りです。大文字・小文字の違いを吸収するため、toLowerCase()で文字列をすべて小文字に変換します。母音の一覧「aeiou」を判定基準(legend)として用意します。文字列を1文字ずつループで走査し、母音リストに含まれる文字であればカウントを増やします。サンプルコード以下が実際のコード例です。 { str = str.toLowerCase(); &nb
-
マジックストリング(魔法の文字列)問題をJavaScriptで解く方法
マジックストリングの問題概要マジックストリング(魔法の文字列)とは、「1」と「2」だけから構成され、次の性質を持つ特別な文字列です。この文字列が「マジック(魔法)」と呼ばれるのは、連続する「1」や「2」のかたまり(グループ)ごとの出現回数をつなぎ合わせると、元の文字列そのものが再現されるからです。文字列 str の最初の部分は次のようになっています。str = 1221121221221121122……str 内の連続した「1」「2」をそれぞれグループに分けると、次のようになります。1 22 11 2 1 22 1 22 11 2 11 22 ……さらに、各グループにおける「1」または「2」の