Skip to content

Instantly share code, notes, and snippets.

@kmdarshan
Created February 3, 2015 03:01
Show Gist options
  • Save kmdarshan/498c76a026948f27a84d to your computer and use it in GitHub Desktop.
Save kmdarshan/498c76a026948f27a84d to your computer and use it in GitHub Desktop.
Pattern searching
//
// 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