筆者について
name → Koki Teramoto
age → 18
language → ja_JP, en_US
本編
今日は大学共通テスト2日目でした!リアルタイムに解いてた受験生としてはどんな問題が出るのがオドオドしていたのですが、実際は模試に出たコードなんかよりもよっぽど簡単なものでした。今回は、実際に出た問題をPythonでコード化して、リファクタリングしていきたいと思います。
問題について
さて、問題は新聞やもう少しすると過去問として大学入試センターに載ったりしますので、各自こちらの方は見ていただきたいと思います。参考までに、福祉新聞が問題をPDFで掲載していますのでそちらのリンクを載せておきます。
プログラミング分野の問題は第3問で出題されました。要するに、以下のような問題です。
- あなたは今工芸部にいる!
- あなた含めて3人の部員と共に9つの作品を作る。
- 作品ごとにかかる作成日数がある。
- 作品は1番のものから順番に作っていき、一番最初に手持ち無沙汰になる人が次作品を担当する
まあこんな感じです。詳しくは問題を読んでください。
最終的に問題で出るコード
最終的に問題を解いて行ったら以下のようなコードに辿り着きます(というかたどり着いて欲しい)
Nissu = [4,1,3,1,3,4,2,4,3]
kougeihinsu = 9
Akibi = [1,1,1]
buinsu = 3
for koigeihin in range(0,kougeihinsu):
tantou = 1
for buin in range(1, buinsu):
if Akibi[buin] < Akibi[tantou - 1]:
tantou = buin + 1
print(f'工芸品{koigeihin + 1}→部員{tantou}:{Akibi[tantou - 1]}日目〜{Akibi[tantou - 1] + Nissu[koigeihin] - 1}日目')
Akibi[tantou - 1] = Akibi[tantou - 1] + Nissu[koigeihin]
なんて見にくいことでしょうか。ちょっとオリジナルから変えてるとこもあるのですが、おおかた元通りのプログラムです。このコードには上方以外の人からでもツッコミが多発してしまいそうです。
- 無駄な変数が多い
- なんで配列のインデックスやのに0基準じゃなくて1基準やねん
- まずそも変数の名前ローマ字やめぃ
- for文多すぎる問題
なんかそんな大したことないプログラムなのにいかにもすごいプログラムかのように見えます。ということで、上で列挙した点を改善したプログラムを作成しました。
days_to_make = [4,1,3,1,3,4,2,4,3]
num_works = 9
days_clear = [1,1,1]
num_members = 3
for index_works in range(num_works):
min_index = days_clear.index(min(days_clear))
print(f'工芸品{index_works + 1}→部員{min_index + 1}:{days_clear[min_index]}日目〜{days_clear[min_index] + days_to_make[index_works] - 1}日目')
days_clear[min_index] = days_clear[min_index] + days_to_make[index_works]
これでどうでしょうか!すっかり見やすくなったと思います。ちなみに、元ツイでも書いているのですが、これ多分ロジックを考えさせるためにMax関数を使わないようにしてる気がするんですよね。それなら元のコードのfor
のネストも納得ですが、まあそれならそれでif-else
を使った方がより直感的に見やすいとは思いますね。
最後に
今回の共通テスト、なんか今年は国語でヒス構文おばさんとか色々出てて面白かったですね。来年以降も情報分野に関しては成り行きを追っていきたいと思います。ちなみに、今回はGitHubに一応ソースコードも公開してますので是非ご利用くださいませ(大学入試センターの人に届け!)
僕は共通テスト受けて(しかも社会2科目理科2科目の10科目フル受験)疲れたので就寝したいと思います。おやすみなさい〜