#include <stdio.h>
#include <stdbool.h>
int ordinal_date(int day, int month, bool leap_year) {
static const int days_up_to_month[] = {
0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
return days_up_to_month[month - 1] + day
+ ((leap_year && (month > 2)) ? 1 : 0);
}
#define check(expr) \
if(!(expr)) { \
printf("[FAILED] " #expr " in %s\n", __func__); \
}
void ordinal_date_in_january_should_be_day_number() {
check(ordinal_date( 1, 1, false) == 1);
check(ordinal_date( 1, 1, true) == 1);
check(ordinal_date(11, 1, false) == 11);
check(ordinal_date(11, 1, true) == 11);
}
void ordinal_date_in_february_should_be_day_number_plus_days_in_january() {
check(ordinal_date( 1, 2, false) == 32);
check(ordinal_date( 1, 2, true) == 32);
check(ordinal_date(11, 2, false) == 42);
check(ordinal_date(11, 2, true) == 42);
}
void ordinal_date_should_match_known_values_for_non_leap_year_march_to_dezember() {
check(ordinal_date( 1, 3, false) == ( 59 + 1));
check(ordinal_date( 1, 4, false) == ( 90 + 1));
check(ordinal_date( 1, 5, false) == (120 + 1));
check(ordinal_date( 1, 6, false) == (151 + 1));
check(ordinal_date( 1, 7, false) == (181 + 1));
check(ordinal_date( 1, 8, false) == (212 + 1));
check(ordinal_date( 1, 9, false) == (243 + 1));
check(ordinal_date( 1, 10, false) == (273 + 1));
check(ordinal_date( 1, 11, false) == (304 + 1));
check(ordinal_date( 1, 12, false) == (334 + 1));
}
void ordinal_date_should_match_known_values_for_leap_year_march_to_dezember() {
check(ordinal_date( 1, 3, true) == ( 60 + 1));
check(ordinal_date( 1, 4, true) == ( 91 + 1));
check(ordinal_date( 1, 5, true) == (121 + 1));
check(ordinal_date( 1, 6, true) == (152 + 1));
check(ordinal_date( 1, 7, true) == (182 + 1));
check(ordinal_date( 1, 8, true) == (213 + 1));
check(ordinal_date( 1, 9, true) == (244 + 1));
check(ordinal_date( 1, 10, true) == (274 + 1));
check(ordinal_date( 1, 11, true) == (305 + 1));
check(ordinal_date( 1, 12, true) == (335 + 1));
}
int main(void) {
ordinal_date_in_january_should_be_day_number();
ordinal_date_in_february_should_be_day_number_plus_days_in_january();
ordinal_date_should_match_known_values_for_non_leap_year_march_to_dezember();
ordinal_date_should_match_known_values_for_leap_year_march_to_dezember();
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+CgppbnQgb3JkaW5hbF9kYXRlKGludCBkYXksIGludCBtb250aCwgYm9vbCBsZWFwX3llYXIpIHsKICBzdGF0aWMgY29uc3QgaW50IGRheXNfdXBfdG9fbW9udGhbXSA9IHsKICAgIDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0fTsKICByZXR1cm4gZGF5c191cF90b19tb250aFttb250aCAtIDFdICsgZGF5CiAgICAgICAgICsgKChsZWFwX3llYXIgJiYgKG1vbnRoID4gMikpID8gMSA6IDApOwp9CgoKI2RlZmluZSBjaGVjayhleHByKSBcCiAgaWYoIShleHByKSkgeyBcCiAgICBwcmludGYoIltGQUlMRURdICIgI2V4cHIgIiBpbiAlc1xuIiwgX19mdW5jX18pOyBcCiAgfQoKdm9pZCBvcmRpbmFsX2RhdGVfaW5famFudWFyeV9zaG91bGRfYmVfZGF5X251bWJlcigpIHsKICBjaGVjayhvcmRpbmFsX2RhdGUoIDEsIDEsIGZhbHNlKSA9PSAgMSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAxLCAgdHJ1ZSkgPT0gIDEpOwogIGNoZWNrKG9yZGluYWxfZGF0ZSgxMSwgMSwgZmFsc2UpID09IDExKTsKICBjaGVjayhvcmRpbmFsX2RhdGUoMTEsIDEsICB0cnVlKSA9PSAxMSk7Cn0KCgp2b2lkIG9yZGluYWxfZGF0ZV9pbl9mZWJydWFyeV9zaG91bGRfYmVfZGF5X251bWJlcl9wbHVzX2RheXNfaW5famFudWFyeSgpIHsKICBjaGVjayhvcmRpbmFsX2RhdGUoIDEsIDIsIGZhbHNlKSA9PSAzMik7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAyLCAgdHJ1ZSkgPT0gMzIpOwogIGNoZWNrKG9yZGluYWxfZGF0ZSgxMSwgMiwgZmFsc2UpID09IDQyKTsKICBjaGVjayhvcmRpbmFsX2RhdGUoMTEsIDIsICB0cnVlKSA9PSA0Mik7Cn0KCnZvaWQgb3JkaW5hbF9kYXRlX3Nob3VsZF9tYXRjaF9rbm93bl92YWx1ZXNfZm9yX25vbl9sZWFwX3llYXJfbWFyY2hfdG9fZGV6ZW1iZXIoKSB7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAgMywgZmFsc2UpID09ICggNTkgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAgNCwgZmFsc2UpID09ICggOTAgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAgNSwgZmFsc2UpID09ICgxMjAgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAgNiwgZmFsc2UpID09ICgxNTEgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAgNywgZmFsc2UpID09ICgxODEgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAgOCwgZmFsc2UpID09ICgyMTIgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAgOSwgZmFsc2UpID09ICgyNDMgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAxMCwgZmFsc2UpID09ICgyNzMgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAxMSwgZmFsc2UpID09ICgzMDQgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAxMiwgZmFsc2UpID09ICgzMzQgKyAxKSk7Cn0KCnZvaWQgb3JkaW5hbF9kYXRlX3Nob3VsZF9tYXRjaF9rbm93bl92YWx1ZXNfZm9yX2xlYXBfeWVhcl9tYXJjaF90b19kZXplbWJlcigpIHsKICBjaGVjayhvcmRpbmFsX2RhdGUoIDEsICAzLCB0cnVlKSA9PSAoIDYwICsgMSkpOwogIGNoZWNrKG9yZGluYWxfZGF0ZSggMSwgIDQsIHRydWUpID09ICggOTEgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAgNSwgdHJ1ZSkgPT0gKDEyMSArIDEpKTsKICBjaGVjayhvcmRpbmFsX2RhdGUoIDEsICA2LCB0cnVlKSA9PSAoMTUyICsgMSkpOwogIGNoZWNrKG9yZGluYWxfZGF0ZSggMSwgIDcsIHRydWUpID09ICgxODIgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAgOCwgdHJ1ZSkgPT0gKDIxMyArIDEpKTsKICBjaGVjayhvcmRpbmFsX2RhdGUoIDEsICA5LCB0cnVlKSA9PSAoMjQ0ICsgMSkpOwogIGNoZWNrKG9yZGluYWxfZGF0ZSggMSwgMTAsIHRydWUpID09ICgyNzQgKyAxKSk7CiAgY2hlY2sob3JkaW5hbF9kYXRlKCAxLCAxMSwgdHJ1ZSkgPT0gKDMwNSArIDEpKTsKICBjaGVjayhvcmRpbmFsX2RhdGUoIDEsIDEyLCB0cnVlKSA9PSAoMzM1ICsgMSkpOwp9CgppbnQgbWFpbih2b2lkKSB7CiAgb3JkaW5hbF9kYXRlX2luX2phbnVhcnlfc2hvdWxkX2JlX2RheV9udW1iZXIoKTsKICBvcmRpbmFsX2RhdGVfaW5fZmVicnVhcnlfc2hvdWxkX2JlX2RheV9udW1iZXJfcGx1c19kYXlzX2luX2phbnVhcnkoKTsKICBvcmRpbmFsX2RhdGVfc2hvdWxkX21hdGNoX2tub3duX3ZhbHVlc19mb3Jfbm9uX2xlYXBfeWVhcl9tYXJjaF90b19kZXplbWJlcigpOwogIG9yZGluYWxfZGF0ZV9zaG91bGRfbWF0Y2hfa25vd25fdmFsdWVzX2Zvcl9sZWFwX3llYXJfbWFyY2hfdG9fZGV6ZW1iZXIoKTsKfQo=