#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
class Date {
public :
int year;
int month;
int day;
Date( ) { }
Date ( int y, int m, int d) {
Set( y, m, d) ;
}
int operator- ( Date d) {
return TotalDays( this ) - TotalDays( & d) ;
}
void Set( int y, int m, int d) {
if ( isValidDate( y, m, d) ) {
year = y;
month = m;
day = d;
} else {
cout << "Error: Date is invalid." ;
}
}
void Print( ) {
cout << year << "/" << month << "/" << day << endl;
}
int DayOfMonth( ) {
return DayOfMonth( year, month) ;
}
bool isLeapYear( ) {
return isLeapYear( year) ;
}
private :
int TotalDays( Date * d) {
int md[ ] = { 0 , 0 , 31 , 59 , 90 , 120 , 151 , 181 ,
212 , 243 , 273 , 304 , 334 , 365 } ;
int sumday = ( d- > year * 365 ) + ( d- > year / 4 )
- ( d- > year / 100 ) + ( d- > year / 400 )
- ( ( d- > month < 3 ) && ( isLeapYear( d- > year) ) )
+ md[ d- > month] + d- > day - 693959 ;
sumday - = 693959 ; // compatible with Excel
return sumday;
}
int DayOfMonth( int y, int m) {
int dayOfMonth[ 13 ] = { 0 ,31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31 } ;
if ( ( m >= 1 ) && ( m <= 12 ) ) {
if ( ( m == 2 ) && isLeapYear( y) ) {
return dayOfMonth[ m] + 1 ;
} else {
return dayOfMonth[ m] ;
}
} else {
return 0 ;
}
}
bool isValidDate( int y, int m, int d) {
if ( ( y < 1800 ) || ( y > 2200 ) ) return false ;
if ( ( m < 1 ) || ( m > 12 ) ) return false ;
if ( ( d < 1 ) || ( d > DayOfMonth( y, m) ) ) return false ;
return true ;
}
bool isLeapYear( int y) {
return ( ( ( y % 4 == 0 ) && ( y % 100 ) )
|| ( y % 400 == 0 ) ) ;
}
} ;
class Biorhythm {
public :
Date birthDate;
Date checkDate;
Biorhythm( Date birth, Date check) {
birthDate = birth;
checkDate = check;
Print( ) ;
}
private :
void Print( ) {
Date dispDate = checkDate;
dispDate.day = 1 ;
int sumDay = dispDate - birthDate;
int dayOfMonth = dispDate.DayOfMonth ( ) ;
cout << "Birthday : " ;
birthDate.Print ( ) ;
cout << "Date : " ;
checkDate.Print ( ) ;
cout << "P:physical S:sensitivity I:inttelectual" << endl;
cout << " day: - 0 + " << endl;
cout << "------------------------------------------------" << endl;
for ( int day = 1 ; day <= dayOfMonth; day++ ) {
if ( day == checkDate.day ) {
cout << "*" << setw( 3 ) << day << ": " ;
} else {
cout << " " << setw( 3 ) << day << ": " ;
}
int physical = sin ( ( double ) ( sumDay % 23 ) / 23 * 2 * M_PI) * 20 ;
int sensitivity = sin ( ( double ) ( sumDay % 28 ) / 28 * 2 * M_PI) * 20 ;
int intellectual = sin ( ( double ) ( sumDay % 33 ) / 33 * 2 * M_PI) * 20 ;
char graph[ 42 ] ;
for ( int i = 0 ; i < sizeof ( graph) ; i++ ) {
graph[ i] = ' ' ;
}
graph[ sizeof ( graph) - 1 ] = '\0 ' ;
graph[ 20 ] = '|' ;
graph[ physical + 20 ] = 'P' ;
graph[ sensitivity + 20 ] = 'S' ;
graph[ intellectual + 20 ] = 'I' ;
cout << graph;
cout << endl;
sumDay++ ;
}
}
} ;
int main( ) {
// your code goes here
Date d1( 1980 ,4 ,1 ) ; // birthday
Date d2( 2018 ,6 ,23 ) ; // check date
Biorhythm bio( d1, d2) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNtYXRoPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgRGF0ZSB7CiAgcHVibGljOgogICAgaW50IHllYXI7CiAgICBpbnQgbW9udGg7CiAgICBpbnQgZGF5OwogICAgCiAgICBEYXRlKCkge30KICAgIERhdGUgKGludCB5LCBpbnQgbSwgaW50IGQpIHsKICAgICAgICBTZXQoeSwgbSwgZCk7CiAgICB9CiAgICBpbnQgb3BlcmF0b3ItKERhdGUgZCkgewogICAgICAgIHJldHVybiBUb3RhbERheXModGhpcykgLSBUb3RhbERheXMoJmQpOwogICAgfQogICAgdm9pZCBTZXQoaW50IHksIGludCBtLCBpbnQgZCkgewogICAgICAgIGlmIChpc1ZhbGlkRGF0ZSh5LCBtLCBkKSkgewogICAgICAgICAgICB5ZWFyICA9IHk7CiAgICAgICAgICAgIG1vbnRoID0gbTsKICAgICAgICAgICAgZGF5ICAgPSBkOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvdXQgPDwgIkVycm9yOiBEYXRlIGlzIGludmFsaWQuIjsKICAgICAgICB9CiAgICB9CiAgICB2b2lkIFByaW50KCkgewogICAgICAgIGNvdXQgPDwgeWVhciA8PCAiLyIgPDwgbW9udGggPDwgIi8iIDw8IGRheSA8PCBlbmRsOwogICAgfQogICAgaW50IERheU9mTW9udGgoKSB7CiAgICAgICAgcmV0dXJuIERheU9mTW9udGgoeWVhciwgbW9udGgpOwogICAgfQogICAgYm9vbCBpc0xlYXBZZWFyKCkgewogICAgICAgIHJldHVybiBpc0xlYXBZZWFyKHllYXIpOwogICAgfQogICAgCiAgcHJpdmF0ZToKICAgIGludCBUb3RhbERheXMoRGF0ZSAqZCkgewogICAgICAgIGludCBtZFtdID0gezAsIDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsCiAgICAgICAgICAgICAgICAgICAgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsIDM2NX07CiAgICAgICAgaW50IHN1bWRheSA9IChkLT55ZWFyICogMzY1KSArIChkLT55ZWFyIC8gNCkKICAgICAgICAgICAgICAgICAtIChkLT55ZWFyIC8gMTAwKSArIChkLT55ZWFyIC8gNDAwKQogICAgICAgICAgICAgICAgIC0gKChkLT5tb250aCA8IDMpICYmIChpc0xlYXBZZWFyKGQtPnllYXIpKSkKICAgICAgICAgICAgICAgICArIG1kW2QtPm1vbnRoXSArIGQtPmRheSAtIDY5Mzk1OTsKICAgICAgICBzdW1kYXkgLT0gNjkzOTU5OyAgLy8gY29tcGF0aWJsZSB3aXRoIEV4Y2VsCiAgICAgICAgcmV0dXJuIHN1bWRheTsKICAgIH0KICAgIGludCBEYXlPZk1vbnRoKGludCB5LCBpbnQgbSkgewogICAgICAgIGludCAgZGF5T2ZNb250aFsxM109ezAsMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzF9OwogICAgICAgIGlmICgobSA+PSAxKSAmJiAobSA8PSAxMikpIHsKICAgICAgICAgICAgaWYgKChtID09IDIpICYmIGlzTGVhcFllYXIoeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkYXlPZk1vbnRoW21dICsgMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBkYXlPZk1vbnRoW21dOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgYm9vbCBpc1ZhbGlkRGF0ZShpbnQgeSwgaW50IG0sIGludCBkKSB7CiAgICAgICAgaWYgKCh5IDwgMTgwMCkgfHwgKHkgPiAyMjAwKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmICgobSA8IDEpIHx8IChtID4gMTIpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKChkIDwgMSkgfHwgKGQgPiBEYXlPZk1vbnRoKHksIG0pKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgYm9vbCBpc0xlYXBZZWFyKGludCB5KSB7CiAgICAgICAgcmV0dXJuICgoKHkgJSA0ID09IDApICYmICh5ICUgMTAwKSkKICAgICAgICAgICAgICAgIHx8ICh5ICUgNDAwID09IDApKTsKICAgIH0KfTsKCmNsYXNzIEJpb3JoeXRobSB7CiAgcHVibGljOgogICAgRGF0ZSBiaXJ0aERhdGU7CiAgICBEYXRlIGNoZWNrRGF0ZTsKICAgIEJpb3JoeXRobShEYXRlIGJpcnRoLCBEYXRlIGNoZWNrKSB7CiAgICAgICAgYmlydGhEYXRlID0gYmlydGg7CiAgICAgICAgY2hlY2tEYXRlID0gY2hlY2s7CiAgICAgICAgUHJpbnQoKTsKICAgIH0KICBwcml2YXRlOgogICAgdm9pZCBQcmludCgpIHsKICAgICAgICBEYXRlIGRpc3BEYXRlID0gY2hlY2tEYXRlOwogICAgICAgIGRpc3BEYXRlLmRheSA9IDE7CiAgICAgICAgCiAgICAgICAgaW50IHN1bURheSA9IGRpc3BEYXRlIC0gYmlydGhEYXRlOwogICAgICAgIGludCBkYXlPZk1vbnRoID0gZGlzcERhdGUuRGF5T2ZNb250aCgpOwogICAgICAgIGNvdXQgPDwgIkJpcnRoZGF5ICAgOiAiOwogICAgICAgIGJpcnRoRGF0ZS5QcmludCgpOwogICAgICAgIGNvdXQgPDwgIkRhdGUgICAgICAgOiAiOwogICAgICAgIGNoZWNrRGF0ZS5QcmludCgpOwogICAgICAgIGNvdXQgPDwgIlA6cGh5c2ljYWwgIFM6c2Vuc2l0aXZpdHkgIEk6aW50dGVsZWN0dWFsIiA8PCBlbmRsOwogICAgICAgIGNvdXQgPDwgIiBkYXk6IC0gICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICArICIgPDwgZW5kbDsKICAgICAgICBjb3V0IDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7CiAgICAgICAgZm9yKGludCBkYXkgPSAxOyBkYXkgPD0gZGF5T2ZNb250aDsgZGF5KyspIHsKICAgICAgICAgICAgaWYgKGRheSA9PSBjaGVja0RhdGUuZGF5KSB7CiAgICAgICAgICAgICAgICBjb3V0IDw8ICIqIiA8PCBzZXR3KDMpIDw8IGRheSA8PCAiOiAiOwkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvdXQgPDwgIiAiIDw8IHNldHcoMykgPDwgZGF5IDw8ICI6ICI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IHBoeXNpY2FsID0gc2luKChkb3VibGUpKHN1bURheSAlIDIzKSAvIDIzICogMiAqIE1fUEkpICogMjA7CiAgICAgICAgICAgIGludCBzZW5zaXRpdml0eSA9IHNpbigoZG91YmxlKShzdW1EYXkgJSAyOCkgLyAyOCAqIDIgKiBNX1BJKSAqIDIwOwogICAgICAgICAgICBpbnQgaW50ZWxsZWN0dWFsID0gc2luKChkb3VibGUpKHN1bURheSAlIDMzKSAvIDMzICogMiAqIE1fUEkpICogMjA7CiAgICAgICAgICAgIGNoYXIgZ3JhcGhbNDJdOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihncmFwaCk7IGkrKykgewogICAgICAgICAgICAgICAgZ3JhcGhbaV0gPSAnICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ3JhcGhbc2l6ZW9mKGdyYXBoKS0xXSA9ICdcMCc7CiAgICAgICAgICAgIGdyYXBoWzIwXSA9ICd8JzsKICAgICAgICAgICAgZ3JhcGhbcGh5c2ljYWwgKyAyMF0gPSAnUCc7CiAgICAgICAgICAgIGdyYXBoW3NlbnNpdGl2aXR5ICsgMjBdID0gJ1MnOwogICAgICAgICAgICBncmFwaFtpbnRlbGxlY3R1YWwgKyAyMF0gPSAnSSc7CiAgICAgICAgICAgIGNvdXQgPDwgZ3JhcGg7CiAgICAgICAgICAgIGNvdXQgPDwgZW5kbDsKICAgICAgICAgICAgc3VtRGF5Kys7CiAgICAgICAgfQogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICAvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCiAgICBEYXRlIGQxKDE5ODAsNCwxKTsgICAvLyBiaXJ0aGRheQogICAgRGF0ZSBkMigyMDE4LDYsMjMpOyAgLy8gY2hlY2sgZGF0ZQogICAgCQogICAgQmlvcmh5dGhtIGJpbyhkMSwgZDIpOwogICAgcmV0dXJuIDA7Cn0=