paizaの森練習問題コンテスト(2022/4/28開催)の過去問
Task
【文字列の逆順】コード
reader.on('close', () => {
const s = lines[0].split(''); // 入力値を1字毎の配列に変換
console.log(s.reverse().join('')); // s を逆順に並べ替えて 連結して出力
});
文字列のまま逆順に並べる方法は見つからなかったので split('')
で一文字ずつの配列に変換し reverse()
で逆順に並べ換え join('')
で連結して出力ました。
Task
【英単語の生成(連結)】コード
reader.on('close', () => {
const [s1, s2] = lines[0].split(' '); // 半角スペース区切りの配列を生成
console.log([s1, s2].join('')); // 連結して出力
// console.log(s1 + s2);
});
split(' ')
で半角スペース区切りの配列を生成し join('')
で連結。
【小文字にする】コード
reader.on('close', () => {
const s = lines[0];
console.log(s.toLowerCase()); // すべて小文字に変換して出力
});
toLowerCase()
で 大文字は全て小文字になりました。
【キーボードのシミュレーション】コード
reader.on('close', () => {
const N = Number(lines[0]);
let C = ''; // 表示される文字列(最初は空文字)
let lock = false; // capslockキーが offならfalse, onならtrue
for (let i = 1; i <= N; i++) {
const c = lines[i].split(' ');
switch (c[0]) { // c[0] が…
case 'capslock': // "capslock" なら…
lock ? lock = false : lock = true; // lock の true と false を反転
break;
case 'shift': // "shift" なら…
C += c[1].toUpperCase(); // c[1] を大文字にして C に連結
break;
default: // その他 なら…
lock ? C += c[0].toUpperCase() : C += c[0];
// lock が true なら c[0] を大文字にして C に連結 false なら そのまま連結
break;
}
}
console.log(C);
});
問題分の通り switch文 で条件分岐。″capslock″ のときの処理は up がtrue のときは false・false のときは true になるよう 三項演算子で制御しています。
【ラッキーナンバー】コード
reader.on('close', () => {
const N = Number(lines[0]);
const A = []; // 入力値
for (let i = 1; i <= N; i++) {
A.push(Number(lines[i]));
}
A.sort((s, b) => s - b); // 入力値を小さい順に並替え
const ans = []; // 777 になる組み合わせ
let count = 0; // 777 になる組み合わせの数
for (let i = 0; i < N; i++) {
if (count === 1) { // count が 2 であれば…
break; // 何もしない
}
let sum= A[i];
if (sum === 777) { // sum が 777 になったら…
count++; // count を加算
ans[0] = A[i];
break;
} else if (sum > 777) {
break;
}
for (let j = i + 1; j < N; j++) {
sum = A[i] + A[j];
if (sum === 777) {
[ans[0], ans[1]] = [A[i], A[j]];
count++;
break;
} else if (sum > 777) {
break;
}
for (let k = j + 1; k < N; k++) {
sum = A[i] + A[j] + A[k];
if (sum === 777) {
[ans[0], ans[1], ans[2]] = [A[i], A[j], A[k]];
count++;
break;
} else if (sum > 777) {
break;
}
for (let l = k + 1; l < N; l++) {
sum = A[i] + A[j] + A[k] + A[l];
if (sum === 777) {
[ans[0], ans[1], ans[2], ans[3]] = [A[i], A[j], A[k], A[l]];
count++;
break;
} else if (sum > 777) {
break;
}
for (let m = l + 1; m < N; m++) {
sum = A[i] + A[j] + A[k] + A[l] + A[m];
if (sum === 777) {
[ans[0], ans[1], ans[2], ans[3], ans[4]] = [A[i], A[j], A[k], A[l], A[m]];
count++;
break;
} else if (sum > 777) {
break;
}
for (let n = m + 1; n < N; n++) {
sum = A[i] + A[j] + A[k] + A[l] + A[m] + A[n];
if (sum === 777) {
[ans[0], ans[1], ans[2], ans[3], ans[4], ans[5]] = [A[i], A[j], A[k], A[l], A[m], A[n]];
count++;
break;
} else if (sum > 777) {
break;
}
for (let o = n + 1; o < N; o++) {
sum = A[i] + A[j] + A[k] + A[l] + A[m] + A[n] + A[o];
if (sum === 777) {
[ans[0], ans[1], ans[2], ans[3], ans[4], ans[5], ans[6]] = [A[i], A[j], A[k], A[l], A[m], A[n], A[o]];
count++;
break;
} else if (sum > 777) {
break;
}
for (let p = o + 1; p < N; p++) {
sum = A[i] + A[j] + A[k] + A[l] + A[m] + A[n] + A[o] + A[p];
if (sum === 777) {
[ans[0], ans[1], ans[2], ans[3], ans[4], ans[5], ans[6], ans[7]] = [A[i], A[j], A[k], A[l], A[m], A[n], A[o], A[p]];
count++;
break;
} else if (sum > 777) {
break;
}
}
}
}
}
}
}
}
}
switch (count) {
case 0:
console.log('no answer');
break;
case 1:
console.log(ans.join(' '));
break;
default:
console.log('multiple answers');
break;
}
});
入力で与えられる自然数は 8 個 以下なので 全てのパターンで 足して777になるかどうか 多重ループで調べています。値を 事前に 小さい順に並べ sum が777以上になる場合と count が 2 になった場合は 処理を止めています。コードが長くなったので いずれ整理しようかと思っていますが…。
(´ω`)
コメント