部屋の隅っこで書く技術ブログ

Web系企業勤務のエンジニアリングマネージャのブログです。技術ブログと称しつつ技術にまつわる個人的な話題が多めです。

TokyuRuby会議12で「Project Eulerから生まれたワンライナーたち」というLTをしました

f:id:expajp:20180731231437j:plain

先週末、TokyuRuby会議12というイベントがありました。

TokyuRuby会議12 - Regional RubyKaigi

イベントの概要はこんな感じです。

  • 全編LT大会として行われる地域Ruby会議
  • スポンサーのサントリーさんによりプレミアムモルツが飲み放題
  • おつまみ他、ごはんを各自持ち寄る
  • 投票によって「LT王」「飯王」を決める

このイベントには初参加(LTでなく参加自体が初めて)だったんですが、LT王で4位をいただきました!

30人くらいの発表者がいたため、かなり好評だったようです。

プレミアムモルツ

繰り返しますが、プレモルが無料で飲み放題とかいうアタマのネジが飛んだかのようなイベントでした。

僕自身は飲むのを夢中で撮影を忘れていたので、Twitterに上がったみなさんの写真をごらんください。

togetter.com

13:30開場で14:00開始だったんですが、開始時点ですでに出来上がってる人が何名かおり、イベントの恐ろしさを感じました。

LTをしました

speakerdeck.com

Project Eulerから生まれたワンライナーたち」というタイトルでオーディエンス参加型のLTをしました。

初参加だったため、ここまで皆が猛烈に飲むとは知らずに酔ったアタマで数学の問題を解かせるという鬼畜LTになってしまいました。

それな。

ただ、いままで参加型LTをやった人はいないらしく、「斬新」と評価されたので良かったと思います。

また、最前列で大声でリアクション取ってくださってた @joker1007さんにもだいぶ助けられました。

(終わったあとトイレでたまたま一緒になったのでお礼をいえました)

ちなみに、投票で頂いたコメントはこんな感じです

f:id:expajp:20180731231746p:plain

今年の上半期は同じProject Eulerネタで見せ方を変えていろんなところで発表していたのですが、今回は結果的に集大成になりました。

また、RubyKaigiLTに出せって煽られたんですがチキって出せずにモヤモヤしてたので、そういう意味でもスッキリしました。

LTの中で「ブログで解説します」って言ってた内容は最後に。

他のかたのLT

印象に残ったというと、

でしょうか。

戦闘力の高い人たちがたくさんいたおかげで技術的にハイレベルなトークが聴けて、「勉強会」としても十二分に有意義なイベントでした。

第2問を require 'date' なしで解くワンライナーの解説

LTの中で、こんな問題を出題しました。

20世紀(1901年1月1日から2000年12月31日)中に月の初めが日曜日になるのは何回あるか?

なお, 1900年1月1日は月曜日であり, 20世紀において4の倍数の年は必ずうるう年である.

出典: Project Euler - Problem 19

require 'date'を使うと結構簡単に解ける(スライド参照)のですが、使わない場合は以下のように複雑になります。

基本のアイデアは、以下の通りです。

  • ちょうど1年前が月曜日でうるう年でないことから、1901年1月1日は火曜日である
    • この日は日曜ではないのでカウントしなくてよい
    • また、日曜日はこの日の5日後、12日後、19日後...となる
    • つまり、1901年1月1日からの経過日数を7で割ったあまりが5である日は日曜日である

これを踏まえて、アルゴリズム

  • 1901年1月から2000年11月まで、各月の日数が順に並んだ要素数1199個の配列を作成
  • 上の配列を順に足していったときの、そこまでの累積の値が入った配列を作成
    • 元の配列:[30, 28, 31, ...]
    • 作成する配列:[30, 58, 89, ...]
  • すると、この配列が格納している値は1901年1月1日から各月1日までの日数になる
    • つまり、[(1901/01/01から1901/02/01までの経過日数), (同じく1901/03/01までの経過日数), ... , (2000/12/01までの経過日数)]のような配列が出来上がる
  • この配列の各成分について、7で割ったあまりが5である日を数えれば答えが出る

のようになっています。

ごめんなさい

この解き方をするには、「1900年は4で割り切れるがうるう年ではない」ということを知っていなければいけません。

つまり、問題に情報が足りませんでした。すみませんでした。

require 'date'するなら関係ないですけど)

まとめ

  • Project Eulerをみんなに解いてもらったらLT王4位になった
  • ハイレベルなトークと美味しいお酒と美味しい食べ物
  • 第2問はrequire 'date'なしでもワンライナー可能

ぜひとも来年も行きたいですね!!

とっておきのLTを持っていきます!!