Code Challenge problem: Plate number

Following my problem in the first post of Code Challenge series, it’s a solution.

Problem

A motor bike plate number is in the format [AB-CD EFG.HI]. Its value is defined by: AB x C + EFG x HI, if C is a letter, its value is its ASCII code. A plate number is called NICE one if its EFG contains its HI, then its value is doubled than normal. Give you a list of place numbers, find the biggest value.

For example: A plate 29-C1 320.12 has value 5783 (= 29*67+320*12)

What is the biggest value of

28-A1 493.68

83-Y3 453.83

17-Z7 439.48

29-C1 292.29

Solution

It seems easy where we can compute the value of a specific plate number and find a biggest value afterward.

But, please aware that there is a trick at if C is a letter, its value is its ASCII code. So C can be a digit or letter. Only if it is not a digit, we need to get its value by ASCII code.

Here is my solution in C#

using System;

namespace Solutions
{
    internal class Problem1_PlateNumber
    {
        public static long PlateNumberValue( string plateNumber )
        {
            string[] parts = plateNumber.Split( new char[] { '-', ' ', '.' } );
            int part0 = Int16.Parse( parts[ 0 ] );
            int part2 = Int16.Parse( parts[ 2 ] );
            int part3 = Int16.Parse( parts[ 3 ] );
            int part1 = 1;

            try
            {
                part1 = Int32.Parse( parts[ 1 ] );
            }
            catch ( Exception )
            {
                part1 = parts[ 1 ][ 0 ];
            }

            long value = part0 * part1 + part2 * part3;

            if ( parts[ 2 ].Contains( parts[ 3 ] ) )
                value *= 2;

            return value;
        }

        public static void Main( string[] args )
        {
            string[] list = new string[] {
                "28-A1 493.68",
                "83-Y3 453.83",
                "17-Z7 439.48",
                "29-C1 292.29"
            };

            long max = 0;
            string maxPlateNumber = string.Empty;

            foreach ( string plateNumber in list )
            {
                long value = PlateNumberValue( plateNumber );
                if ( max < value )
                {
                    max = value;
                    maxPlateNumber = plateNumber;
                }
            }
            // return max
        }
    }
}

Here is the solution in Objective-C, credit to Nghia Luong to share.

-(int)resultFromString:(NSString*) string {
    NSArray *components = [string componentsSeparatedByString:@" "];
    NSString *firstPart = components[0];
    NSString *secondPart = components[1];
    NSString *ab = [firstPart componentsSeparatedByString:@"-"][0];

    NSRange cRange = NSMakeRange(0, 1);
    NSString *c = [[firstPart componentsSeparatedByString:@"-"][1] substringWithRange:cRange];
    int cRealValue = [c characterAtIndex:0];

    NSString *efg = [secondPart componentsSeparatedByString:@"."][0];
    NSString *hi = [secondPart componentsSeparatedByString:@"."][1];

    int multiValue = 1;
    if ([efg rangeOfString:hi].location != NSNotFound) {
        multiValue = 2;
    }
    int result = ([ab intValue]*cRealValue +[efg intValue]*[hi intValue])*multiValue;
    return result;
}

-(int)bigestValueWithArray:(NSArray*)arr{
    NSMutableArray *resultArr = [NSMutableArray array];
    for (NSString *str in arr) {
        int result = [self resultFromString:str];
        [resultArr addObject:[NSNumber numberWithInt:result]];
    }

    NSArray *finalArr = [resultArr copy];
    finalArr = [finalArr sortedArrayUsingSelector: @selector(compare:)];
    return [[finalArr lastObject] intValue];
}

// And the implement:

NSArray *array = [NSArray arrayWithObjects:@"28-A1 493.68", @"83-Y3 453.83", @"17-Z7 439.48", @"29-C1 292.29", nil];
int result = [self bigestValueWithArray:array];
NSLog(@"result %d", result);

No code

Yes, at least we can solve it by Excel as can compute a plate number value by this function

LEFT(A2,2)*IF(ISNUMBER(MID(A2,4,1)), MID(A2,4,1), CODE(MID(A2,4,1)))+RIGHT(A2,2)*MID(A2,7,3)

Note: 

My full input is in attachment, not just a simple input above as it’s easy to solve manually.

[wpba-attachment-list]