#include <iostream>
#include <string>
#include <sstream>
#include <chrono>
using namespace std;
struct AgeDetail {
int years;
int months;
int days;
};
AgeDetail calculateAge(int birthYear, int birthMonth, int birthDay) {
using namespace chrono;
// Ambil tanggal sekarang
auto today = system_clock::now();
time_t t = system_clock::to_time_t(today);
tm now = *localtime(&t);
int yearNow = now.tm_year + 1900;
int monthNow = now.tm_mon + 1;
int dayNow = now.tm_mday;
AgeDetail age{};
age.years = yearNow - birthYear;
age.months = monthNow - birthMonth;
age.days = dayNow - birthDay;
if (age.days < 0) {
age.months--;
static int daysInMonth[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int prevMonth = (monthNow - 2 + 12) % 12;
int yearOfPrevMonth = yearNow;
if (monthNow == 1) yearOfPrevMonth--;
// cek kabisat
if (prevMonth == 1 && ((yearOfPrevMonth % 4 == 0 && yearOfPrevMonth % 100 != 0) || (yearOfPrevMonth % 400 == 0))) {
daysInMonth[1] = 29;
} else {
daysInMonth[1] = 28;
}
age.days += daysInMonth[prevMonth];
}
if (age.months < 0) {
age.years--;
age.months += 12;
}
return age;
}
int main() {
string fullName;
int birthYear, birthMonth, birthDay;
cout << "Nama: ";
getline(cin, fullName);
cout << "Tanggal lahir (YYYY MM DD): ";
cin >> birthYear >> birthMonth >> birthDay;
string firstName, middleName, lastName;
stringstream ss(fullName);
ss >> firstName >> middleName >> lastName;
AgeDetail age = calculateAge(birthYear, birthMonth, birthDay);
if (middleName.empty()) {
cout << "Woi, " << firstName << ", lu udah "
<< age.years << " tahun, "
<< age.months << " bulan, "
<< age.days << " hari." << endl;
} else {
cout << "Woi, " << middleName << ", lu udah "
<< age.years << " tahun, "
<< age.months << " bulan, "
<< age.days << " hari." << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGNocm9ubz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBBZ2VEZXRhaWwgewogICAgaW50IHllYXJzOwogICAgaW50IG1vbnRoczsKICAgIGludCBkYXlzOwp9OwoKQWdlRGV0YWlsIGNhbGN1bGF0ZUFnZShpbnQgYmlydGhZZWFyLCBpbnQgYmlydGhNb250aCwgaW50IGJpcnRoRGF5KSB7CiAgICB1c2luZyBuYW1lc3BhY2UgY2hyb25vOwoKICAgIC8vIEFtYmlsIHRhbmdnYWwgc2VrYXJhbmcKICAgIGF1dG8gdG9kYXkgPSBzeXN0ZW1fY2xvY2s6Om5vdygpOwogICAgdGltZV90IHQgPSBzeXN0ZW1fY2xvY2s6OnRvX3RpbWVfdCh0b2RheSk7CiAgICB0bSBub3cgPSAqbG9jYWx0aW1lKCZ0KTsKCiAgICBpbnQgeWVhck5vdyA9IG5vdy50bV95ZWFyICsgMTkwMDsKICAgIGludCBtb250aE5vdyA9IG5vdy50bV9tb24gKyAxOwogICAgaW50IGRheU5vdyA9IG5vdy50bV9tZGF5OwoKICAgIEFnZURldGFpbCBhZ2V7fTsKICAgIGFnZS55ZWFycyA9IHllYXJOb3cgLSBiaXJ0aFllYXI7CiAgICBhZ2UubW9udGhzID0gbW9udGhOb3cgLSBiaXJ0aE1vbnRoOwogICAgYWdlLmRheXMgPSBkYXlOb3cgLSBiaXJ0aERheTsKCiAgICBpZiAoYWdlLmRheXMgPCAwKSB7CiAgICAgICAgYWdlLm1vbnRocy0tOwogICAgICAgIHN0YXRpYyBpbnQgZGF5c0luTW9udGhbXSA9IHszMSwyOCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMX07CiAgICAgICAgaW50IHByZXZNb250aCA9IChtb250aE5vdyAtIDIgKyAxMikgJSAxMjsKICAgICAgICBpbnQgeWVhck9mUHJldk1vbnRoID0geWVhck5vdzsKICAgICAgICBpZiAobW9udGhOb3cgPT0gMSkgeWVhck9mUHJldk1vbnRoLS07CiAgICAgICAgLy8gY2VrIGthYmlzYXQKICAgICAgICBpZiAocHJldk1vbnRoID09IDEgJiYgKCh5ZWFyT2ZQcmV2TW9udGggJSA0ID09IDAgJiYgeWVhck9mUHJldk1vbnRoICUgMTAwICE9IDApIHx8ICh5ZWFyT2ZQcmV2TW9udGggJSA0MDAgPT0gMCkpKSB7CiAgICAgICAgICAgIGRheXNJbk1vbnRoWzFdID0gMjk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGF5c0luTW9udGhbMV0gPSAyODsKICAgICAgICB9CiAgICAgICAgYWdlLmRheXMgKz0gZGF5c0luTW9udGhbcHJldk1vbnRoXTsKICAgIH0KICAgIAogICAgaWYgKGFnZS5tb250aHMgPCAwKSB7CiAgICAgICAgYWdlLnllYXJzLS07CiAgICAgICAgYWdlLm1vbnRocyArPSAxMjsKICAgIH0KCiAgICByZXR1cm4gYWdlOwp9CgppbnQgbWFpbigpIHsKICAgIHN0cmluZyBmdWxsTmFtZTsKICAgIGludCBiaXJ0aFllYXIsIGJpcnRoTW9udGgsIGJpcnRoRGF5OwoKICAgIGNvdXQgPDwgIk5hbWE6ICI7CiAgICBnZXRsaW5lKGNpbiwgZnVsbE5hbWUpOyAKCiAgICBjb3V0IDw8ICJUYW5nZ2FsIGxhaGlyIChZWVlZIE1NIEREKTogIjsKICAgIGNpbiA+PiBiaXJ0aFllYXIgPj4gYmlydGhNb250aCA+PiBiaXJ0aERheTsKCiAgICBzdHJpbmcgZmlyc3ROYW1lLCBtaWRkbGVOYW1lLCBsYXN0TmFtZTsKICAgIHN0cmluZ3N0cmVhbSBzcyhmdWxsTmFtZSk7CiAgICBzcyA+PiBmaXJzdE5hbWUgPj4gbWlkZGxlTmFtZSA+PiBsYXN0TmFtZTsKCiAgICBBZ2VEZXRhaWwgYWdlID0gY2FsY3VsYXRlQWdlKGJpcnRoWWVhciwgYmlydGhNb250aCwgYmlydGhEYXkpOwoKICAgIGlmIChtaWRkbGVOYW1lLmVtcHR5KCkpIHsKICAgICAgICBjb3V0IDw8ICJXb2ksICIgPDwgZmlyc3ROYW1lIDw8ICIsIGx1IHVkYWggIiAKICAgICAgICAgICAgIDw8IGFnZS55ZWFycyA8PCAiIHRhaHVuLCAiIAogICAgICAgICAgICAgPDwgYWdlLm1vbnRocyA8PCAiIGJ1bGFuLCAiIAogICAgICAgICAgICAgPDwgYWdlLmRheXMgPDwgIiBoYXJpLiIgPDwgZW5kbDsKICAgIH0gZWxzZSB7CiAgICAgICAgY291dCA8PCAiV29pLCAiIDw8IG1pZGRsZU5hbWUgPDwgIiwgbHUgdWRhaCAiIAogICAgICAgICAgICAgPDwgYWdlLnllYXJzIDw8ICIgdGFodW4sICIgCiAgICAgICAgICAgICA8PCBhZ2UubW9udGhzIDw8ICIgYnVsYW4sICIgCiAgICAgICAgICAgICA8PCBhZ2UuZGF5cyA8PCAiIGhhcmkuIiA8PCBlbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9