ようやくBランクか。。。
面倒くさいので画面パタメータをListでもらった後のFunctionだけ
ちなみに引数のListを作ってる箇所はこっちの記事に書いてあるYO!!
なんなら今回から入力チェックすらめんどくさくなったので、正常系のデータしか勝たん。
3dPrinter.js
// [問題文(原文)]
// あなたは念願の3Dプリンタを購入しました。早速、いろいろな立体を出力して楽しみましょう!
// 3Dプリンタに入力される立体のデータは、大きさ 1×1×1 の立方体(セルという)を一つ以上組み合わせることで得られます。より正確に述べると次のようになります:
// 三次元空間で図1のような座標系 (x,y,z) を考えます。
// 立体データは、各座標 (x,y,z) でのセルが立体に含まれるかどうかを指定することで得られます。例えば、図2の立体は 14 個のセル (1,1,1), (1,2,1), (1,3,1), (2,1,1), (2,2,1), (3,1,1), (1,1,2), (1,2,2), (2,1,2), (2,2,2), (1,1,3), (1,2,3), (2,1,3), (2,2,3) を組み合わせることで得られます。
// あなたはまず、出力したい立体のデータを作りました。あとは、データを3Dプリンタに入力して印刷するだけです。
// しかし、データにミスがあっては大変です。慎重なあなたは、実際に印刷を始める前に、出力される立体を正面(x軸の正の方向)から見たときの図を求めてみることにしました。(図3)
// 立体のデータが入力された時、この立体を正面から見たときの図を出力するプログラムを書きましょう。
function threedPrinter(lines) {
// めんどくさくなったので入力チェック省略
const xyz = lines[0].split(" ");
const seeX =
Array.from({ length: xyz[2] }, (v, k) => Array.from({ length: xyz[1] }, (v, k) => Array.from({ length: xyz[0] }, (v, k) => [])));
let zIndex = 0;
let yIndex = 0;
lines.slice(1).forEach(line => {
if (line === "--") {
zIndex++;
yIndex = 0;
return;
}
seeX[zIndex][yIndex] = Array.from(line);
yIndex++;
});
// 一番上から見るためにリバースしてからぶん回す
seeX.reverse().forEach(z => {
const shows = Array.from({ length: xyz[1] }, (v, k) => ".");
z.forEach(y => y.forEach((x, i) => shows[i] = (x === "#") ? x : shows[i]));
console.log(shows.join(""));
});
}
module.exports = {
threedPrinter
};
とりあえずZYXの多重配列に変換してから、
それを逆転してYのループ中に#があったらそのYの位置のXは#と確定させてる感じ。
ちなみに渡ってきた配列のループで設定する方法だともっと簡潔に書ける
3dPrinter.js
function threedPrinter(lines) {
const xyz = lines[0].split(" ");
let zIndex = 0;
const result = Array.from({ length: xyz[2] }, (v, k) => Array.from({ length: xyz[1] }, (v, k) => "."));
lines.slice(1).forEach(line => {
if (line === "--") {
zIndex++;
} else {
Array.from(line).forEach((x, index) => result[zIndex][index] = x === "#" ? x : result[zIndex][index]);
}
});
result.reverse().forEach(z => console.log(z.join("")));
}
module.exports = {
threedPrinter
};
ね、簡単でしょ?