今回は paiza の「「落ちものシミュレーション」を解くために : part1」の問題に挑戦!
🧩 問題概要
問題の位置づけ
- Aランク「落ちものシミュレーション」シリーズの 最初の段階
- ブロックは1つだけ
何をする問題か
- 縦
H× 横Wのフィールドがある - 上から 1つの長方形ブロックが落ちてくる
- 下に他のブロックは存在しないため、必ずフィールドの底まで落ちる
- 落下後のフィールド状態を出力する
入力
- 1行目
-
H:フィールドの高さ -
W:フィールドの幅 -
N:落ちてくる長方形の数(この問題では必ず 1)
-
- 2行目
-
h_1:ブロックの高さ -
w_1:ブロックの幅 -
x_1:左端の位置(0-index)
-
※ ブロックがフィールド内に収まることは保証されている
H W N
h_1 w_1 x_1
ブロックの挙動
- 横位置
x_1は固定 - 下に障害物がない
- 必ずフィールドの最下部で停止
- 高さ
h_1分だけ、底から上に伸びる
出力
- フィールドを 上から下へ
H行出力 - 各行は長さ
W - ブロックがある場所は
# - 何もない場所は
.
入力例:
7 10 1
1 8 1
出力例:
..........
..........
..........
..........
..........
..........
.########.
✅OK例:
const rl = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
// 入力の読み取り
const [H, W, N] = lines[0].split(' ').map(Number);
// フィールドを "." で初期化
const field = Array.from({ length: H }, () => Array(W).fill('.'));
// ブロック情報
const [h1, w1, x1] = lines[1].split(' ').map(Number);
// ブロックを配置
for (let i = H - h1; i < H; i++) {
for (let j = x1; j < x1 + w1; j++) {
field[i][j] = '#';
}
}
// 出力
for (let i = 0; i < H; i++) {
console.log(field[i].join(''));
}
});
🔍コードの流れ
- readline` を使って標準入力を受け取る準備をする
- 入力を1行ずつ
lines配列に格納する - 入力終了時(
close)に以下を実行
入力の処理
- 1行目から
- フィールドの高さ
H - 幅
W - ブロック数
N
を取得
- フィールドの高さ
- 2行目から
- 最初のブロックの情報
-
h1(高さ),w1(幅),x1(左端位置)を取得
フィールドの初期化
- 高さ
H× 幅Wの2次元配列fieldを作成 - 全マスを
"."(空)で初期化
ブロックの配置
- ブロックは フィールドの最下部に直接配置
- 縦方向:
H - h1〜H - 1 - 横方向:
x1〜x1 + w1 - 1 - 対象マスを
"#"にする
※ このコードは「ブロックが1つだけ落ちてくる場合」の最小例
出力
- フィールドを上から順に
- 各行を文字列として出力
📝まとめ
入力 → フィールド初期化 → ブロック配置 → 出力