90 lines
3.1 KiB
Objective-C
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;
|
|
} |