【JavaScript】反対方向の移動を打ち消して最終的な進行方向を求める方法
問題
1文字ずつの要素からなる配列 arr を唯一の引数として受け取り、配列全体の移動をすべて計算した結果として残る「最終的な方向」を返す JavaScript 関数を作成します。
配列に含まれるのは次の4種類の文字のみです。
- 'N' → 北(North)方向へ単位距離だけ移動
- 'S' → 南(South)方向へ単位距離だけ移動
- 'W' → 西(West)方向へ単位距離だけ移動
- 'E' → 東(East)方向へ単位距離だけ移動
各文字はその方向への1単位分の移動を表します。ここで重要なルールとして、配列内で互いに反対向きの組み合わせ、すなわち ('S' と 'N') または ('E' と 'W') が隣接して現れた場合、それらは互いの移動を打ち消し合います。
たとえば、関数への入力が次の場合を考えてみましょう。
const arr = ['N', 'S', 'S', 'E', 'W', 'N', 'W'];
このとき期待される出力は次のとおりです。
const output = 'W';
出力の解説
処理の流れを順に追うと次のようになります。
- 先頭の 'N' と 'S' が隣接しているため互いに打ち消し合う
- 次に 'E' と 'W' が隣接しているため互いに打ち消し合う
- さらに残った 'N' と 'S' も再び打ち消し合う
これらの打ち消しが完了すると、最終的に 'W' のみが残ります。
解決アプローチ
もっともシンプルな方法は、配列を1つの文字列に連結し、打ち消し対象となるペア('NS'、'SN'、'EW'、'WE')が存在しなくなるまで繰り返し削除していくというものです。
コード例
以下が実際のコードです。
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));コードのポイント
join('')で配列を1つの文字列に変換することで、includes()とreplace()を使った簡潔な処理が可能になります。whileループにより、打ち消し可能なペアが文字列内に存在する限り削除を繰り返します。削除によって新しくペアが隣接するケース(例: 'N' + 打ち消し + 'S')にも自動的に対応できます。- 最後に
split('')で文字列を配列に戻し、元の形式で結果を返しています。
出力
コンソールには次のように表示されます。
['W']
-
JavaScriptで文字列内の指定した文字の直後にある次の文字を取得する方法
課題JavaScriptで、文字列 str と1文字の char を引数として受け取る関数を作成する必要があります。この関数の役割は、元の文字列の中で char が現れる箇所をすべて見つけ、それぞれの直後に存在する文字(存在する場合のみ)を取り出して、それらを連結した新しい文字列を返すことです。例えば、対象の文字が文字列の末尾に位置している場合、その直後に文字は存在しないため、結果には含まれません。実装例以下が実際のコードです。 { let res = ; for(let i = 0; i <
-
JavaScriptで不正な時間文字列(HH:MM:SS)を正規化して修正する方法
JavaScriptでは、「HH:MM:SS」形式の時間文字列を扱う場面がよくあります。しかし、時間の加算処理などで計算ミスが発生すると、分や秒が60を超えてしまう「壊れた」時間文字列が生成されることがあります。この記事では、そうした不正な時間文字列を正しく正規化する方法を解説します。 課題:壊れた時間文字列とは 今回求められるのは、JavaScriptで「HH:MM:SS」形式の時間文字列を受け取り、必要な修正を加えた上で、正しい時間文字列として返す関数を作成することです。 問題になるのは、加算処理のバグによって、次のような不正な値が含まれてしまうケースです。 MM(分)の部分が60を超え