This repository has been archived on 2025-12-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
spa-paper/algorithm.m
2013-07-17 12:35:59 -06:00

90 lines
3.1 KiB
Objective-C

#import <Foundation/Foundation.h>
@interface Algorithm : NSObject
@property (atomic, strong) NSMutableArray *permutations;
- (NSMutableArray *)findPermutations;
- (void)shift:(long) number shifts: (char) shifts initialSubtraction: (long) initialSubtraction currentShiftIteration:(int)currentShiftIteration currentSubtractionIteration:(int)currentSubtractionIteration;
- (void)subtract:(long)number subtractions:(char)subtractions initialSubtraction:(long)initialSubtraction currentShiftIteration:(int)currentShiftIteration currentSubtractionIteration:(int)currentSubtractionIteration;
@end
@implementation Algorithm
@synthesize permutations;
- (NSMutableArray *)findPermutations
{
permutations = [[NSMutableArray alloc] init];
[permutations addObject:[[NSNumber alloc] initWithChar:31]];
[self shift:(long)31 shifts:(char)4 initialSubtraction:(long)0 currentShiftIteration:0 currentSubtractionIteration:0];
return permutations;
}
- (void)shift:(long)number shifts:(char)shifts initialSubtraction:(long)initialSubtraction currentShiftIteration:(int)currentShiftIteration currentSubtractionIteration:(int)currentSubtractionIteration
{
if (currentShiftIteration >= 4) {
return;
}
for(char b = 0; b < shifts; b++) {
if (currentShiftIteration >= 4) {
return;
}
number = (long)((long)number << 1);
currentShiftIteration++;
[permutations addObject:[[NSNumber alloc] initWithLong:number]];
initialSubtraction = (long)(((long)initialSubtraction << 1) + 1);
[self subtract:number subtractions:shifts initialSubtraction:initialSubtraction currentShiftIteration:currentShiftIteration currentSubtractionIteration:currentSubtractionIteration];
}
return;
}
- (void)subtract:(long)number subtractions:(char)subtractions initialSubtraction:(long)initialSubtraction currentShiftIteration:(int)currentShiftIteration currentSubtractionIteration:(int)currentSubtractionIteration
{
if (currentSubtractionIteration >= 4) {
return;
}
long subtractionValue = initialSubtraction;
for(char b = 0; b < subtractions; b++) {
if (currentSubtractionIteration >= 4) {
return;
}
number -= subtractionValue;
currentSubtractionIteration++;
subtractionValue = (long)((long)subtractionValue << 1);
[permutations addObject:[[NSNumber alloc] initWithLong:number]];
[self shift:number shifts:(subtractions - 1) initialSubtraction:subtractionValue currentShiftIteration:currentShiftIteration currentSubtractionIteration:currentSubtractionIteration];
}
}
@end
int main(int argc, char const *argv[])
{
@autoreleasepool {
Algorithm *myAlgorithm = [[Algorithm alloc] init];
NSMutableArray *permutations = [myAlgorithm findPermutations];
printf("[\n");
for (int i = 0; i < [permutations count]; ++i)
{
if (i == ([permutations count] - 1))
{
printf("%4d", [[permutations objectAtIndex: i] intValue]);
}
else
{
printf("%4d, ", [[permutations objectAtIndex: i] intValue]);
}
}
printf("\n]\n");
}
return 0;
}