using System.Collections.Generic;
using System.Text.RegularExpressions;
private static int _minNumericEngineNumberLength = 4;
private static int _minAlphaNumericEngineNumberLength = 5;
private static int _minPartialMatchEngineNumberLength = 3;
private static List<string> _emptyEngineNumberList = new List<string> {"ONOE","NULL","NONR","NONL","NONI","NONEL","NON","NOEN","NO","NLI","NILL","NIL,","NI","N1","N","MOI","0","x","silver","-","????","?????","//","NIIL","NILE","1","2","4","5","6",".","20L4","BIL","BNIU","BU","BUK","BUL","INL","JNI","L400","MI","MIL","MIT","ML","MNI","MNO","MO","MOI","MONE","N","N0NE","none","N1","n123","N22A2","NA","NA18","NA7","NEL","NENO","NI","nii","NIKL","nil","NIL,","NILK","nill","NILLL","NIN","NINE","NIOL","NIONE","NK","NL","NLI","NLL","NNIL","NNOE","NO","NOE","NOEL","NOEN","NOL","NOL.","NOLE","NOME","NON","NONE","NONE.","NONEL","NONI","NONL","NONO","NONOE","NONR","NOT","NUL","NULL","ONE","ONO","ONOE","ONOE3","SRT8","TB48","V8","X","XX","XXX","XXXX","XXXXX","XXXXXX","XXXXXXX","XXXXXXXX","XXXXXXXXX","XXXXXXXXXX","NILL"};
public static void Main()
List<string> engineList = new List<string>{"Z6858862","Z6897440","Z6A13683","Z6A35533","Z6A39811","Z6A43525","Z6A50533","Z6A63595","Z6A75795","Z6A79589","Z6A94780","Z6B02168","Z6B07034","Z6B11174","Z6B11414","Z6B20360","Z6B23329","Z6B25762","Z6B25797","Z6B41260","Z6B41407","Z6B41482","Z6B44576","Z6B47116","Z6B49109","Z6B49637","Z6B50009","Z6B50229","Z6B50525","Z6B50532","Z6B51557","Z6B53891","Z6B53913","Z6B54421","Z6B54774","Z6B56975","Z6B58533","Z6B61267","Z6B61389","Z6B63669","Z6B64902","Z6B65997","Z6B66613","Z6B66932","Z6B67655","Z6B67933","Z6B68327","Z6B68744","Z6B69669","Z6B69776","Z6B70622","Z6B71423","Z6B89128","Z6B89524","Z6B91040","Z6B91765","Z6B92484","Z6B93839","Z6B93899","Z6B97488","Z6B98776","Z6C01078","Z6C01397","zamxp56f2h1197824","ZAR2075756","ZARU095330","ZAZFEA052264","ZB71546","ZB96259","ZM-283658","ZNZ4528544","ZUZ9142529","ZY264721","ZY624290","ZY631429","ZY664321","ZY733582","ZY764443","ZYA20203","ZYA26803","ZYA32945","ZYA57278","ZYA67158","ZYB12481","ZYB27250","ZYB42238","ZYB53564","ZYB70042","ZYB79077","ZYB81685","ZYB93181","ZYC10793","ZYC16655","ZYC54932","ZYC55093","ZYC70922","ZYC86292","ZYC93853","ZYD09213","ZYD09999"};
foreach(string engineNumber in engineList)
bool? isGcc = GetVehicleGccSpecOrNot(engineNumber);
Console.WriteLine("Engine number " + engineNumber + (!isGcc.HasValue ? "Not decided" : (isGcc.Value ? " is GCC " : " is Non-Gcc")));
public static bool? GetVehicleGccSpecOrNot(string engineNumber)
bool hasValidEngineNumber = !string.IsNullOrEmpty(engineNumber);
bool existsInInvalidEngineNumber = false;
if (hasValidEngineNumber)
existsInInvalidEngineNumber = EngineNumberExistInBlockList(engineNumber.ToLower());
if (!existsInInvalidEngineNumber)
hasValidEngineNumber = ValidateEngineNumber(engineNumber);
isGccSpec = hasValidEngineNumber && !existsInInvalidEngineNumber;
private static bool EngineNumberExistInBlockList(string engineNumber)
foreach (string blockedItem in _emptyEngineNumberList)
if (blockedItem.Length < _minPartialMatchEngineNumberLength)
if (engineNumber == blockedItem)
else if (engineNumber.Contains(blockedItem))
private static bool ValidateEngineNumber(string engineNumber)
var regex = @"^([a-zA-Z0-9-])*([0-9])+([a-zA-Z0-9-])*$";
Match match = Regex.Match(engineNumber, regex, RegexOptions.IgnoreCase);
if (!string.IsNullOrEmpty(engineNumber) && match.Success)
var onlyNumberRegex = "^([0-9])+$";
Match onlyNumberMatch = Regex.Match(engineNumber, onlyNumberRegex, RegexOptions.IgnoreCase);
if (onlyNumberMatch.Success)
if (engineNumber.Length < _minNumericEngineNumberLength)
var repeatedRegex = @"(\d)\1{2}";
Match repeatedRegexMatch = Regex.Match(engineNumber, repeatedRegex, RegexOptions.IgnoreCase);
if (repeatedRegexMatch.Success)
return !IsEngineNumberInSequence(engineNumber);
if (engineNumber.Length < _minAlphaNumericEngineNumberLength)
private static bool IsEngineNumberInSequence(string sequence)
int[] arr = sequence.Select(character => Convert.ToInt32(character.ToString())).ToArray();
for (int i = 2; i < arr.Length; i++)
if (arr[i - 1] == arr[i] - 1 && arr[i - 2] == arr[i] - 2)