
이 프로그램은 어떤 외부 모듈 등을 사용하지 않고 오직 자체 코드만으로 UNIX Timestamp를 우리가 사용하는 날짜와 시각으로 변환하는 프로그램입니다. 기준은 물론 GMT입니다. (따라서 출력 결과는 한국 표준시보다 9시간 빠릅니다. 귀찮아서 그런 보정은 때려 치웠습니다 :)
이 프로그램은 원래 Funge-98 인터프리터가 없는 환경에서 만들어진 revision 1이 있었으나 나중에 돌려 보니까 에러가 나서 결국 완전히 뜯어 고친 것으로, revision 1은 작동하지 않으므로 여기에 따로 올리지는 않겠습니다.
0y6k$5*4+k$k$>_0\:!|!:\+*<
=DADCDCDDCDCD======>'0-\a^
==========================
UNIX TIMESTAMP TRANSLATOR!
()() rev2 Kang Seonghoon
('')/ tokigun@gmail.com
==========================
,,00g.'),a,q041205>0g.' ':
.'(,' ,20g.':,' ,1^>' ,30g
0p50g.'-,' ,40g.'-,^>0g1+3
0g\-60p40g1+40v >0g#^`#6_6
>#2b#*<>*-1-:#p6^v41< <p1
^ 6<!>6^#g1g04<p0<>#^_#^_6
%!#^_50gaa*%!50g4%^>g4aa**
g07g06$<v06:+/a/a/<^05p06-
5+/4g<||>#` #g<>g4^v/a/ag0
5+*50^v>#p7#$0<^05-<>46f**
5+1g05<p070p05+3*f+<^g05p0
*1+f*4+f*2++60p8f*b^>f*3+f
>*/:6a*%10p6a*/:2c*% 20p2v
^6ap00%*6a:g00np00$<^e/*c<
다음은 위의 Funge 코드와 같은 과정을 수행하는 파이썬 코드를 나타낸 것입니다. 대부분의 변수들은 Funge 공간 상의 한 좌표와 각각 1:1로 대응됩니다.
# hour/minute/second
stamp = int(raw_input())
sec = stamp % 60; stamp /= 60
min = stamp % 60; stamp /= 60
hour = stamp % 24; stamp /= 24
# year
stamp += 719162 # 719162 = ef*3+f*1+f*4+f*2+
year = 1968 # 1968 = 8f*b+f*3+
prevdays = 0
while True:
year += 1
# 365 = 46f**5+; 100 = aa*; 400 = 4aa**
days = year * 365 + year / 4 - year / 100 + year / 400
if days > stamp: break
prevdays = days
stamp -= prevdays
# month/day
daysofmonth = [3, 0, 3, 2, 3, 2, 3, 3, 2, 3, 2, 3]
if year % 400 == 0 or (year % 100 != 0 and year % 4 == 0):
daysofmonth[1] = 1
month = 1
while True:
dayofmonth = 28 + daysofmonth[month - 1]
if stamp < dayofmonth: break
stamp -= dayofmonth
month += 1
day = stamp + 1
# print
print '%d - %d - %d ( %d : %d : %d )' % (year, month, day, hour, min, sec)
이 프로그램을 실행하려면 Funge-98 인터프리터가 필요합니다. (절대로 Befunge-93 인터프리터에서는 돌아 가지 않습니다. 왜냐하면 외부 인자를 받기 위해서 y 명령을 사용했기 때문입니다.) Funge-98 인터프리터를 funge98이라고 가정하면 다음과 같이 실행할 수 있습니다.
$ funge98 timestamp.bf 1102526452 2004 - 12 - 8 ( 17 : 20 : 52 )
인자가 붙지 않을 경우 0으로 인식하며, 인자에는 숫자만이 포함될 수 있습니다. (다시 말해서 음수나 소숫점 붙은 숫자는 안 됩니다.)