NewLunarCalendar

From KBase

Jump to: navigation, search

__원문__ : http://www.scgyong.net/prog.php?num=5#num5

__이전__ : LunarCalendarBug 로부터 계속

어차피 DB 로 찾는 것인데, 좀 더 다른 방법을 연구하면 어떨까 하는 생각이 든다. 예로, 현재 JINOS 코드에서 한 해에 대한 정보는 (1 byte x 13 달) + 2 byte 해서 총 15 byte 이다. 이 정보는 달별로 최소한의 bit 씩만 쓰는 경우 3 bit * 13 + 9 bit = 48 bit 면 모두 표현이 가능하다.

bit 계산을 좀 더 달리 하게 되는 경우 2 bit 로 줄이는 코드도 작성해 보았다. 이 경우 26 bit 로 모두 처리 되었다. bit 를 좀 더 아끼려면, 큰달/작은달 정보만 기록하고 윤달인 달과 그 달이 큰달인지 작은달인지를 별도로 저장한다면, 1 bit x 12 + 4 bit + 1 bit 는 17 bit 로 모두 처리된다.

데이터의 단위를 32 bit 로 하게 되면 자리가 좀 더 남으므로, 여기에 다른 정보를 더 저장할 수 있다. 예를 들면, 첫해부터 계산하는 짓을 하지 말고, 매 해 1월 1일부터 계산하면 좀 더 빠른 계산을 할 수 있다.

2005 년 1월 1일은 음력 2004년 11월 21 일이다. 이 2004년 11월 21을 저장하는 방법은 여러 가지가 있겠지만, 이것도 7bit 면 표현이 가능하다. 양력 1월 1일은 음력으로 하면 반드시 11월 아니면 12월이다. 따라서 11월이면 0, 12월이면 1 을 저장하는 bit 하나와 그 달이 윤달인지 여부를 저장하는 1 bit 가 필요하다. 연도는 반드시 1 작으므로 저장할 필요가 없다. 그리고 날짜는 1~30 까지이므로 5 bit 가 필요하여 총 7 bit 가 된다.

이 7 bit 와 앞의 17 bit 를 더하면 24 bit 가 된다. 이렇게 계산된 값을 2001 년부터 2010 년까지로 나타내면

0x4E9527,0x24052B,0x3A0A5B,0x54535A,0x2A0B6A,0x44FB54,0x1A0BA4,0x2E0B49,0x4CBA93,0x220A95,

와 같이 된다. 아, 위 코드는 버그 있는 데이터를 바탕으로 만들어진 거라서 2004년 11월과 2006년 1월 정보가 틀리다.

위 데이터를 바탕으로 매년 1월 1일이 음력으로 몇월 몇일인지 출력하는 코드를 만들어 보았다. 시간이 없어서 m 월 d 일을 변환하는 코드까지 만들어 보지는 못했다. 나중에 시간이 나면 좀 더 해 봐야겠다.

그리고, 한국천문연구원 (http://www.kasi.re.kr) 에 가면 양력/음력 변환을 해 주는 페이지가 있다. 이 곳의 정보는 정확하리라 생각하고, 이 곳의 서비스를 이용하여 나만의 DB 를 구축하기로 했다. 위에 계산된 데이터 중 2004년 과 2006년이 틀렸다는 것은 알겠는데, 어디가 더 틀렸는지 모르니까.

예전에 만들었던 HTTP 연결 코드를 변형하여 y 년 m 월 d 일 을 음력으로 변환하는 HTTP POST Request 를 만들고 그 결과를 parsing 하여 텍스트 파일에 저장했다. 무슨 에러인지, 중간에 프로그램이 죽어 버려서 완료되지 않은 파일들이 있지만, 밤새 돌려놓고 집에 갔다 오니 1391 년 부터 2050 년 까지의 모든 해의 음력 정보를 저장해 주었다. 이제 이 데이터를 가공해서 위에 있는 것 같은 코드를 만들고, 음력변환 코드를 완성하면, 양/음 변환 코드의 새 장을 열 수도 있을 것 같다 : )

그러나...

시간이 있어야 이 짓을 계속 할 수 있다. 바빠서 못 한다...

Personal tools
Wiki Help (mediawiki.org)