文字列処理メニュー(21〜25)

文字列処理メニュー【日時データの変換・数値判定・重複削除・パスワード作成・表記の訂正】

【日時データの変換その2】コード

reader.on('close', () => {
   const [date, time] = lines[0].split(' ');  // 入力を(' ')区切りの配列に変換→[date, time]
   const D = date.split('/');  // dateを('/')区切りの配列に変換→D
   const T = time.split(':');  // timeを(':')区切りの配列に変換→T
   const D_T = [...D,...T];  // D, T を展開して一つの配列にまとめる→D_T
   D_T.forEach(d => {
      console.log(d);
   });
});
hogeちゃんの画像

″ ″で区切った文字列を更に ″/″, ″:″ で区切って各変数に代入。最後に D_T  にまとめて 各要素を出力しました。

【数値判定】コード

reader.on('close', () => {
   const S = lines[0];
   console.log(isNaN(S) ? 'NO' : 'YES');  // Number(S) が NaN になれば isNaN(S)はtrue
});
hogeちゃんの画像

isNaN() の戻り値は引数が数値変換できなければ true になる…。(゚∇゚)

【重複の削除】コード

reader.on('close', () => {
   const S = new Set(lines[0].split(''));  // Set()で入力を受取り…重複した値は上書き(削除)される
   console.log([...S].join(''));  // S を配列内で展開→値を結合して出力
});
hogeちゃんの画像

重複を削除するためSet()で入力を受け取って 展開した値の配列をjoin('')で結合して出力しました。

【パスワード作成】コード

reader.on('close', () => {
   const N = Number(lines[0]);  // パスワードの文字数
   const Q = Number(lines[1]);  // 指定された文字の文字数
   const S = lines[Q + 2];  // 指定された文字
   const pass = new Array(N).fill(S);  // 要素数 N の配列 初期値はすべて S
   for (let i = 2; i < Q + 2; i++) {  // パスワードの文字数
      const [n, c] = lines[i].split(' ');  // パスワードの文字数
      pass[n - 1] = c;  // パスワードの文字数
   }
   console.log(pass.join(''));  // パスワードの文字数
});
hogeちゃんの画像
N 個の S を 配列 pass に保存。そして pass[n – 1] を c で上書きしました。

【表記の訂正】コード 1/2

reader.on('close', () => {
   const s = lines[0].split('');
   for (let i = 0; i < s.length - 1; i++) {
      sl = s.length;
      switch (s.includes('.')) {
         case false:
         if (s[0] === '0') {  // ミス 1-1 
            s.shift();
         }
         break;
         case true:
         if (s[0] === '0' && s[1] !== '.') {  // ミス 1-2
            s.shift();  
         }
         if (s[sl - 1] === '0') {  // ミス 2 
            s.pop();
         }
         break;
      }
      for (let j = 1; j + i < sl; j++) {
         if (s[i] === '.' && s[i + j] === '.') {  // ミス 3
            s.splice(i + j, 1);
         }
      }
   }
  console.log(s.join(''));
});
hogeちゃんの画像

入力を一文字ずつの配列として受取って 表記ミス修正するために switch文 と if文 を組み合わせて条件分岐しています。

【表記の訂正】コード 2/2

reader.on('close', () => {
   const s = lines[0].split('.');  // 入力を(.)区切りの配列に変換
   if (s.length === 1) {  // s の要素数が 1 (入力が(.)を含まない)なら…
      let num = s[0];  // nums[0] で初期化
      let i = 0;  // カウンタ変数 i を 0 で初期化
      while (num[i] === '0') {  // num[i] が "0" の間
         i++;  // i を 1 増やす
      }
      num = num.substring(i);  // num の部分文字列(i文字目〜最後)で num を上書き
      console.log(num);
   } else {  // s の要素数が 2以上 (入力が(.)を含む)なら…
      let num1 = s.splice(0, 1)[0];  // num1s から s[0]を切り取った値
      let num2 = s.join('');  // num2s から num1 を切り取った残りを結合した値
      let i = 0;  // カウンタ変数 i を 0 で初期化
      while (num1[i] === '0' && i < num1.length - 1) {  // num1[i]が "0" の間
         i++;  // i を 1 増やす
      }
      num1 = num1.substring(i);  // num1 の部分文字列(i文字目〜最後)で num1 を上書き
      i = num2.length;  // i の値をを num2 の文字数で上書き
      while (num2[i - 1] === '0') {  // num2 の末尾から調べて num2[i - 1] が "0" の間
         i--;  // i を 1 減らす
      }
      num2 = num2.substring(0, i);  // num2 の部分文字列(最初〜i-1文字目)で num2 を上書き
      console.log([num1, num2].join('.'));  // num1num2 を(.)で結合して出力
   }
});
hogeちゃんの画像
(.)が複数含まれる場合 一番左が正しい位置なので um1s の最初の要素。 num2 は 2 番目以降の要素を結合した値を代入しました。um1 から先頭の連続する0を,  num2 から末尾の連続する0を除いて (.) で結合して出力しています。

コメント