JavaScriptで文字列をアルファベット・数字・特殊文字の3グループに分割する方法
アルファベット・数字・特殊文字が混在する文字列 S が与えられたとき、この文字列を次の3つの文字列 S1、S2、S3 に分割するプログラムを作成します。
- S1:文字列 S に含まれるすべてのアルファベット
- S2:文字列 S に含まれるすべての数字
- S3:文字列 S に含まれるすべての特殊文字
なお、各文字列内の文字は、入力文字列に出現した順序をそのまま維持する必要があります。
実装例
以下がその実装コードです。
const str = "Th!s String C0nt@1ns d1fferent ch@ract5rs";
const seperateCharacters = str => {
const strArr = str.split("");
return strArr.reduce((acc, val) => {
let { numbers, alpha, special } = acc;
if(+val){
numbers += val;
}else if(val.toUpperCase() !== val.toLowerCase()){
alpha += val;
}else{
special += val;
};
return { numbers, alpha, special };
}, {
numbers: '',
alpha: '',
special: ''
});
};
console.log(seperateCharacters(str));出力結果
このコードをコンソールで実行すると、次のような出力が得られます。
{
numbers: '115',
alpha: 'ThsStringCntnsdfferentchractrs',
special: '! 0@ @'
}コードの解説
この実装では、まず split("") メソッドで文字列を1文字ずつの配列に分解し、その後 reduce() メソッドを使って各文字を3つのカテゴリに振り分けています。
- 数字の判定:
+valによる数値変換が真になる場合、その文字は数字として分類されます。 - アルファベットの判定:
toUpperCase()とtoLowerCase()の変換結果が異なる場合、その文字はアルファベットとして分類されます。 - 特殊文字の判定:上記のいずれにも該当しない文字は、特殊文字として分類されます。
注意点として、この判定方法では文字 "0" は数値変換すると 0(falsy な値)になるため、数字ではなく特殊文字として分類されてしまいます。出力結果の special に 0 が含まれているのはこのためです。より厳密に数字を判定したい場合は、正規表現 /^[0-9]$/ を活用する方法も検討するとよいでしょう。
-
【JavaScript】トランプのカードを連続する数字のグループに再配置できるか判定する方法
本記事では、JavaScriptを用いてトランプのカードを「指定サイズの連続した数字のグループ」に再配置できるかどうかを判定するアルゴリズムを解説します。配列のソートとハッシュマップ(オブジェクト)を組み合わせたシンプルかつ効率的なアプローチを学びましょう。 問題の概要 次のようなJavaScript関数を実装することが求められます。 第1引数:数値の配列 arr 第2引数:グループのサイズを表す数値 num 配列内の各数値は [1, 13] の範囲(両端を含む)に収まっており、それぞれトランプのカードに対応しています。 この関数の目的は、すべてのカードを「サイズが num であり、かつ
-
JavaScriptで文字列をできるだけ多くの部分に分割するアルゴリズム
文字列処理のアルゴリズム問題としてよく知られている「Partition Labels」をJavaScriptで解いてみましょう。この記事では、各文字が1つの部分にしか現れないように、文字列をできるだけ多くの部分へ分割する方法を解説します。 問題の定義 まず、文字列 str を引数として受け取るJavaScript関数を作成します。この関数の目的は、以下の条件を満たすように文字列を可能な限り多くの部分に分割することです。 各文字(英字)は、最大でも1つの部分にしか出現しない 戻り値は、各部分の長さを表す整数の配列 例を見てみましょう。 入力: const str = ababcbacade