CodeIQ に出した「等比? 等差? フィボナッチ?? 」の解説解題ではない何か
CodeIQ に出した「等比? 等差? フィボナッチ?? 」の解説解題は CodeIQ Magazine (
https://codeiq.jp/magazine/2016/10/46246/ ) の方に書いたので、ここに書くのはそれ以外の何か。
出題意図
解説解題を読んでいただければわかる通り、肝は等比数列。
息をするように有理数を選んだ人(私もそうすると思う)は気づかないような肝だけど、出題意図はそこにあった。
フィボナッチはむしろオマケの感じだった。
問題文の罠
当初は「等差? 等比?」の順だったんだけど、問題文の順にテストをしたときに
「9999999990 9999999991 9999999992 9999999993 9999999994 」
のようなテストデータで失敗するように、「等比? 等差?」の順にした。
テストデータ
数列は「ハズレ」を含めて 4種類×3件 にした。
浮動小数点で来た人が不正解になるように頑張ってデータを作った。
まずは前掲のデータ。これはかなりの精度で等比数列っぽくなっている。しかしこれだけでは、評価の順序を変えると等差数列であって等比数列ではないとバレてしまう。
で。等差数列ではない、等比数列っぽい数列を探したところ。
フィボナッチ数(のようなもの)が該当することに気がついた。
たとえば、12番の「1032569015 1670731762 2703300777 4374032539 7077333316」はフィボナッチ数的な数列になっている。これが非常に等比数列っぽい。初項が異なるので、この問題の意味ではフィボナッチ数ではない。というわけで、このテストデータは2つの意味で罠になっている。
反省
64bit 整数しかないのに a1×a3=a2×a2 で判定した場合にちゃんと負けるような問題にできていなかった。
詰めが甘い。
それと。 long double だと浮動小数点でも勝ってしまう
@cielavenir
— しえる@こどふぇす2016出るよ (@cielavenir) 2016年10月28日
浮動小数点で普通に通ったで? >等比? 等差? フィボナッチ??https://t.co/sFxcUhMfRc
(ciel さん ありがとうございます)
ようで、ここも詰めが甘いなという感じ。
反省。