大海の渦 (paizaランク:B相当)
をJavaScriptで解いてみました。
あなたは参加したパーティで見た、飴を使った手品が印象に残っていました。 その手品は子供達に好きな分だけ飴を取ってもらい、それぞれの取った飴の数を当てるというものです。
この手品の手順を詳しく述べると以下になります。
- 子供たちに好きな数だけ飴を取ってもらう。
- 子供たちに横一列に並んでもらう。
- それぞれの子供に、自分自身と両隣の子供の持っている飴の個数の和を言ってもらう。 ・両端の子供には、自分自身と隣の子供の持っている飴の個数の和を言ってもらう。
- 左端の子供の持っている飴の個数だけから、それぞれの子供の持っている飴の個数を当てる。
あなたはこの手品をプログラムで再現しようと思いました。 各子供たちの宣言した飴の数と左端の子供の飴の数を与えられたときに、 子供たちの持っている飴の個数を特定するプログラムを作成してください。
解答例1(JavaScript)
それぞれの子供の発言dと最初の子供の飴の個数x_1から、それぞれの子供の持っている飴の個数を求めていきます。
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
const [N, x_1] = lines[0].split(" ").map(Number);
const d = lines[1].split(" ").map(Number);
let x = [x_1];//それぞれの子供たちが持っている飴の個数の配列
for (let i = 0; i < N - 1; i++) {
if (i === 0) { //最初の子から次の子を求める
x[i + 1] = d[i] - x[i];
} else { //次の子以降
x[i + 1] = d[i] - x[i] - x[i - 1];
}
}
//それぞれの子供が持っている飴の数を半角スペース区切りで出力
console.log(x.join(" "));
解答例2(JavaScript)
reduceを使いました。
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
const [N, x_1] = lines[0].split(" ").map(Number);
const d = lines[1].split(" ").map(Number);
console.log(
d.reduce((acc, cur, i) => {
if (i === 0) {
//次の子を最初の子から求める
acc[i + 1] = cur - acc[i];
return acc;
} else if (i === d.length - 1) {
return acc;//最後の子はそのまま返す
} else {
//それ以外
acc[i + 1] = cur - acc[i] - acc[i - 1];
return acc;
}
},[x_1]).join(" ")
);