Created
February 3, 2015 03:01
-
-
Save kmdarshan/498c76a026948f27a84d to your computer and use it in GitHub Desktop.
Pattern searching
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// main.m | |
// chrono | |
// | |
// Created by Darshan Katrumane on 2/2/15. | |
// Copyright (c) 2015 Darshan Katrumane. All rights reserved. | |
// | |
#import <Foundation/Foundation.h> | |
int main(int argc, const char * argv[]) { | |
@autoreleasepool { | |
NSFileHandle *inputFile = [NSFileHandle fileHandleWithStandardInput]; | |
NSMutableString *inputString = [NSMutableString string]; | |
NSString *firstLine; | |
NSMutableString *string; | |
NSMutableString *pattern; | |
NSInteger lineCounter = 1; | |
do { | |
NSData *data = [inputFile availableData]; | |
if ([data length] == 0) { | |
NSLog(@"EOF"); | |
break; | |
} | |
NSMutableString *tmp = [[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding]; | |
[tmp replaceOccurrencesOfString:@"\n" withString:@" " options:0 range:NSMakeRange(0, [tmp length])]; | |
switch (lineCounter) { | |
case 1: | |
firstLine = tmp; | |
break; | |
case 2: | |
string = tmp; | |
case 3: | |
pattern = tmp; | |
default: | |
break; | |
} | |
if (++lineCounter > 3) { | |
break; | |
} | |
} while ([inputString rangeOfString:@";"].location == NSNotFound); | |
NSArray *inputDatas = [firstLine componentsSeparatedByString:@" "]; | |
if ([inputDatas count] < 2) { | |
NSLog(@"error in input data"); | |
return -1; | |
} | |
[string replaceOccurrencesOfString:@" " withString:@"" options:0 range:NSMakeRange(0, [string length])]; | |
NSInteger stringLength = [[inputDatas objectAtIndex:0] integerValue]; | |
if(stringLength != [string length]) { | |
NSLog(@"error in input data/string"); | |
return -1; | |
} | |
// read data into an array | |
NSMutableArray *charactersArray = [[NSMutableArray alloc] initWithCapacity:stringLength]; | |
for (int i=0; i < stringLength; i++) { | |
NSString *ichar = [NSString stringWithFormat:@"%c", [string characterAtIndex:i]]; | |
[charactersArray addObject:ichar]; | |
} | |
[pattern replaceOccurrencesOfString:@" " withString:@"" options:0 range:NSMakeRange(0, [pattern length])]; | |
NSInteger patternLength = [[inputDatas objectAtIndex:1] integerValue]; | |
if(patternLength != [pattern length]) { | |
NSLog(@"error in input data/pattern"); | |
return -1; | |
} | |
NSMutableArray *patternsArray = [[NSMutableArray alloc] initWithCapacity:patternLength]; | |
for (int i=0; i < patternLength; i++) { | |
NSString *ichar = [NSString stringWithFormat:@"%c", [pattern characterAtIndex:i]]; | |
[patternsArray addObject:ichar]; | |
} | |
// iterate the main string | |
// main two pointers one for string, the other for the pattern | |
// increment each value, if they match | |
NSInteger numberOfPatterns = 0; | |
for (int characterMarker =0, patternMarker =0; characterMarker < stringLength; characterMarker++) { | |
while (patternMarker <= patternLength-1 && characterMarker < stringLength) { | |
if ([[patternsArray objectAtIndex:patternMarker] isEqualToString:[charactersArray objectAtIndex:characterMarker]] || [[patternsArray objectAtIndex:patternMarker] isEqualToString:@"*"]) { | |
if (patternMarker < patternLength-1) { | |
characterMarker++; | |
}else if(patternMarker == patternLength-1) { | |
patternMarker = 0; | |
numberOfPatterns++; | |
} | |
patternMarker++; | |
} else { | |
patternMarker = 0; | |
break; | |
} | |
} | |
} | |
NSLog(@"%lu", numberOfPatterns); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment