文字列処理メニュー【日時データの変換・数値判定・重複削除・パスワード作成・表記の訂正】
【日時データの変換その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);
});
});
″ ″で区切った文字列を更に ″/″, ″:″ で区切って各変数に代入。最後に D_T にまとめて 各要素を出力しました。
【数値判定】コード
reader.on('close', () => {
const S = lines[0];
console.log(isNaN(S) ? 'NO' : 'YES'); // Number(S) が NaN になれば isNaN(S)はtrue
});
isNaN() の戻り値は引数が数値変換できなければ true になる…。(゚∇゚)
【重複の削除】コード
reader.on('close', () => {
const S = new Set(lines[0].split('')); // Set()で入力を受取り…重複した値は上書き(削除)される
console.log([...S].join('')); // S を配列内で展開→値を結合して出力
});
重複を削除するため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('')); // パスワードの文字数
});
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(''));
});
入力を一文字ずつの配列として受取って 表記ミス修正するために switch文 と if文 を組み合わせて条件分岐しています。
【表記の訂正】コード 2/2
reader.on('close', () => {
const s = lines[0].split('.'); // 入力を(.)区切りの配列に変換
if (s.length === 1) { // s の要素数が 1 (入力が(.)を含まない)なら…
let num = s[0]; // num を s[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]; // num1 は s から s[0]を切り取った値
let num2 = s.join(''); // num2 は s から 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('.')); // num1 と num2 を(.)で結合して出力
}
});
(.)が複数含まれる場合 一番左が正しい位置なので um1 は s の最初の要素。 num2 は 2 番目以降の要素を結合した値を代入しました。um1 から先頭の連続する0を, num2 から末尾の連続する0を除いて (.) で結合して出力しています。
コメント