JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】文字数が素数の単語だけを逆順にする方法

本記事では、空白で区切られた複数の単語からなる文字列を受け取り、文字数が素数になっている単語だけを反転した新しい文字列を返すJavaScript関数の作り方を解説します。

問題の概要

たとえば「His father is an engineer by profession」という文字列の場合、「His」(3文字)、「is」(2文字)、「an」(2文字)、「by」(2文字)のように文字数が2・3・5・7・11などの素数である単語は逆順にし、それ以外の単語(6文字の「father」や8文字の「engineer」など)はそのまま残します。

実装のアプローチ

処理の流れは次のとおりです。

  • split(' ') で元の文字列を単語ごとに分割する
  • 各単語の長さが素数かどうかを isPrime() 関数で判定する
  • 素数であれば reverseString() 関数で単語を反転し、そうでなければそのまま使用する
  • reduce() を使ってすべての単語を連結し、新しい文字列を組み立てる

コード例

以下が実際の実装コードです。

const str = 'His father is an engineer by profession';

// 素数判定を行うヘルパー関数
const isPrime = n => {
   if (n === 1){
      return false;
   }else if(n === 2){
      return true;
   }else{
      for(let x = 2; x < n; x++){
         if(n % x === 0){
            return false;
         }
      }
      return true;
   }
};

// 文字列を反転させるヘルパー関数
const reverseString = str => str.split('').reverse().join('');

// 素数の長さの単語だけを反転するメイン関数
const reversePrime = str => {
   return str.split(' ').reduce((acc, val) => {
      const { length } = val;
      if(isPrime(length)){
         acc += reverseString(val) + ' ';
      }else{
         acc += val + ' ';
      }
      return acc;
   }, '');
};
console.log(reversePrime(str));

出力結果

コンソールには以下のように出力されます。

siH father si na engineer yb profession

「His」(3文字)、「is」(2文字)、「an」(2文字)、「by」(2文字)の4つの単語は、いずれも文字数が素数であるため反転されています。一方、「father」(6文字)、「engineer」(8文字)、「profession」(10文字)は素数ではないため、元のまま維持されていることがわかります。

  1. JavaScriptでオブジェクトの長さを取得する方法を解説!Object.keys()の活用術

    JavaScriptにおいて、lengthプロパティは配列や文字列にのみ適用できる仕様になっています。そのため、オブジェクトに対してlengthプロパティを呼び出すと、undefinedが返されます。オブジェクトにlengthを使った場合の挙動<html> <body> <script>     var object = {prop:1, prop:2};     document.write(object.length); </script> </body&g

  2. 正規表現を使って引用符で囲まれたテキストを抽出するJavaScriptコード

    この記事では、正規表現(RegExp)を使用して、文字列から引用符「" "」で囲まれたテキストを抽出する方法を、実際に動作するサンプルコードとともに解説します。ポイントは、/"(.*?)"/g というパターンです。.*? による最短一致と g フラグ(グローバル検索)を組み合わせることで、文中の引用符で挟まれた部分を取得できます。 サンプルコード <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /&