LoginSignup
2
3

More than 5 years have passed since last update.

時刻を整数に直して素因数分解し、結果をツイートするbotを作った(xkcdネタ)

Last updated at Posted at 2017-04-05

はじめに

「PythonでTwitter使ってやるぜ!」と意気込んで、アプリーケーション登録を済ませてからあっという間に3ヶ月がたちました。何か作らねば…と考えていたところ、xkcdでこんな話を見つけました。
Factoring the Time - xkcd.com
factoring_the_time.png
この男性(?)が暇つぶしにしていた、時刻を素因数分解する作業を自動化し、結果をつぶやいてくれるbotを作りました。
こんな感じで動きます。
bot.jpg

環境

  • Ubuntu 16.04
  • Python 2.7
    • tweepy
    • sympy
    • datetime
    • time

手順

何はともあれアプリケーション登録です。たくさん記事が書かれているので、ここでは割愛します。「twitter python 登録」とかでググると、いくつか出てくるはずです。

tokenというファイルを作り、そこに取得した文字列を書き込みます。

token
"Consumer Key"
"Consumer Secret"
"Access Token"
"Access Secret"

こんな感じで書き込んだら、同じディレクトリにmain.pyを作って編集します。

main.py
# coding:utf-8
import tweepy
from datetime import datetime
import sympy
import time


def login():
    with open("token") as f:
        (consumer_key,
         consumer_secret,
         access_token,
         access_secret) = f.read().split("\n")[:4]
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_secret)
    api = tweepy.API(auth)
    return api


def get_factor_by_string(i):
    d = sympy.factorint(i)
    return "*".join(str(fact) for fact in d for num in range(d[fact]))


def get_time_by_int():
    return int(datetime.now().strftime('%H%M'))


def main():
    api = login()
    old = get_time_by_int()
    while True:
        now = get_time_by_int()
        if now != old and now != 0 and now != 1:
            old = now
            factor = get_factor_by_string(now)
            if "*" in factor:
                text = str(now) + "=" + factor
            else:
                text = str(now) + " is a prime number"
            api.update_status(text)
        time.sleep(0.1)


if __name__ == '__main__':
    main()

実行すると、ほぼ毎分時刻を素因数分解した結果をつぶやいてくれます。やったね!

解説

するまでもないと思いますが、一応…。
プログラムの流れはこんな感じです
①tweepyでtwitter認証
②datetimeで現在時刻を取得
③すでにつぶやいた時刻ならば②に戻る
④sympyで素因数分解、書式を変える
⑤結果をツイート(②に戻る)
login()でtokenにある情報を使い、Twitterの認証を行っています。get_time_by_int()datetime.now().strftime()を使い、現在時と現在分をくっつけた数字を取得します(12:30→1230みたいな感じ)。ここで、すでにつぶやき済みの時間であるか、もしくは返ってきた数字が0または1である場合には次の処理に入りません。素因数分解にはsympy.factorint()を使っています。結果は{素因数:指数,素因数:指数...}という辞書型で返ってくるので、forを使って指数を使わない掛け算だけの形に直してあげます。最後に素因数分解の結果に*が入っているか(時刻の数字が素数か)でメッセージを変えて、api.update.status()でつぶやきます。
処理のほぼすべてをライブラリに頼った結果、50行未満に収まりました。Pythonすごい。

おわりに

初のbot作成でしたが、単純なものなら結構簡単に作れると分かりました。
適当に実行してるので時々止まったりしますが、あと数日は動かしたいです。

2
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3