#include #include #include long swamp_jd( long year) { if( !year) /* we know year >= 0 */ return( -1); return( year * 365L + (year - 1) * 683L / 2820L); } static const char *month_names[15] = { "Alligator", "Bog", "Crayfish", "Damp", "Eel", "Fen", "Gumbo", "Hurricane", "Inundation", "Jaguar", "Kudzu", "Lake", "Marsh", "Newt", "Overflow" }; int unpack_date( const char *date, int *day, int *month, long *year) { int i; for( i = 0; isdigit( date[i]); i++) ; if( !i || date[i] != '-') return( -1); *day = atoi( date); date += i + 1; *month = tolower( *date) - 'a'; if( *month < 0 || *month > 14) return( -2); for( i = 1; date[i] && tolower( date[i]) == month_names[*month][i]; i++) ; if( date[i] != '-') return( -3); date += i + 1; for( i = 0; isdigit( date[i]); i++) ; if( !i || date[i]) return( -4); *year = atol( date); return( 0); /* date is valid (in format, anyway) */ } long get_swamp_jd( const char *date) { int day, month, i; long year, jd0, rval = -99; /* start by assuming an error */ if( !unpack_date( date, &day, &month, &year)) { jd0 = swamp_jd( year); switch( month) { case 13: /* Newt */ rval = jd0 + 13 * 28; break; case 14: /* Overflow */ if( (683L * year % 2820L) < 683L) /* it's a leap year */ if( day == (int)( (jd0 - year * 365L + 1L) % 683L) ) rval = jd0 + 13 * 28 + 1; break; default: /* months 0...12: Alligator... Marsh */ #ifdef CHINESE_REMAINDER_THEOREM_SOLUTION rval = jd0 + ((month * 196 + day * 169) % 364); #else for( i = 0; i < 13 * 28; i++) if( i % 28 == day && i % 13 == month) rval = jd0 + i; #endif break; } } return( rval); } void main( int argc, char **argv) { long jd1, jd2; jd1 = get_swamp_jd( argv[1]); jd2 = get_swamp_jd( argv[2]); if( jd1 > -99L && jd2 > -99L) printf( "%ld", jd2 - jd1); else printf( "eh?\n"); }