こころがホッコリー

ただイカしたRubyistになりたい人生だった。

「プログラマ脳を鍛える数学パズル」の問題をRubyで解いてみた #3

プログラマ脳を鍛える数学パズル」の回答記事、第3回目です。

問題文については、残念ながら転載が禁止されていますので、本連載(?)では自分の回答コードのみを掲載していきます。
気になってしまった方は、本を実際に購入し、解いてみることをオススメします。

Q3「カードを裏返せ」の回答コード

もちろん、私が書いたコードなので、模範回答ではありません。
コード中で使っている、measure doについては、過去記事で書いているので、こちらをご参照ください。

2回目が難しかっただけに、3回目は拍子抜けな感じでした。
力任せにぶんぶん振り回せば、答えが出てくる感じです。

Q3は、力任せにプログラムで解くのではなく、数学的に回答を導き出す方法が書籍の解説に載っています。
が、自分が同じことをパッとできるかというと、難しい気がしています......。
今後とも本連載では、多少力任せになっても、プログラムで解くことになりそうです。

「プログラマ脳を鍛える数学パズル」の問題をRubyで解いてみた #2

プログラマ脳を鍛える数学パズル」の回答記事、第2回目です。

問題文については、残念ながら転載が禁止されていますので、本連載(?)では自分の回答コードのみを掲載していきます。
気になってしまった方は、本を実際に購入し、解いてみることをオススメします。
(実務経験数年のエンジニア何人かの勉強会で、みんなで解いていますが、結構難しいです)

Q2「数列の四則演算」の回答コード

もちろん、私が書いたコードなので、模範回答ではありません。
コード中で使っている、measure doについては、過去記事で書いているので、こちらをご参照ください。

2回目から重たい問題でした....。
evalで、組み立てた数式を評価させればいい、
というところまでは割とたどり着くのですが、
その「数式を組み立てる」という部分が大変です。
本回答では、productという、Array同士の組み合わせを生成するメソッドを使ってみました。
また、0除算や、不正な数値(08など)を避けるために、苦しいですが正規表現でevalにかける前にガードしています。
模範回答よりは桁数変更への柔軟性を持たせられたと思いますが......2問目からこの難しさ、先が思いやられます。

「プログラマ脳を鍛える数学パズル」の問題をRubyで解いてみた #1

プログラマ脳を鍛える数学パズル」という本があります。

この本は、タイトルから推測できる通り、
頭を使わないとプログラムを組み立てられないお題が全70問掲載されている本です。
なお、お題の元ネタは、CodeIQで「今週のアルゴリズム」として紹介されていたものを一部改変・追加したもののようです。

問題文については、残念ながら転載が禁止されていますので、本連載(?)では自分の回答コードのみを掲載していきたいと思います。
気になってしまった方は、本を実際に購入し、解いてみることをオススメします。
(実務経験数年のエンジニア何人かの勉強会で、みんなで解いていますが、結構難しいです)

Q1「10進数で回文」の回答コード

もちろん、私が書いたコードなので、模範回答ではありません。
コード中で使っている、measure doについては、過去記事で書いているので、こちらをご参照ください。

reverseなんてメソッドがあるんですね。
Stringのメソッドで、逆順に並べた文字列を得ることができます。
paizaもそうですが、こういうアルゴリズムを考えさせられる問題を解いていると、
使えるメソッドを調べる過程で新しい発見があって良いですね。

Rubyで実行時間計測をラップするコードを書いてみた

Rubyでちょっとしたコードを書いた時、ふと、
「実行時間はどのぐらいかかっているんだろうか?」
と思うことがあります。

この疑問への解は、既に先人の方々がまとめているため、リンクを紹介しておきます。

qiita.com

qiita.com

今回やったこと

Time.nowでやると、コードは簡潔に書けるが、ms単位でしか測れないため、短時間で実行が終わるコードには使えない。」
benchmark を使うと、詳細な実行時間を取れるが、実行時間を表示するコードを書くのに数ステップ書かないといけない。」

というわけで、「1ステップで書けて」「詳細な実行時間が取得できる」ように、benchmarkの利用部をラップしたコードを書いてみました。

コード

使い方

使い方は簡単。 requireしていただいた上で、

measure do { __計測したい処理__ }

を書くだけです。 ブロックで渡した処理が、そのままライブラリ側の yield で実行されます。
ライブラリ側では Benchmark.measure do にブロックで渡した yield が実行されます。
(言い方を変えれば、計測区間の中に、計測したい処理を挟み込めるようにしています。)
その後、結果を出力する処理まで含めていることで、「簡潔に」「詳細な結果」を出力できるようにしています。

やっていることは単純ですが、サンドボックス的なプロジェクトに置いておくと、
簡単に実行時間計測を書くことができて便利です。

はてなブログの下書きプレビュー公開機能が、地味に便利だった

はてなブログに、下書きプレビュー公開機能(?)があるのをご存知ですか?
この機能を使うと、なんと 下書き状態であっても、URLさえ知っていれば誰でも見れるようになります。
Googleドキュメントの、非公開URLに似たノリですね。(あれ便利ですよね)

使い方は、はてなブログの下書き一覧にアクセスして、リンクマークをクリックするだけです。

f:id:muramurasan:20160522230956p:plain

実際にこのリンクを発行してみると、下記リンクのような感じになります。

http://muramurasan.hatenablog.jp/draft/tMUu9XH7Msm7evbOfMaxPoKPuDM

公開前にレビューをもらう時や、第三者に公開の許可をもらう時に、この機能は役立てそうですね!