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]