Functions for working with the idealized calendar of Planet Xhilr
Rev. | c9ca731a29c3838146d1e7e85626e1273ae7ca7f |
---|---|
크기 | 3,096 bytes |
Time | 2017-06-17 10:35:04 |
Author | Joel Matthew Rees |
Log Message | UD/MOD double integer division in M6800 assembler within figForth.
|
# bc script for showing the lengths of the months relative to skip years
# for the world of Bobbie, Karel, Dan, and Kristie,
#
# by Joel Matthew Rees, winter/spring 2017.
# Copyright 2017, Joel Matthew Rees
#
# Permission granted to use for personal entertainment only.
# (If you need it for other purposes, rewriting it yourself is not that hard,
# and the result will satisfy your needs much more effectively.)
#
# See these chapters of Sociology 500, a Novel, on line:
# <http://joel-rees-economics.blogspot.com/2017/03/soc500-03-08-calendar-math.html>
# <http://joel-rees-economics.blogspot.jp/2017/04/soc500-03-09-calculating-months-skip-years.html>
# <http://joel-rees-economics.blogspot.com/2017/04/soc500-03-10-computers.html>
# Novel table of contents and preface here:
# <http://joel-rees-economics.blogspot.com/2017/01/soc500-00-00-toc.html>.
#
# Save as "econmonth.bc"
# invoke as "bc -l econmonth.bc
#
# In the running bc session, run it with
# showmonths(7) for seven years, etc.
scale = 10;
months[ 0 ] = 30;
months[ 1 ] = 29;
months[ 2 ] = 30;
months[ 3 ] = 29;
months[ 4 ] = 29;
months[ 5 ] = 30;
months[ 6 ] = 29;
months[ 7 ] = 30;
months[ 8 ] = 29;
months[ 9 ] = 29;
months[ 10 ] = 30;
months[ 11 ] = 29;
define abs( n ) {
if ( n >= 0 ) {
return n;
}
return -n;
}
# If you want to do something similar,
# for looking at how leap years in your world
# match the actual orbits and revolutions
# of your world and its moon,
# replace isskip() with an appropriate isleap().
# Left as an exercise for the reader.
define isskip( y, m ) {
if ( m != 0 ) {
return 0;
}
mem = scale;
scale = 0;
diff7 = y % 7;
diff98 = y % 98;
diff343 = y % 343;
scale = mem;
if ( diff98 == 48 ) {
return 1;
}
if ( ( diff7 != 1 ) && ( diff7 != 4 ) ) {
return 0;
}
if ( diff343 == 186 ) {
return 0;
}
return 1;
}
# Note that we are treating the first year as year 0,
# and the first month as month 0.
# For your earth, you will need to adjust the year and month input and output.
define showmonths( years ) {
sum = 0;
for ( year = 0; year < years; ++year ) {
for ( month = 0; month <= 11; ++month ) {
days = months[ month ];
if ( isskip( year, month ) ) {
days -= 1;
}
sum += days;
product = year * ( 241957 / 686 ) + ( month + 1 ) * ( 241957 / 686 ) / 12;
diff = product - sum;
print year, " ", month, ": ", days, " (", sum , ", ", product, ": ", diff, ")";
if ( abs( diff ) >= 1 ) {
print "*** > 1 day! ";
}
print "\n";
}
}
}
# To show just the ideal months, run this:
# showidealmonths(7) for seven years, etc.
define showidealmonths( years ) {
sum = 0;
for ( year = 0; year < years; ++year ) {
for ( month = 0; month < 12; ++month ) {
days = 29;
sum += days;
product = year * ( 241957 / 686 ) + ( month + 1 ) * ( 241957 / 686 ) / 12;
if ( ( product - sum ) >= 0 ) {
days += 1; sum += 1;
}
print year, " ", month, ": ", days, " (", sum , ", ", product, ")\n";
}
}
}