素因数分解botについて
おはようございますこんにちはこんばんは。
一部の界隈にはどうも今日は大事な日らしいですが、いかがお過ごしでしょうか。
なんかブログ記事書きたい気分だけどネタがねぇな
— やっすん (@yasuand) 2013, 12月 23
ということで6時間くらい内容考えて、そういえば5月くらいに稼働を始めてから一度も素因数分解bot(@yasuand_bot_f)について全く詳しい説明とか書いてないというのを思い出したので書きます。
素数だ!うおおおおおおおおおおおおおおおおおお!!!*1
何をするbotか
まず。ツイ廃あらーととツイート数カウントくんで自動的に投稿される、
私は 12/22 20:03 以降 104 回呟きました。(前日比:+37回) #countkun @yasuand
— やっすん (@yasuand) 2013, 12月 23
@yasuand @yasuandd @yasuand_bot_f 12-23のポスト数:205 (うちRT:3)
— やっすん (@yasuand) 2013, 12月 23
というようなツイートに含まれる、その日のpost数を素因数分解します。
ツイ廃あらーとで流れてくる、
@yasuand @yasuandd @yasuand_bot_f 12-24に入ってから100ポストに到達しました!(現在およそ102ポスト)
— やっすん (@yasuand) 2013, 12月 23
というようなツイートは素因数分解の対象ではありません。
また、
@yasuand_bot_f 12345678901234567890
— やっすん (@yasuand) 2013, 12月 23
@yasuand 2*3*3*5*101*3541*3607*3803*27961
— やっさん@素因数分解bot (@yasuand_bot_f) 2013, 12月 23
というように直接@で数字を投げても素因数分解します。
他の機能
post数が素数だったり、@で素数を投げられるとふぁぼります。
また、その日の00:00:00~00:10:00の間にツイ廃あらーとで流れてきたpost数のうち、最小素因数が一番大きい人に対して表彰をして、対象のツイットをふぁぼります。ツイート数カウントくんの自動投稿は表彰機能の対象外ですし、またツイ廃あらーとの投稿であっても残念ながら00:00:00~00:10:00の間には流れてこなかったものも表彰機能の対象外です*2。
最小素因数は、「合成数nの素因数のうち一番小さいもの」という意味で使っています。つまり、post数が素数(もしくは1)であれば自動的に表彰機能の対象外になります。
どうやって動かしているか
アルゴリズムは簡単で、UserStreamで流れてきた投稿に対して正規表現にマッチングするかどうか調べて、それと同時に投稿文字列からpost数を表す文字列を抜き出してそれを数値に変換して素因数分解しているだけです。
素因数分解のアルゴリズムも単純で、単に試行除算しているだけです。難しいなんちゃら法とかよくわかんないし。
制限
post数が1だったりだとか、@で1を投げられると素因数分解しません。最初はそのまま1と返していましたが、あまりにも味気ないしいい返しも思い浮かばなかったのでスルーすることにしました。
数字の上限についても、大きい数字を投げられてもわりと平気で、Rubyで書いているので自動的に多倍長整数の演算をしてくれます。Ruby賢い。
ただし、やはり140桁の整数*3が素数かどうか判定しろとかいわれても現実問題としてこれはほぼ不可能に近いので、試行除算の回数が一定数以上だったり素因数分解後の結果が140字におさまらないときはスルーします。
素因数分解しないときにスルーする仕様はユーザに対して優しいのかどうかちょっと悩みどころ。
ツイ廃あらーととツイート数カウントくんについては投稿元クライアントの名前とURLも見ているので、他クライアントから文字列をコピペしたり改変したりして呟いても素因数分解しません。@で直接数字を投げた場合は投稿元クライアントは見ていないので素因数分解します。
また、全角数字は数字ではないので、全角数字が混ざっていると素因数分解しません。
なぜ作ったか
そのときのノリで作った。後悔はしていない。
最後に
こういうクソbotでもいいので、知っている/使える技術を組み合わせて何か作るのは学習のモチベにもなるのでとてもいいと思います。何か作るときはたいてい自分が今使える技術だけでは作れなくて何か調べたり考えたりしながら作らないといけないと思っているので、モチベの向上以外にも実際に技術を修得するのにとても役立ちそうです。
実際に手を動かす作業はプログラミングとかに限らずどの分野でもとても大事な作業だと思うので、(僕私にはあまりいいもの面白いものが作れないから…)などと尻込みしている人は是非挑戦してみましょう。
それではよいお年を