Download All Files (as .zip)

ECOO 2014 Local - Problem #1: Martian Time

I was actually at this local competition and this file is the raw code that I used to be marked. I've fixed up this code with comments and made it more of a perfect solution over here.

The problem:

A day on Mars is just a little bit longer than a day on Earth. One day on Mars lasts 24 hours 37 minutes and 22.663 seconds in Earth time. To make sure they can get the most out of the daylight hours on Mars, when NASA plans a Mars Rover mission, they put all of their employees on "Martian Time".

Martian time uses a 24-hour clock divided into minutes and seconds just like Earth time. But every Martian hour, minute and second has to be just a little bit longer than its Earth counterpart.

It just so happens that at 12:00 AM on January 1st, 2015 (aka Day 1) on Earth it will also be exactly 12:00 AM of Day 1 in Martian time at the place where the next Mars rover will touch down. So NASA has issued its employees Martian digital watches, synchronized so that Day 1 at midnight matches Day 1 at midnight on Earth. These watches report the day, hour and minute of the current time (they keep track of seconds as well, but don't report that number on the face of the watch).

DATA11.txt (DATA12.txt for the second try) will contain 10 test cases. Each test case will consist of three integers D, H, and M representing the Day, Hour and Minute of an exact time on Earth, where Day 1 is January 1st, 2015 (1 ≤ D ≤ 1000, 0 ≤ H ≤ 23 and 0 ≤ M ≤ 59). Your job is to output the current time on Mars as it would be shown on the Martian digital watch described above. Each time should be on a single line and formatted exactly as shown in the sample output below.

Sample Input
346 12 28
393 06 40
390 19 50
984 02 25
674 21 29
435 13 07
15 04 12
539 00 50
40 01 20
69 03 11
Sample Output
Day 337, 18:40
Day 383, 08:28
Day 380, 23:07
Day 959, 05:28
Day 657, 20:17
Day 424, 13:15
Day 14, 19:35
Day 525, 10:08
Day 39, 01:37
Day 67, 09:48

My solution (in Java at the contest):

import java.text.DecimalFormat;
import java.util.Scanner;
import java.util.ArrayList;
import java.io.File;

public class Problem_1_Martian_Time {
    
    public static void main(String[] args) {
        
        try {
            Scanner scanner = new Scanner(new File("F:\\data\\DATA11.txt"));
            ArrayList<String> list = new ArrayList<String>();
            
            DecimalFormat df = new DecimalFormat("00");
            
            while (scanner.hasNextLine()) {
                list.add(scanner.nextLine());
            }
            
            double ratio = 86400 / 88642.663;
            
            for (String line : list) {
                
                String[] s = line.split("\\s+");

                int day = Integer.parseInt(s[0]);
                int hour = Integer.parseInt(s[1]);
                int minutes = Integer.parseInt(s[2]);
                
                double eSecs = day * 60 * 60 * 24 + hour * 60 * 60 + minutes * 60;
                
                double mSecs = eSecs * ratio;
                
                int days = (int)mSecs / (int)(86400);
                System.out.print("Day " + days + ", ");
                
                double daysInSeconds = days * 86400;
                
                double hoursInSeconds = mSecs - daysInSeconds;
                int hours = (int)hoursInSeconds / (3600);
                
                double minutesInSeconds = mSecs - daysInSeconds - hours * 3600;
                double mins = Math.round(minutesInSeconds / 60.0);
                
                if (day != 0 && hour != 0 && minutes != 0) mins += 36;
                
                if (mins > 59) {
                    hours += 1;
                    mins -= 60;
                }
                
                System.out.print(df.format(hours) + ":");
                System.out.println(df.format(mins));
                
                /*double minutesInSeconds = mSecs - daysInSeconds - hoursInSeconds;
                
                double mins = minutesInSeconds / 60.0;
                
                System.out.println(mins + "\n");*/
                
                /*double hoursLeft = mSecs % 86400d;
                
                double hours = hoursLeft / (3600*ratio);
                
                System.out.println(hours);
                
                double minutesLeft = hoursLeft % 60;
                
                double mins = minutesLeft / 60;
                
                System.out.println(minutesLeft + "\n");*/
                
            }
            
        } catch (Exception e) {
            System.out.println("Exception");
        }
        
    }
}
DOWNLOAD as .java

My test cases (as .txt files):

Using their sample input:

346 12 28
393 06 40
390 19 50
984 02 25
674 21 29
435 13 07
15 04 12
539 00 50
40 01 20
69 03 11

And the output to that is:

Day 337, 18:40
Day 383, 08:28
Day 380, 23:07
Day 959, 05:28
Day 657, 20:17
Day 424, 13:15
Day 14, 19:35
Day 525, 09:32
Day 39, 01:37
Day 67, 09:48
DOWNLOAD as .txt

Before I submitted this, I found that the code had always output times exactly 36 minutes less than the expected output. So, to fix that, I added in the line mins += 36;. That's when we got the perfect output for the sample input and then we submitted our answer.

Using their first judging test input:

477 09 44
19 22 59
120 02 48
390 09 45
880 23 24
797 15 27
809 14 34
242 19 49
313 05 46
168 00 59

And the output to that is:

Day 465, 08:27
Day 19, 11:28
Day 117, 02:28
Day 380, 13:18
Day 858, 17:04
Day 777, 11:43
Day 789, 03:34
Day 236, 16:58
Day 305, 08:10
Day 163, 18:57

However, the expected output to that is:

Day 465, 08:27
Day 19, 11:28
Day 117, 02:28
Day 380, 13:18
Day 858, 17:04
Day 777, 11:43
Day 789, 03:34
Day 236, 16:58
Day 305, 08:10
Day 163, 19:33
DOWNLOAD as .txt

We scored 9/10 on that because the very last line of output was incorrect. It just so happens that there's a difference of 36 minutes.

Why wasn't that fixed like the other cases?
It's because of the if-statement I put before the mins += 36;. The last line of input had 00 hours, so the if-statement evaluated to false, and therefore the mins += 36; was never executed.

Why did you add in the if-statement?
I was trying to fix the case where the input was 0 00 00 because adding 36 minutes to that would be incorrect (I was thinking the input should be the ssame as the output). According to the problem description, (I thought) that is when the times would be the same for Earth and Mars. Then I realized that the lowest value for the Day input could be was 1, so I thought the if-statement wouldn't make a difference because it would never be false unless the input was 0 00 00. I left it in there because I didn't think it would hurt.

Why did it evaluate to false and hurt your output?
I wrote the if-statement incorrectly. All the && operators should have been || operators. The if-statement was basically "if all of them are not zero (days, hours and minutes)" but I meant to have "if any of them are not zero (days, hours and minutes)" meaning "if not all of them are 0 (days, hours and minutes), so if the input is not 0 00 00"

So I could have output a perfect solution had I either made the if statement properly with all OR operators, or just took out the if-statement completely.
However, the second test input for the judges would have output a perfect solution whether I had fixed it or not because none of the input values were 0. But we didn't end up taking the second test because we weren't sure at the time what the prolem was.

Using their second judging test input:

225 11 38
917 10 12
57 01 49
70 19 19
31 05 57
463 10 43
63 11 07
205 07 08
119 10 26
703 14 12

And the output to that is:

Day 219, 19:19
Day 894, 05:44
Day 55, 15:46
Day 69, 00:55
Day 30, 11:35
Day 451, 17:55
Day 61, 21:11
Day 200, 03:05
Day 116, 10:31
Day 685, 19:35

And that is exactly the expected output.

DOWNLOAD as .txt

          Created: April 2, 2014
Completed in full by: Michael Yaworski