エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

第3回ESMどう書くを開催しました

前回開催からおよそ1年半。第3回社内向けどう書くを開催しました。

プログラミングElixir

現在、社内で「プログラミングElixir」の読書会を開催しています。

プログラミングElixir

プログラミングElixir

文法周りが一通り終わったところで、じゃぁ何か書いてみようと、開催したもの。Elixirオンリーという変則どう書く。

とはいえ不慣れな言語では一時間で書けるコードにも限界があるし、かといって一時間で書ける程度の問題ではあまり面白くない。変則レギュレーションというならと、時間設定も変則にして出題から解答発表まで一週間の時間をとりました。「オフラインリアルタイムどう書く」とは別の形の「どう書く」でした。

そして問題

こちらが出題した問題です。


今回はたっぷりと1週間も時間をとったのだからと…

…と私が好きなものを色々混ぜてみました。それだけでなくて、

  • 言語レベルでバイナリ操作ができる
  • エンコード、デコードにパタンマッチが使える
  • 再帰構造

と、Elixir で表現するにはうってつけだと想像、あるいは妄想しての出題。


ちなみにカルキュラマシーンという名前に反応した方は昭和40年代生まれの可能性が高いです。

閑話休題


今回はElixirで書くことに注目していたので、手順自体はルールに書いたことがほぼすべて。これを Elixir でどのように表現するかが実質の課題でした。

  1. 十六進数をビット列や 0/1 のリストにする
  2. パタンマッチを使ってデコードする
  3. トークン(オペランドとオペレータ)に分解
  4. 計算可能な構造を構築
  5. 計算
  6. 結果の数値のデコード
  7. 解答文字列の構築

予想外に難題だったビット列取り出し

デコードや演算処理で頭を悩ませることは想像していたのですが、最初のビット列の取り出しでつまずく人多数。

たとえば、1桁の16進数を4桁の2進数に変換する場合。2進数にしたときに最上位の桁が1であれば [https://hexdocs.pm/elixir/Integer.html#to_string/2:title=Integer.to_string][https://hexdocs.pm/elixir/Integer.html#digits/2:title=Integer.digits] を使って簡単に4桁の2進数を作れるのですが、

Integer.to_string(String.to_integer("c", 16), 2) # => "1100"
Integer.digits(String.to_integer("c", 16), 2) # => [1, 1, 0, 0]

上位の桁が0のばあい、単純な変換ではそれらの桁が落ちてしまいます。

Integer.to_string(String.to_integer("4", 16), 2) # => "100"
Integer.digits(String.to_integer("4", 16), 2) # => [1, 0, 0]

上位に気をつけないとうまく取り出せない0の桁がある、下位にパディングとして付加された利用しない0がある、の二つが重なって難儀することになったようです。

そして今回も出題不備が…

今回の問題の中には冪演算が登場するのですが、Elixir には冪演算の演算子や関数がありません。そこでつい親切心を出して Erlangmath ライブラリをヒントとして紹介したのですが、これが解答者を混乱させる結果に。

math ライブラリにある pow 関数は戻り値が浮動小数点数です。求めたい値が整数値の整数値乗だとしても浮動小数点数の値として返ってきます。そして浮動小数点数には精度というものがって、今回の問題中の冪演算をすると精度がたりなくて正しい値にならないのでした。

出題内容と別のところで解答者を惑わすという失態。


問題は、アイディアが降りてくれば作ること自体はすごく難しいというわけではないのですが、それをきちんと解答者に伝えるようにすることは、相変わらず難しい…。


第4回もやります

今回は学習中の一つの言語に絞ってみんなで書いてみたことで、書き方、ライブラリの使い方、もろもろ学ぶことができました。
だいぶ変則的な開催となりましたが得られたものは多かった気がします。

レギュレーションがどうなるかはわかりませんが、次もやる予定です。


…出題の詰めの甘さをどうにかしたい。

いつか読むはずっと読まない:バイナリのたのしみ

Elixirはバイナリの扱いが得意ですが、それならばこれ。もう何度もこのブログで紹介していますが、この本は楽しいです。

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

  • 作者: ジュニア,ヘンリー・S.ウォーレン,Jr.,Henry S. Warren,滝沢徹,玉井浩,鈴木貢,赤池英夫,葛毅,藤波順久
  • 出版社/メーカー: エスアイビーアクセス
  • 発売日: 2004/09
  • メディア: 単行本
  • 購入: 35人 クリック: 732回
  • この商品を含むブログ (128件) を見る


しばらく入手困難な状態でしたが、現在はオンデマンド版で入手可能なようです。

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

  • 作者: ジュニア,ヘンリー・S.ウォーレン,Jr.,Henry S. Warren,滝沢徹,鈴木貢,赤池英夫,葛毅,藤波順久
  • 出版社/メーカー: エスアイビーアクセス
  • 発売日: 2015/01
  • メディア: 単行本
  • この商品を含むブログを見る