[ペチパーの大冒険] ゲーム制作#20「プログラミング謎解き 中級編2」

2025/02/18

ゲーム 開発

t f B! P L
eyecatch 小学校の頃、ゲームのテトリスをファミコンか何かのゲーム機で家で遊んだ後、 学校に行った時に、いろいろな格子状のモノを見ると、頭の中で、テトリスゲームが始まってしまって、勉強が手につかなかったという事がありました。 これはいわゆるテトリスというゲームに夢中になっていた状態なんでしょうね。 いつも、すぐにブロックが積み重なってゲームオーバーになってしまうので、どうやれば効率的にブロックを積み重ねる事ができるのか・・・と、 授業中でもノートにブロックパターンを書いて、「こんな配置の時にはココに置く」みたいな図をひたすら書いていたことを思い出しました。 余談ですが、その後ぷよぷよをプレイした時も同じ状態に陥ってしまったんですね。 プログラミングという領域もこんな風に夢中になる事ができるということを、なかなか学習が進まないという人に是非経験してもらいたいですね。

謎解き: 最大効率での作業割り当て

シナリオ

あなたは、とある村の暮らしを楽にする魔法使いです。 村人たちは毎日仕事で疲れ切っている為、効率的に仕事をすることを望んでいます。 以下のルールに基づき、最適に作業を割り当てるプログラムを完成させて一番少ない時間で作業が完了する時間を計算してください。

ルール

  1. 村には n 人の村人がいます。
  2. タスクごとにかかる時間が異なります(配列 tasks で与えられます)。
  3. 村人たちは協力して、すべてのタスクを完了させる必要があります。
  4. あなたの目標は、作業する村人全員が最も短い時間で作業完了させることです。

条件

  1. 各タスクは1人の村人にしか割り当てられません。
  2. タスクの順序を変更しても構いません。
  3. 最も作業時間の短い時間数を算出してください。

入力例

  1. tasks (配列): 各タスクにかかる時間(例: [3, 2, 8, 7, 5, 1])。
  2. workers (整数): 作業する村人の数(例: 3)。
const tasks = [3, 2, 8, 7, 5, 1] const workers = 3

出力例

最も作業時間が長い村人の負担が最小化された場合の作業時間。 console.log(assignTasks(tasks, workers)) // 出力例: 10

この問題で学べるポイント

  1. グリーディアルゴリズムの考え方 - 各ステップで最善の選択を行い、全体の最適解を目指します。
  2. 配列操作のスキル - 配列の並び替え、値の更新、最小値・最大値の計算。
  3. 効率性への配慮 - 無駄な計算を減らすことでスケーラブルなソリューションを考える。
この問題は、効率的なアルゴリズム設計や負担の分散について考える良い練習になります!

解答プログラミングを打ち込む

※ assignTasks()関数を完成させてください。

ヒント

  1. タスクを「大きい順」に並べて、最小負担の村人に順番に割り当てることで効率が良くなります。
  2. 最大負担の最小化を目指すために、負担の計算を都度更新します。

解答サンプル

回答

function decodeMessage(tasks, workers) { // タスクを降順に並び替え(大きいものから割り当てる) tasks.sort((a, b) => b - a) // 各村人の作業時間を保持する配列 let workerLoads = Array(workers).fill(0) // タスクを順番に村人に割り当て for (let task of tasks) { // 現在の負担が最も軽い村人にタスクを割り当て let minIndex = workerLoads.indexOf(Math.min(...workerLoads)) workerLoads[minIndex] += task console.log(minIndex,task) } // 最大負担を返す const max_worker_time = Math.max(...workerLoads) return max_worker_time }

解説

...+変数は、スプレッド構文(またはレスト構文)と言って、簡単に説明すると、階層を1階層上げてくれる指定処理です。 複数の変数をマージしたりする時に便利に使えます。

あとがき

問題を読んで、どうやってプログラムを書いて、その答えを出すのか? これって、何かしらサンプルがあったら理解しやすいですが、文章からプログラミングを作るって、なかなか難しいですね。 でも、仕事でプログラミングをやる場合って、実はこうした言葉による課題を、プログラミングでどうやって解決するかという事が求められます。 今回の問題は、少し難しいと感じた人もいるかもしれませんが、ヒントや答えを見ずに解こうとせずに、答えを見てみて、 自分でもっと効率のいいプログラムを書くという、リファクタリングにも似た作業をするだけでも、プログラミングって上達するので、 何度も何度も繰り返して作り直すという事も、十分な学習に繋がりますよ。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ