• + 0 comments

    c++ solution:

    string encodeDigit(int n) {
        switch (n) {
            case 1:
                return "one";
            case 2:
                return "two";
            case 3:
                return "three";
            case 4:
                return "four";
            case 5:
                return "five";
            case 6:
                return "six";
            case 7:
                return "seven";
            case 8:
                return "eight";
            case 9:
                return "nine";
            default:
                return "";
        }
    }
    
    string encodePreTwenties(int n) {
        switch (n) {
            case 10:
                return "ten";
            case 11:
                return "eleven";
            case 12:
                return "twelve";
            case 13:
                return "thirteen";
            case 14:
                return "forteen";
            case 15:
                return "fifteen";
            case 16:
                return "sixteen";
            case 17:
                return "seventeen";
            case 18:
                return "eigteen";
            case 19:
                return "nineteen";
            default:
                return "";
        }
    }
    
    string encodeHour(int hour) {
        if (hour > 12) {
            hour = hour % 12;
        }
        
        if (hour < 10) {
            return encodeDigit(hour);
        }
        
        return encodePreTwenties(hour);
    }
     
    // excludes special cases like quarter
    // minutes < 30
    string encodeMinutes(int minutes) {
        if (minutes == 1) {
            return "one minute";    
        }
        
        if (minutes < 10) {
            return encodeDigit(minutes) + " minutes";
        }
        
        if (minutes < 20) {
            return encodePreTwenties(minutes) + " minutes";
        }
        
        if (minutes == 20) {
            return "twenty minutes";
        }
        
        return "twenty " + encodeDigit(minutes - 20) + " minutes";
    }
    
    string timeInWords(int h, int m) {
        if (m == 0) {
            return encodeHour(h) + " o' clock";  
        }
        
        if (m == 15) {
            return "quarter past " + encodeHour(h);  
        }
        
        if (m == 30) {
            return "half past " + encodeHour(h);  
        }
        
        if (m == 45) {
            return "quarter to " + encodeHour(h + 1);
        }
        
        if (m <= 30) {
            return encodeMinutes(m) + " past " + encodeHour(h);
        }
        
        // > 30 minutes
        return encodeMinutes(60 - m) +  " to " + encodeHour(h + 1);
    }