pythonで生年月日占いを作ろう

2021年3月9日Python,プログラミング,教室レポート

pythonで作る生年月日占い

おはようございます。楓プログラミングスタジオのたっきーです。
今日は、前回の桑名JEUGIAの課題にも使った"pythonで作る生年月日占い"を紹介したいと思います。

生年月日占いとは

たっきー
たっきー
今回の課題は、pythonで生年月日占いを作りたいと思いまーす。
先生ー、生年月日占いってなんですか?
yotaくん
yotaくん
たっきー
たっきー
生年月日占いは、"生年月日の桁を足していき、最後に残った一桁の数字があなたの性格を表すナンバーになる"という占いだよ。
ふーん。
yotaくん
yotaくん
たっきー
たっきー
じゃあ、具体例でご紹介するね!

1. 自分の誕生年(西暦)、誕生月、誕生日の数字を足してください。
例:1981年04月12日 1981+04+12=1997
2. 「1」で出た答えを一桁ずつ分けて、全て足してください。
例: 1997 1+9+9+7=26
3. 数字が一桁になるまで計算を続けます。
例: 26 2+6=8

たっきー
たっきー
このナンバーがあなたの性格を表しているよ。上記の例だと…、“8"だから“大物"ということになります。分かったかな?
(ちなみに、僕はロマンチストになりました。あたってます…)

1:アイデアマン
2:平和主義
3:お祭り好き
4:保守的
5:パイオニア
6:ロマンチスト
7:インテリ
8:大物
9:エンターテイナー

たっきー
たっきー
これはアメリカで話題になった占いとのことで、「Higher Perspective」の記事で紹介されています。

pythonで生年月日の桁を足す方法

生年月日はinputで入力するとして、生年月日の桁をどうやって足したらいいんですか?
yotaくん
yotaくん
たっきー
たっきー
どうやったら各桁の数字を取り出せると思いますか?
数字で扱う方法や文字列として扱う方法など、いくつかやり方があると思うので、説明したいと思いまーす。

入力した生年月日から各桁の数字を取り出すには?

  • pythonから生年月日の西暦と誕生月、誕生日を入力してもらい、4桁の数字を計算します。先に登場した例の場合、1997の数字となりますね。この4桁の数字から1桁ずつ数字を取り出す方法を考えます。
  • 方法1:
    • 変数に格納されている4桁の数字(例:1997)から4桁目の数字を取り出したいので、変数から「2000」を引く。答えが負の数(「0」以下)なら1桁目は「1」であり、正の数(「1」以上)なら「2」となります。
    • 次に残った3桁の数字(例:997)から3桁目の数字を取り出します…。
    • この方法を採用した場合、9種類の数字に合わせた場合分けが必要となり、効率的ではありません。
number = 1997
flag4 = number - 2000
if flag4 > 0:
    number = number - 2000
    print(" 4桁目: 2, 残りの桁" + str(number))
else:
    number = number - 1000
    print(" 4桁目: 1, 残りの桁" + str(number))
このやり方…、ちょっとめんどい。もっといい方法ないんですか?
yotaくん
yotaくん
  • 方法2:
    • 変数に格納されている4桁の数字(例:1997)をビット演算でマスクして一桁ずつ取り出す方法はどうでしょうか。ビット演算を使うことで、数字を2進数に置換して、その各桁をAND(掛け算)することで好きな桁を取り出すことができます。
    • 例えば、2進数の0b11011101(10進数だと221になります)と2進数の0b10000000(10進数だと128になります)をANDすると8桁目の数字(一番左のビット)を取り出すことができます。
    • この方法を採用した場合、2進数は簡単に一桁を取り出すことができますが、10進数の一桁を取り出すことは簡単ではありません。2進数の一桁と10進数の一桁が対応していないため、とても複雑になってしまいます。
>>> bin(0b11011101 & 0b10000000)
'0b10000000'
2進数? ビット演算? マスク??
yotaくん
yotaくん

入力した生年月日を文字列として扱う

たっきー
たっきー
実は、もっといい方法があります。
え”ー!?
yotaくん
yotaくん

  • 次に、入力した生年月日を文字列として扱う方法を考えてみましょう。
  • split関数を使う方法もありますが、pythonの場合はリストを使うことで、簡単に文字列を1文字ずつリストの各変数に格納することができます。
  • pythonの場合は、さらにfor文にenumerate関数を組み合わせることで、リストのインデックスと中身を同時に参照することができます。
str = "1997"
yourbirthday = list(str)
sum = 0
for i, day in enumerate(yourbirthday):
    sum = sum + int(day)
print(sum)

最後に

たっきー
たっきー
生年月日を文字列として扱って、一桁ずつ数字を取り出す方法が分かったね。この方法で数字を全て足してみよう。
性格を表すナンバーが分かったら、どうやって性格を表示したらいいですか?
yotaくん
yotaくん
たっきー
たっきー
性格を表示する部分は、if文とelif文で作ろう。あとは自分で考えてみよう。
はーい。がんばりまーす。
yotaくん
yotaくん