見出し画像

難しいとは何なのか?

現在、Unityで3Dゲームを作っている。
一週間僕を悩ませたメニュー画面のアイテム移動があった。

アイテムに触れる→アイテムを取得→メニュー画面を開く→左右キーでアイテムの位置を回す→真ん中のみボタンがあって、ボタンを押すとイベント発動

「左右キーでアイテムの位置を回す」が本当に僕を悩ませ、解決に一週間もかかった。

まず左右キーを創らねばならぬ。次にメニューデザイン。
ここらは少し躓きながらも、1日足らずで解決できた。

一番悩ませた問題が左右キーのどちらかを押せば、アイテムが一つずつ右/左にずれる状態を、プログラミングで表現するかだった。

8割がた何をすればいいかはわかる。
配列を創って、ボタンを押したら±1ずつ右/左に値をずらせばいい。

残り2割は二つある。

  1. 最初と末尾の値入力

  2. 左ボタンを押して-1ずつずらす方法

何とか解決した。下記ツイートの動画を再生してほしい。

自分が陥った状況を入試問題で例えたら?

動画で見ると、すごく簡単な処理をしているように見える。
一方簡単に見える処理をプログラミングで表現すると、あるところまでサクサクできるものの、途中でつまづく。

躓く部分はプログラミング処理というよりは、国語と数学の融合問題だ。今回僕が落ちった現象を入試問題風にしてみよう。

問題

0からN(1<N)まで番号のついたカードがある。今ここにABCと名前がついた三つの箱がある。三つの箱は固定されて動かせない。並び方はCABと、Aが真ん中にある。
今、カードをシャッフルして順番に並べた。並べた後、先頭をA、二番目をB、末尾をCの箱に入れる。残りは箱の外において、シャッフルした順に並べる。末尾の次は先頭に戻り、二度とシャッフルしないものとする。
右ボタン(→)を押すと、箱中のカードをそれぞれ一つずつ右にずらす。左ボタン(←)を押すと、箱中のカードを一つずつ左にずらす。

この時、次の問いに答えよ。

Q1:N=2の時、カードの並びが012となった。C=2,A=0,B=1がそれぞれ入る。この時、

1):ボタンを右(→)を押すと、CABの中身(数字)はどう変わるか。
2):ボタンを左(←)を押すと、CABの中身(数字)はどう変わるか。
3):ボタンを2度右(→)を押すと、CABの中身(数字)はどう変わるか。

Q2:N=4の時、シャッフルしてカードの並びが25104となった。

4):シャッフル時点でCABの中身(数字)はどうなっているか。
5):ボタンを右(→)を押すと、CABの中身(数字)はどう変わるか。

Q3:N=K(K>-1)の時、右ボタンを押したときの処理を書け(本題)

数学で見たら簡単な問題かもしれない。プログラミング処理でも、途中までは簡単だ。

Q3になると、一気に頭を抱える。
この問題を解くには、プログラミングでなく図が必要となる。

答えと解説

Q1:N=2の時、カードの並びが012となった。C=2,A=0,B=1がそれぞれ入る。この時、

1):ボタンを右(→)を押すと、CABの中身(数字)はどう変わるか。

答:CAB=201(C,A,B = 2,0,1)で、今右ボタンを押すと、箱内のカードを一つずつ右にずらすので、CAB=120 //

2):ボタンを左(←)を押すと、CABの中身(数字)はどう変わるか。
答:(1)と同様に、今度は左にずらすので、CAB=012 //

3):ボタンを2度右(→)を押すと、CABの中身(数字)はどう変わるか。
答:(1)の値CAB = 120をさらに1つずらせばいいので、CAB=012 //

Q2:N=4の時、カードの並びが25104となった。

4):シャッフル時点でCABの中身(数字)はどうなっているか。
答:CAB=251でも125でもない。問題文に「先頭をA、二番目をB、末尾をCの箱に入れる」書いてあり、Cには末尾の4が入る。よってCAB= 425 //

5):ボタンを右(→)を押すと、CABの中身(数字)はどう変わるか。
答:A=4,B=2はすぐわかる。一つずつ順番がずれているので、今の末尾は0になっている(25104→42510)。よってCAB= 042 //

ここまでは少し頭が混乱しても、なんとかできると思う。
この流れをプログラミングで表現しろとなるから頭が痛い。

およその見当はつく。やってることは下記図だ。

「01234→40123→34012→23401→12340→01234」
順繰りに回っていく。明らかになっている部分は末尾、最初、二番目のみだ。

プログラミングの答えは上記ツイートに任せる。処理の見立ては簡単にできたが、はじめと末尾をどうするかが浮かばなかった。


難しいとは?

本題。難しいとは何なのか。図にしてみた。

できない×わからない場合、学習しなければならない。予習でありリサーチだ。

できないがわかる場合、脳の中ではすでに完成している。
後は実際に技術を学んで形にしていくだけ。

できるがわからない。ここが難しいの正体だ。
技術は簡単で、特定の知識を持っていれば誰でもできる。

だがすんなり思いつかない。思いつかないとは脳の中で「あれとこれ」がいまいち結びついていない。「結びつかない」が難しいだ。

世の中、ありとあらゆる問題がある。問題の大半は技術として「できる」ことだが、頭の中で「あれとこれ。あれからこれ」が結びつかない。

あれとこれを結び付けられる知恵こそが、世の中に求められてるのかなと考えている。
そして結び付けるには、情報を取り入れて、徹底的に細かく観察し、問いを立てて一歩ずつ進むしかない。

楽な道があればいいのになあ。


支援していただきありがとうございます。支援は僕の作品作りを含め、子供へのお小遣いや楽しいことに貢献します。ありがとうございます