社畜系WEBエンジニアの消耗戦

社畜系WEBエンジニアの消耗戦

修羅の国でせっせと働く社畜系WEBエンジニアのブログ

回文になる最小値を求める。10進数、8進数、2進数でね。

Swiftが煮詰まったので、頭の体操をしてリフレッシュします。これもきっと勉強のうち。

題材

同僚が持ってきてくれた本。増井さん!

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

問題

10進数、2進数、8進数で回文になる数字の最小値を求めよ。ただし、10進数で10以上の数とする。

解く前Tips

Rubyで解くんだけど、メソッドを覚えてないので、先に必要そうなものを調べる。

10進から8進、2進に変換したい!

to_s(x)メソッドで、変換したい進数を引数に渡せば変換してくれようです。奇跡的に便利。泣きそう。

逆順にしたい!

str.reverseでサクッと。

コード

ruby標準のbenchmarkを使って実行時間を計測しています。

数学パズルQ1

僕のコードだと、倍の計算量ですね...これが僕のアルゴリズム力。

模範解答の方の説明を軽く。2進で右端が0で回文させようとすると、先頭も0じゃないといけない。これだとおかしいんで、右端は絶対に1。つまり、奇数。で、10以上の奇数である11から開始させて、その後は奇数のみチェックすればOK、、ということ。

実行時間の比較

実際の実行時間はこちら。計算量分、つまり、模範解答では僕のコードの半分の時間で終わってる。くっ、つらたん。

$ ruby hoge.rb
start num : 10
ans : 585
time 0.3546799998730421ms
-------------------------
start num : 11
ans : 585
time 0.1621779811102897ms