이 포스트에서는 파이썬으로 바이오리듬 보는 프로그램을 만드는 방법을 포스팅합니다.
바이오리듬에 관한 위키백과와 나무위키의 설명은 다음과 같습니다: [한국어], [영어], [나무위키]
바이오리듬에 대해 간단히 설명하자면, 인체에 신체, 감성, 지성의 3가지 주기가 있으며 이는 각각 23일, 28일, 33일 주기로 오르락내리락 하면서 사인 곡선을 그린다고 하는 주장입니다. 하지만 과학으로 보기에는 대단히 미흡하여 일종의 점술로 취급되고 있습니다.
각 주기를 구하는 공식은 다음과 같습니다.
- 신체: sin(τ×t/23)
- 감성: sin(τ×t/28)
- 지성: sin(τ×t/33)
※ τ=2π(=6.283185…)
이 공식에 의해 신체지수는 태어난 날로부터 사인 곡선을 그리면서 23일마다, 감성지수는 28일마다, 지성지수는 33일마다 0이 됩니다.
이를 파이썬으로 코딩하면 다음과 같습니다. 편의상 여기서는 생일과 조회할 날짜를 하드코딩했습니다.
from datetime import datetime, timedelta import math BIRTHDAY = datetime.strptime("1980-12-25", "%Y-%m-%d") TODAY = datetime.now() delta = TODAY - BIRTHDAY n_days_ago = delta.days print( "당신의 생일: %s" % BIRTHDAY.strftime("%Y-%m-%d") ) print( "조회할 날짜: %s" % TODAY.strftime("%Y-%m-%d") ) print( "조회할 날짜는 당신의 생일로부터 %d일 지났습니다." % n_days_ago ) print("+------------+------+------+------+") print("| 연도-월-일 | 신체 | 감성 | 지성 |") print("+------------+------+------+------+") for i in range(-15, 16): tdelta = TODAY + timedelta(days=i) count_days = n_days_ago + i bio_phy = round( math.sin(math.tau * count_days / 23) * 100 ) bio_emo = round( math.sin(math.tau * count_days / 28) * 100 ) bio_int = round( math.sin(math.tau * count_days / 33) * 100 ) if i == 0: print("+------------+------+------+------+") print(tdelta.strftime("| %Y-%m-%d | "), end="") print("%4d | %4d | %4d |" % (bio_phy, bio_emo, bio_int) ) if i == 0: print("+------------+------+------+------+") print("+------------+------+------+------+ ")
이와 같이 생일과 조회할 날짜를 날짜 형태로 저장한 뒤 조회할 날짜를 기준으로 각 지수를 출력합니다. 여기서는 조회할 날짜의 앞뒤로 15일씩 총 31일간을 출력합니다.
이 코드는 다음과 같이 출력될 것입니다.
당신의 생일: 1980-12-25 조회할 날짜: 2019-05-13 조회할 날짜는 당신의 생일로부터 14018일 지났습니다. +------------+------+------+------+ | 연도-월-일 | 신체 | 감성 | 지성 | +------------+------+------+------+ | 2019-04-28 | -89 | 62 | 87 | | 2019-04-29 | -73 | 78 | 76 | | 2019-04-30 | -52 | 90 | 62 | | 2019-05-01 | -27 | 97 | 46 | | 2019-05-02 | 0 | 100 | 28 | | 2019-05-03 | 27 | 97 | 10 | | 2019-05-04 | 52 | 90 | -10 | | 2019-05-05 | 73 | 78 | -28 | | 2019-05-06 | 89 | 62 | -46 | | 2019-05-07 | 98 | 43 | -62 | | 2019-05-08 | 100 | 22 | -76 | | 2019-05-09 | 94 | 0 | -87 | | 2019-05-10 | 82 | -22 | -95 | | 2019-05-11 | 63 | -43 | -99 | | 2019-05-12 | 40 | -62 | -100 | +------------+------+------+------+ | 2019-05-13 | 14 | -78 | -97 | +------------+------+------+------+ | 2019-05-14 | -14 | -90 | -91 | | 2019-05-15 | -40 | -97 | -81 | | 2019-05-16 | -63 | -100 | -69 | | 2019-05-17 | -82 | -97 | -54 | | 2019-05-18 | -94 | -90 | -37 | | 2019-05-19 | -100 | -78 | -19 | | 2019-05-20 | -98 | -62 | 0 | | 2019-05-21 | -89 | -43 | 19 | | 2019-05-22 | -73 | -22 | 37 | | 2019-05-23 | -52 | 0 | 54 | | 2019-05-24 | -27 | 22 | 69 | | 2019-05-25 | 0 | 43 | 81 | | 2019-05-26 | 27 | 62 | 91 | | 2019-05-27 | 52 | 78 | 97 | | 2019-05-28 | 73 | 90 | 100 | +------------+------+------+------+
여기서는 날짜를 하드코딩했지만 응용해서 생일과 조회일을 직접 입력받는 형태로 구현할 수도 있고, 또 그래프로 그려지게끔 구현할 수도 있습니다.