プログラミング力を上げる論理クイズの楽しみ方

プログラミング力を上げる論理クイズの楽しみ方

皆さんはクイズは好きですか?
テレビ番組でもクイズがメインの番組は人気があるように思います。
今回はそんなクイズの中でも論理クイズをテーマとして、
楽しみながらプログラミング力を上げる方法を考えていきます。

論理クイズ

クイズと言うと知識を問われる問題をイメージする方も多いかと思いますが、
論理クイズは知識はほぼ不要で思考力や発想力が問われる問題です。
試しに一問チャレンジしてみましょう。

【問題】
AとBがじゃんけんをしました。
AとBはそれぞれ、
  A:グーを2回、チョキを7回、パーを1回
  B:グーを3回、チョキを3回、パーを4回
出しました。
このじゃんけんでは引き分けはありませんでした。
AとBのどちらが多く勝ったでしょうか?

制限時間5分くらいで考えてみてください。
勘の良い方なら1分くらいでパッと分かるかと思います。
答えはこの記事の一番下に書いておきます。

解けたかどうかは置いておいて、
今回お話ししたいのはその解き方についてです。

プログラミング力を上げる解き方

先ほどの問題の解説をしつつ、
2通りの解き方を考えていきます。

まずはオーソドックスな解き方から。
引き分けが無いという条件を気にしつつ問題を見ていると、
Aのチョキが7回、Bのグーとパーが合わせて7回と同数となることに気づきます。
つまりチョキ対グーが3回、チョキ対パーが4回発生したことが確定します。
同じようにAのグーとパー、Bのチョキについても調べると
10回のじゃんけんの結果が全て確定して答えが出ます。

普通に解くだけならこの方法がベストかと思いますが、
今回おすすめしたいのは次のような方法です。

起こり得る全てのパターンを考えることで答えを求めていきます。
まずAがどういう順番で手を出すかという組み合わせを全パターン書き出します。
「ググチチチチチチチパ」「グチグチチチチチチパ」…と書き出していきます。
(10!/2!7!1!=360通り)
Bについても同様に全パターン書き出していきます。
ここで引き分けが無いという条件があるので、
同じタイミングで同じ手を出しているパターンを除外します。
そうして残ったパターンについて勝敗を確認することで答えが出ます。

一見時間もかかる大変な解き方ですが、
プログラミング力が上がりやすいのは後者です。
コンピュータは単純作業を高速でこなすのが得意なので、
前者の解き方のような発想力や観察力を活かした方法よりも、
後者のような泥臭くても単純な方法をプログラミングの際は求められます
また、出した手の数が変わっても解き方が変わらないという汎用性を意識することも
プログラミング力が上がる一要因となります。

まとめ

仕様書には簡単そうに書いてあるのにコードにしてみると難しい、
という話は違う考え方を求められるのが原因かと思います。
普段から「これをコードで書くとどうなるだろう?」と考える癖を付けておくと、
プログラミングの速度を鍛える良い訓練になりそうですね。

問題の答え:6対4でA