衆議院のコードを参議院にそのまま持っていけなかった話
同じ選挙のはずなのに、定数が1人の区と6人の区が混ざっていた。
「競っている順」という当たり前の並び替えが、いきなり通用しなくなった。
衆議院を一通り作り終えて、参議院にも同じ選挙戦モードを足すことにした。
選挙区で戦って、比例代表があって、公示から投票日まで日数を数える。骨格はほとんど同じに見えたので、正直、コピーしてちょっと直せば終わると思っていた。
「競っている順」が意味をなさない
衆議院の小選挙区は、必ず1人しか当選しない。だから「自分の候補と、いちばん票の近い相手との差」を見れば、競っているかどうかがそのまま分かる。
参議院の選挙区は違う。定数1人の県もあれば、東京都のように6人当選する区もある。6人区で2位につけていれば余裕で当確、逆に定数1の区で2位なら当確までまだ遠い。
衆議院のコードをそのまま持ち込んで「対立候補との差」で競り具合を出したら、東京都のような大きな区で数字が意味をなさなくなった。
結局、見るべきは「対立候補との差」ではなく「当落ラインとの差」——その区の定数番目の得票との差に作り直した。定数が変わっても、これなら同じ物差しで測れる。
比例代表も、ブロックの数だけ勝手が違った
衆議院の比例代表は全国を11ブロックに分けている。参議院は全国で1ブロックだけ。
ブロックが複数あることを前提にしたループ処理を持ち込むと、境界値のところで妙な挙動をしないか身構えたが、幸い参議院側は最初から「ブロックは1つ」という前提で作り直したので、その手のバグは出ずに済んだ。骨格が同じに見えても、前提が違う部分は素直に書き直したほうが早い。
もう一つ、衆議院にあって参議院に無いものがある。小選挙区と比例代表への重複立候補と、それによる惜敗率での復活当選だ。参議院にはこの仕組みがない。
おかげで、参議院側の当落判定は衆議院より単純になった。無いものを無理に持ち込まなくていい、というのも移植の中でわかったことの一つだった。
※運営者が個人で書いているnoteです。