paizaの森練習問題コンテスト(2022年9月開催)の過去問
【球数制限】コード
reader.on('close', () => {
const [n, k] = lines[0].split(' ').map(Number);
const m = new Array(n); // 各回の投球数
for (let i = 1; i <= n; i++) {
m[i - 1] = Number(lines[i]); // i 回の投球数
}
const M = m.reduce((a, c) => a + c); // m の要素を全て足算した値
console.log(M < k ? 'Yes' : 'No'); // M が k 未満なら続投・さもなくば降板
});
配列の値を全て足し合わせた値が k 未満なら″Yes″でそうじゃなければ ″No″。reduce((a, c) => a + c
の戻り値は((返値,現在値)=>返値+現在値を順に処理)→最後の処理結果となるみたいね。
【最大イニング】コード
reader.on('close', () => {
const k = Number(lines[0]);
let M = 0; // 投球数
for (let i = 1; i <= 9; i++) {
M += Number(lines[i]); // 各イニングの投球数を加算
if (M > k) { // 投球数が k より多くなれば…
console.log(i); // i を出力(降板)
break;
}
}
if (M <= k) { // 投球数が k 以下なら…
console.log('Yes'); // 完投
}
});
余談ですが…。問題文を読んで 元巨人の 江川投手を思い出したゎ。
【ロボットの移動】コード
reader.on('close', () => {
const [x, y] = lines[0].split(' ').map(Math.abs); // 入力を絶対値に変換
console.log(x + y);
});
map(Math.abs)
で 入力値を 絶対値に変換してから 足し算しています。
【最大の差】コード
reader.on('close', () => {
const m = new Array(5); // 要素数 5 個の配列
for (let i = 0; i < 5; i++) {
m[i] = Number(lines[i]); // m に各値を保存
}
// 配列 m の値を展開して 最大値(Math.max())と 最小値(Math.min())を取得
const [MAX, MIN] = [Math.max(...m), Math.min(...m)];
console.log(MAX - MIN);
});
配列の値を スプレット構文(…m)で 展開して 最大値と最小値を取得しています。
【中央値】コード
reader.on('close', () => {
const m = new Array(5);
for (let i = 0; i < 5; i++) {
m[i] = Number(lines[i]);
}
m.sort((s, b) => s - b); // m を昇順に並べ替え
console.log(m[2]); // 中央値なので 0 から数えて 2番目 を出力
});
配列 m の値の 小さい順への並べ替えはm.sort((s, b) => s - b)
で実行できました。
【採点】コード
reader.on('close', () => {
const n = Number(lines[0]);
let points = 0; // 合計得点
for (let i = 1; i <= n; i++) {
const m = lines[i];
switch (m) { // m が…
case 'correct': // 'correct'なら
points += 2; // 2 加点
break;
case 'incorrect': // 'incorrect'なら
points--; // 1 減点
break;
}
}
console.log(points);
});
switch文 で 条件分岐しています。
コメント