Date Time
Problem Description
Arun and his sister Usha are challenging each other with some mathematical puzzles. Usha, the cleverer one, has come up with the idea of givingArun 12 distinct digits from 0 to 9, and have him form the largest date time in 2018 with them. Arun is a little nervous, and asks you to help him with a computer program.
Usha will give Arun 12 distinct digits. He needs to create a date time combination in the year 2018: the date in the MM/DD form (all four digits must be present), and the time in the format HH:MM (all four digits must be present). The date may be from 01/01 to 12/31 and the time may be from 00:00 to 23:59 (in the 24 hour format). The digits provided may be used only once in the answer that Arun gives.
If more than one date time combination may be formed, Arun needs to give the latest valid date time possible in the year 2018.
Constraints
Single digits (any of 0-9)
Input Format
A line consisting of a sequence of 12 (not necessarily distinct) single digits (any of 0-9) separated by commas. The sequence will be non-decreasing.
Output
The maximum possible valid date time in the year 2018. The output must be in the format
MM/DD HH:MM
If no date time can be constructed, the output should be 0
Explanation
Example1 :
Input
0,0,1,2,2,2,3,5,9,9,9,9
Output
12/30 22:59
Explanation
The 12 digits to be used by Arun are given.
The maximum valid date time using only the digits given, and with each digit used at most once is
12/30 22:59
This is the output.
Example 2
Input
3,3,3,3,3,3,3,3,3,3,3,3
Output
0
Explanation
As no digit less than 3 is present in the input, a valid month cannot be formed. Hence no valid Date time can be formed with the input digits.
Program
#include<stdio.h> int isLeapYear(int y) { if(y % 4 == 0) { if(y % 100 == 0) { if(y % 400 == 0) { return 1; } else { return 0; } } else { return 1; } } return 0; } int is_valid_date_time(int date_time_arr[], int n) { int month; if(n >= 2) { month = date_time_arr[0] * 10 + date_time_arr[1]; if(!(month >= 1 && month <= 12)) { return 0; } } if(n >= 4) { int days_in_each_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; days_in_each_month[1] += isLeapYear(2018); int day = date_time_arr[2] * 10 + date_time_arr[3]; if(!(day >= 1 && day <= days_in_each_month[month - 1])) { return 0; } } if(n >= 6) { int hour = date_time_arr[4] * 10 + date_time_arr[5]; if(!(hour >= 0 && hour <= 23)) { return 0; } } if(n >= 8) { int min = date_time_arr[6] * 10 + date_time_arr[7]; if(!(min >= 0 && min <= 59)) { return 0; } } return 1; } int isFound = 0; int max_time_in_2018[8] = {0}; int is_max(int inp_arr[]) { for(int i = 0; i < 8; i ++) { if(max_time_in_2018[i] == inp_arr[i]) { continue; } else if(max_time_in_2018[i] >inp_arr[i]) { return 0; } else { return 1; } } return 0; } void time_computing(int inp_arr[], int date_time_arr[], int sel_cnt, int used[]) { if(!is_valid_date_time(date_time_arr, sel_cnt)) { return; } if(sel_cnt == 8) { if(is_valid_date_time(date_time_arr, sel_cnt)) { isFound = 1; if(is_max(date_time_arr)) { for(int i = 0; i < 8; i++) { max_time_in_2018[i] = date_time_arr[i]; } } } return; } // Select current item for(int i = 0; i< 12; i++) { if(used[i] == 1) { continue; } date_time_arr[sel_cnt] = inp_arr[i]; used[i] = 1; time_computing(inp_arr,date_time_arr, sel_cnt + 1, used); used[i] = 0; } } int main() { int inp_arr[12], date_time_arr[8]; scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", &inp_arr[0],&inp_arr[1],&inp_arr[2],&inp_arr[3], &inp_arr[4],&inp_arr[5],&inp_arr[6],&inp_arr[7], &inp_arr[8],&inp_arr[9],&inp_arr[10],&inp_arr[11]); int used[12] = {0}; time_computing(inp_arr, date_time_arr, 0, used); if(isFound == 1) { printf("%d%d/%d%d %d%d:%d%d", max_time_in_2018[0],max_time_in_2018[1],max_time_in_2018[2],max_time_in_2018[3], max_time_in_2018[4],max_time_in_2018[5],max_time_in_2018[6],max_time_in_2018[7]); } else { printf("0"); } return 0;
}
Output
0,0,1,2,2,2,3,5,9,9,9,9
12/30 22:59
You can also run it on an online IDE: https://ide.geeksforgeeks.org/XZImlFQrQa
Your comments and feedback are welcomed!! If you have any doubts do contact me! Cheers!
Related Links: Parallelograms 2018
nyc
ReplyDeleteIt gives Wrong o/p for
ReplyDeleteinput : 1 1 2 3 4 5 6 7 8 1 2 9
its correct output : 12/28 22:46 and Your o/p : 0
Even I can proof that for this input, there are multiple solution. Plz post your solution of any question after a proper sort of verification.
I request you to read the questions and input constraints properly!! the input constraints should be "NON-DECREASING" please read the question and understand the constraints then comment on it!
Delete