こんにちは、2021年2月入社のFです。
現時点でうちなーてっくに一番最後に入社しており、
右脳を使わせたがる「亜熱帯エンジニア」とは同期です。
古参のうちなーてっくのメンバーはスキルも高く、日頃から保守しやすいコードの書き方や、
簡潔に記述できる方法、時には私が思いも寄らない書き方や、異なる視点からのアプローチの方法を
アドバイスしてくれます。
先輩社員に習うことが多い私ですが、過去にプログラミングスクールで働いていた経験があり、
たまの週末には知り合いの子供にプログラミングを教えていたりしています。
今回は過去にプログラミングスクールで教えた中で印象に残った事例を紹介します。
みなさん、じゃんけんって知ってますか?
実は奥深くて、審判がいるじゃんけんもあるらしいですよ。
私が行うプログラミング学習においては、ある程度プログラムの構文が書ける子に
「じゃんけんゲームを作って欲しい」という依頼をします。要件は以下のみです。
- 1.自分の出す手は数字で入力する 1:グー, 2:チョキ, 3:パー
- 2.PCはランダムな数字(1〜3)をPCの手とする
- 3.2つの数字を元に「勝ち」「負け」「あいこ」を表示する
これらを踏まえて自由に作ってもらうと、子供の性格によって大体3種類の
プログラムに分かれます。
1.全部書き出す系(最も多いパターン)
最も多いパターンで、
自分の出す手と相手の出す手のパターンをもれなく書き出す方式です。
真面目で素直な子が多い印象で、問題の意図を汲み取る空気を読む大人な子が多い気がします。
1 2 3 4 5 6 7 8 |
import random myHand = int(input('自分の手')) pcHand = random.randint(1, 3) if ( myHand == pcHand ): print('あいこ') if ( myHand == 1 && pcHand == 2 ): print('勝ち') -----------------省略--------- |
2.アルゴリズム使う系(数学好き、負けず嫌いパターン)
勝ち、負け、あいこの条件を数式で簡潔に記述した書き方です。
1の方法では条件式が多くなり、じゃんけんの「勝ち」、「負け」、「あいこ」の
3パターンでシンプルにできるはずだ!と追求するタイプ。
数学とか、パズルゲームが好きが多い印象で、負けず嫌いの子も多い印象があります。
1 2 3 4 5 6 7 8 9 10 11 |
import random myHand = int(input('自分の手')) pcHand = random.randint(1, 3) print(myHand, pcHand, result) if( result == 0 ): print('あいこ') elif( result == 1 ): print('負け') elif( result == 2): print('勝ち') |
プログラムの内容は少し複雑ですがそれぞれの手の差に3を加えて3のあまりを求めると
0:あいこ、1:負け、2:勝ちと言う結果が得られます。
自分↓PC→ | 0:グー | 1:チョキ | 2:パー |
---|---|---|---|
0:グー | あいこ(差:0) | 勝ち(差: -1) | 負け(差:-2) |
1:チョキ | 負け(差:1) | あいこ(差:0) | 勝ち(差: 1) |
2:パー | 勝ち(差: 2) | 負け(差:1) | あいこ(差:0) |
例)自分がグー、PCがチョキの場合
3.超効率化型(個性的)
1/3の確率で勝ち、負け、あいこを出す超効率化パターン。
自分の手、相手の手を完全無視します。
じゃんけんで各状態が出る確率は1/3という点だけに注目した書き方。
個性的な子やちょっと拗ねた子が多い印象です。
1 2 3 4 5 6 7 8 9 10 |
import random myHand = int(input('自分の手')) result = random.randint(1, 3) if(result == 1): print('まけ') elif(result == 2): print('かち') elif(result == 3): print('あいこ') |
私がプログラミングを始めた時にこの問題が出されていたらこのような解き方はできなかったと思います。
プログラミングの学習という点では意図した回答ではないのですが
じゃんけんの本質みたいな部分を捉えてる気がして感心したことをよく覚えています。
プログラマの3大美徳に怠惰というものがありますがまさに怠惰なプログラムだと思います。
血液診断よりは当たると思うのでプログラミング好きなお子さんがいらっしゃる方
ぜひお試しください。