アルゴリズムを学習する【第1回:年齢計算】
代表的なアルゴリズムに、データを並べかえるソートアルゴリズムがあります。そのソートアルゴリズムにも様々な種類があり、バブルソートやクイックソート、マージソートなどがあります。 私自身、これらの有名なアルゴリズムを少しずつ学習していければいいなと考えています。 ですが、そういった有名なアルゴリズムが説明されているウェブサイトはたくさんあるので、ここでは、もう少し身近なもので、「これってどうやってロジックを組み立てているんだろう?」と、私が興味を持ったものを学習し、そのブログを書いていきたいと思います。
使用言語:Python3(これから学習していきたいと考えているので?)
今回は、年齢計算です。
誕生日と今日の日付から年齢を算出する方法を考えていきたいと思います。
前提条件として、 ・算出する年齢は満年齢 ・何ヶ月何日までは計算しない
最初に思いつくのは、シンプルに「年」だけ引くということです。
今日の日付の西暦 - 生年月日の西暦 = 年齢
例えば
誕生日:1990年2月26日
今 日:2022年2月25日
だとすると
2022 - 1990 = 32
32歳となりますが、実際は、まだ、誕生日が来ていないので31歳が正しい年齢です。
誕生日が来ているのと来ていないのとでは満年齢が違うということがわかります。 では、どうすればよいかを考えます。 考えていくと、2とおりのことを考える必要がでてくることがわかってきます。 ①誕生日の「月」と今日の「月」が同じ場合 ②誕生日の「月」と今日の「月」が異なる場合 です。
では、この2つをそれぞれ考えていきます。 ①誕生日の「月」と今日の「月」が同じ場合 誕生日の「日」が今日の「日」より大きければ、その年の誕生日はまだ来ていないので、 先程計算した年齢から「1」を引けば、算出する年齢になります。
②誕生日の「月」と今日の「月」が異なる場合 誕生日の「月」が今日の「月」よりも大きいと、その年の誕生日はまだ来ていないので、 先程計算した年齢から「1」を引けば、算出する年齢になります。
以上のことをロジックとして組み立てると、正確な満年齢が算出されることがわかりました。 では、これをコーディングしていきます。
import datetime
# 誕生日を定義する
birthday = '1990-02-26'
# 文字列をdate型に変換する
date_birth = datetime.datetime.strptime(birthday, '%Y-%m-%d')
# 今日の日付を取得する
today = datetime.date.today()
# 誕生日の西暦・月・日をそれぞれ取得
birth_year = date_birth.year
birth_month = date_birth.month
birth_day = date_birth.day
# 今日の西暦・月・日をそれぞれ取得
today_year = today.year
today_month = today.month
today_day = today.day
# 今日の西暦から誕生日の西暦を引き算して変数に入れる
age = today_year - birth_year
# 誕生日の「月」と今日の「月」が同じ場合
if birth_month == today_month:
# 誕生日の「日」が今日の「日」より大きい場合
if birth_day > today_day:
# 最初に算出した年齢から1を引く
age -= 1
# 誕生日の「月」が今日の「月」より大きい場合
elif birth_month > today_month:
# 最初に算出した年齢から1を引く
age -= 1
# 算出した満年齢を表示
print(age)
満年齢を算出するプログラムが書けました。
さて、ここでもう少し考えます。もっと他に簡単に算出する方法がないかなーと。。。
上記のロジックの最初に西暦同士を引くところがありましたが、「月」「日」も同時に引いてみるとどうなるかを考えてみます。
例えば、 誕生日が1990年2月25日として考えてみます。
まず、今日の日付が誕生日の1日前の2022年2月24日だと(まだ誕生日が来ていない) 20220224 - 19900225 = 319999
次に今日の日付が誕生日と同じ月日の2022年2月25日だとして計算すると 20220225 - 19900225 = 320000
そして、今日の日付が誕生日の1日後の2022年2月26日だと(誕生日を過ぎている) 20220226 - 19900225 = 320001
誕生日が来ていないと、下4桁の引き算をするとき、西暦部分から数値を借りてくる必要があるので西暦部分の引き算の結果が、満年齢から1を引いた数字になります。
以上のことから、今日の日付から誕生日の日付を引いた数を10,000で割り、小数点以下を切り捨てると満年齢が算出できることがわかります 。
では、これをコーディングします。
import datetime
import math
# 誕生日を定義
birthday = '1990-2-24'
# 今日の日付を取得
today = datetime.datetime.today()
# 誕生日を数値型に変換→19900226
num_birth = int(birthday.replace('-', ''))
# 今日の日付を数値型に変換
num_today = int(today.strftime('%Y%m%d'))
# 今日の日付から誕生日を引き算した後、10000で割り、小数点以下を切り捨てる
age = math.floor((num_today - num_birth) / 10000)
# 算出した満年齢を表示
print(age)
先程のプログラムよりだいぶすっきりしました。
今回は、比較的な簡単な年齢計算を考えてみました?

