Added Day 5 Solution

main
Nichole Mattera 4 months ago committed by Nichole Mattera
parent a9b76ca948
commit ee24ad03b9
  1. 28
      .gitignore
  2. 66
      Day 5/.gitignore
  3. 320
      Day 5/Day 5.xcodeproj/project.pbxproj
  4. 7
      Day 5/Day 5.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  5. 8
      Day 5/Day 5.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  6. 20
      Day 5/Day 5/ACCargoShip/ACCargoShip.h
  7. 95
      Day 5/Day 5/ACCargoShip/ACCargoShip.m
  8. 18
      Day 5/Day 5/ACInstruction/ACInstruction.h
  9. 22
      Day 5/Day 5/ACInstruction/ACInstruction.m
  10. 20
      Day 5/Day 5/ACStack/ACStack.h
  11. 49
      Day 5/Day 5/ACStack/ACStack.m
  12. 78
      Day 5/Day 5/main.m
  13. 126
      Day 5/README.md
  14. 512
      Day 5/input
  15. 9
      README.md

28
.gitignore vendored

@ -0,0 +1,28 @@
# Mac OS
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

66
Day 5/.gitignore vendored

@ -0,0 +1,66 @@
# Xcode
## User settings
xcuserdata/
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
*.xcscmblueprint
*.xccheckout
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
build/
DerivedData/
*.moved-aside
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
## Obj-C/Swift specific
*.hmap
## App packaging
*.ipa
*.dSYM.zip
*.dSYM
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build/
# fastlane
#
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode
iOSInjectionProject/

@ -0,0 +1,320 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 55;
objects = {
/* Begin PBXBuildFile section */
239BBC5F293E512600B1482C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 239BBC5E293E512600B1482C /* main.m */; };
239BBC6F293E59FE00B1482C /* ACCargoShip.m in Sources */ = {isa = PBXBuildFile; fileRef = 239BBC6E293E59FE00B1482C /* ACCargoShip.m */; };
239BBC74293E8A0D00B1482C /* ACStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 239BBC73293E8A0D00B1482C /* ACStack.m */; };
239BBC78293E93BC00B1482C /* ACInstruction.m in Sources */ = {isa = PBXBuildFile; fileRef = 239BBC77293E93BC00B1482C /* ACInstruction.m */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
239BBC59293E512600B1482C /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
239BBC5B293E512600B1482C /* Day 5 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Day 5"; sourceTree = BUILT_PRODUCTS_DIR; };
239BBC5E293E512600B1482C /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
239BBC6D293E59FE00B1482C /* ACCargoShip.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ACCargoShip.h; sourceTree = "<group>"; };
239BBC6E293E59FE00B1482C /* ACCargoShip.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ACCargoShip.m; sourceTree = "<group>"; };
239BBC72293E8A0D00B1482C /* ACStack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ACStack.h; sourceTree = "<group>"; };
239BBC73293E8A0D00B1482C /* ACStack.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ACStack.m; sourceTree = "<group>"; };
239BBC76293E93BC00B1482C /* ACInstruction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ACInstruction.h; sourceTree = "<group>"; };
239BBC77293E93BC00B1482C /* ACInstruction.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ACInstruction.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
239BBC58293E512600B1482C /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
239BBC52293E512600B1482C = {
isa = PBXGroup;
children = (
239BBC5D293E512600B1482C /* Day 5 */,
239BBC5C293E512600B1482C /* Products */,
);
sourceTree = "<group>";
};
239BBC5C293E512600B1482C /* Products */ = {
isa = PBXGroup;
children = (
239BBC5B293E512600B1482C /* Day 5 */,
);
name = Products;
sourceTree = "<group>";
};
239BBC5D293E512600B1482C /* Day 5 */ = {
isa = PBXGroup;
children = (
239BBC6C293E59DE00B1482C /* ACCargoShip */,
239BBC75293E93AB00B1482C /* ACInstruction */,
239BBC70293E89EC00B1482C /* ACStack */,
239BBC5E293E512600B1482C /* main.m */,
);
path = "Day 5";
sourceTree = "<group>";
};
239BBC6C293E59DE00B1482C /* ACCargoShip */ = {
isa = PBXGroup;
children = (
239BBC6D293E59FE00B1482C /* ACCargoShip.h */,
239BBC6E293E59FE00B1482C /* ACCargoShip.m */,
);
path = ACCargoShip;
sourceTree = "<group>";
};
239BBC70293E89EC00B1482C /* ACStack */ = {
isa = PBXGroup;
children = (
239BBC72293E8A0D00B1482C /* ACStack.h */,
239BBC73293E8A0D00B1482C /* ACStack.m */,
);
path = ACStack;
sourceTree = "<group>";
};
239BBC75293E93AB00B1482C /* ACInstruction */ = {
isa = PBXGroup;
children = (
239BBC76293E93BC00B1482C /* ACInstruction.h */,
239BBC77293E93BC00B1482C /* ACInstruction.m */,
);
path = ACInstruction;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
239BBC5A293E512600B1482C /* Day 5 */ = {
isa = PBXNativeTarget;
buildConfigurationList = 239BBC62293E512600B1482C /* Build configuration list for PBXNativeTarget "Day 5" */;
buildPhases = (
239BBC57293E512600B1482C /* Sources */,
239BBC58293E512600B1482C /* Frameworks */,
239BBC59293E512600B1482C /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = "Day 5";
productName = "Day 5";
productReference = 239BBC5B293E512600B1482C /* Day 5 */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
239BBC53293E512600B1482C /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastUpgradeCheck = 1340;
TargetAttributes = {
239BBC5A293E512600B1482C = {
CreatedOnToolsVersion = 13.4;
};
};
};
buildConfigurationList = 239BBC56293E512600B1482C /* Build configuration list for PBXProject "Day 5" */;
compatibilityVersion = "Xcode 13.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 239BBC52293E512600B1482C;
productRefGroup = 239BBC5C293E512600B1482C /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
239BBC5A293E512600B1482C /* Day 5 */,
);
};
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
239BBC57293E512600B1482C /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
239BBC78293E93BC00B1482C /* ACInstruction.m in Sources */,
239BBC6F293E59FE00B1482C /* ACCargoShip.m in Sources */,
239BBC74293E8A0D00B1482C /* ACStack.m in Sources */,
239BBC5F293E512600B1482C /* main.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
239BBC60293E512600B1482C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 12.3;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
};
name = Debug;
};
239BBC61293E512600B1482C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 12.3;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
};
name = Release;
};
239BBC63293E512600B1482C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
239BBC64293E512600B1482C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
239BBC56293E512600B1482C /* Build configuration list for PBXProject "Day 5" */ = {
isa = XCConfigurationList;
buildConfigurations = (
239BBC60293E512600B1482C /* Debug */,
239BBC61293E512600B1482C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
239BBC62293E512600B1482C /* Build configuration list for PBXNativeTarget "Day 5" */ = {
isa = XCConfigurationList;
buildConfigurations = (
239BBC63293E512600B1482C /* Debug */,
239BBC64293E512600B1482C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 239BBC53293E512600B1482C /* Project object */;
}

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

@ -0,0 +1,20 @@
#import <Foundation/Foundation.h>
#import "../ACStack/ACStack.h"
NS_ASSUME_NONNULL_BEGIN
@interface ACCargoShip : NSObject <NSCopying>
- (nullable instancetype)initWithInputLines:(NSArray *)inputLines;
- (NSString *)description;
- (ACStack *)getStack:(NSUInteger)index;
- (NSString *)getTopCrateMarkings;
- (NSUInteger)getLargestStackHeight;
@property (nonatomic) NSUInteger numberOfStacks;
@end
NS_ASSUME_NONNULL_END

@ -0,0 +1,95 @@
#import "ACCargoShip.h"
@interface ACCargoShip ()
@property (nonatomic, strong) NSMutableArray<ACStack *> * stacks;
@end
@implementation ACCargoShip
@synthesize stacks;
- (nullable instancetype)initWithInputLines:(NSArray *)inputLines {
self = [super init];
if (self) {
NSInteger cargoStackStartIndex = 0;
// Initialize the stacks
for (NSString * inputLine in inputLines) {
if (![inputLine hasPrefix:@" 1 "]) {
cargoStackStartIndex++;
continue;
}
NSArray * stackNumber = [inputLine componentsSeparatedByString:@" "];
self.numberOfStacks = [[stackNumber lastObject] integerValue];
break;
}
// Populate the stacks
self.stacks = [NSMutableArray arrayWithCapacity:self.numberOfStacks];
for (NSInteger stackIndex = 0; stackIndex < self.numberOfStacks; stackIndex++) {
[self.stacks addObject:[[ACStack alloc] initWithCapacity:cargoStackStartIndex - 1]];
for (NSInteger lineIndex = 0; lineIndex < cargoStackStartIndex; lineIndex++) {
NSString * crates = [inputLines objectAtIndex:lineIndex];
NSString * crate = [crates substringWithRange:NSMakeRange(stackIndex * 3 + stackIndex, 3)];
if ([crate isEqualToString:@" "]) {
continue;
}
NSString * marking = [crate substringWithRange:NSMakeRange(1, 1)];
[[self.stacks objectAtIndex:stackIndex] populateStackWithCrate:marking];
}
}
}
return self;
}
- (id)copyWithZone:(NSZone *)zone {
ACCargoShip * copy = [[ACCargoShip allocWithZone:zone] init];
copy.stacks = [self.stacks copy];
return copy;
}
- (NSString *)description {
NSMutableString * description = [NSMutableString stringWithString:@"{\n"];
NSUInteger cargoIndex = 0;
for (ACStack * stack in self.stacks) {
[description appendFormat:@"\t%d: %@,\n", (unsigned int) cargoIndex, [stack description]];
cargoIndex++;
}
[description appendString:@"}"];
return description;
}
- (ACStack *)getStack:(NSUInteger)index {
return [self.stacks objectAtIndex:index];
}
- (NSString *)getTopCrateMarkings {
NSMutableString * topCrates = [NSMutableString string];
for (ACStack * stack in self.stacks) {
[topCrates appendString:[stack getTopCrateMarking]];
}
return topCrates;
}
- (NSUInteger)getLargestStackHeight {
NSUInteger stackHeight = 0;
for (ACStack * stack in self.stacks) {
if (stackHeight < [stack getHeight]) {
stackHeight = [stack getHeight];
}
}
return stackHeight;
}
@end

@ -0,0 +1,18 @@
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface ACInstruction : NSObject
- (nullable instancetype)initWithString:(NSString *)instruction;
- (NSString *)description;
@property (nonatomic) NSUInteger fromStackIndex;
@property (nonatomic) NSUInteger toStackIndex;
@property (nonatomic) NSUInteger numberOfCargo;
@end
NS_ASSUME_NONNULL_END

@ -0,0 +1,22 @@
#import "ACInstruction.h"
@implementation ACInstruction
- (nullable instancetype)initWithString:(NSString *)instruction {
self = [super init];
if (self) {
NSArray * components = [instruction componentsSeparatedByString:@" "];
self.numberOfCargo = [[components objectAtIndex:1] integerValue];
self.fromStackIndex = [[components objectAtIndex:3] integerValue] - 1;
self.toStackIndex = [[components objectAtIndex:5] integerValue] - 1;
}
return self;
}
- (NSString *)description {
return [NSString stringWithFormat:@"move %d from %d to %d", (int) self.numberOfCargo, (int) self.fromStackIndex, (int) self.toStackIndex];
}
@end

@ -0,0 +1,20 @@
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface ACStack : NSObject
- (nullable instancetype)initWithCapacity:(NSInteger)capacity;
- (NSString *)description;
- (void)populateStackWithCrate:(NSString *)crate;
- (void)addCrate:(NSString *)crate;
- (NSString *)getCrate;
- (NSString *)getTopCrateMarking;
- (NSUInteger)getHeight;
@end
NS_ASSUME_NONNULL_END

@ -0,0 +1,49 @@
#import "ACStack.h"
@interface ACStack ()
@property (nonatomic, strong) NSMutableArray<NSString *> * cargo;
@end
@implementation ACStack
@synthesize cargo;
- (nullable instancetype)initWithCapacity:(NSInteger)capacity {
self = [super init];
if (self) {
self.cargo = [NSMutableArray arrayWithCapacity:capacity];
}
return self;
}
- (NSString *)description {
return [NSString stringWithFormat:@"['%@']", [self.cargo componentsJoinedByString:@"','"]];
}
- (void)populateStackWithCrate:(NSString *)crate {
[self.cargo addObject:crate];
}
- (void)addCrate:(NSString *)crate {
[self.cargo insertObject:crate atIndex:0];
}
- (NSString *)getCrate {
NSString * crate = [self.cargo firstObject];
[self.cargo removeObjectAtIndex:0];
return crate;
}
- (NSString *)getTopCrateMarking {
return [self.cargo firstObject];
}
- (NSUInteger)getHeight {
return self.cargo.count;
}
@end

@ -0,0 +1,78 @@
#import <Foundation/Foundation.h>
#import "ACCargoShip/ACCargoShip.h"
#import "ACInstruction/ACInstruction.h"
#import "ACStack/ACStack.h"
void partOne(ACCargoShip * cargoShip, NSArray * instructions) {
for (ACInstruction * instruction in instructions) {
ACStack * fromStack = [cargoShip getStack:instruction.fromStackIndex];
ACStack * toStack = [cargoShip getStack:instruction.toStackIndex];
for (NSInteger i = 0; i < instruction.numberOfCargo; i++) {
[toStack addCrate:[fromStack getCrate]];
}
}
NSLog(@"Part 1: %@", [cargoShip getTopCrateMarkings]);
}
void partTwo(ACCargoShip * cargoShip, NSArray * instructions) {
for (ACInstruction * instruction in instructions) {
ACStack * fromStack = [cargoShip getStack:instruction.fromStackIndex];
ACStack * toStack = [cargoShip getStack:instruction.toStackIndex];
NSMutableArray<NSString *> * crates = [NSMutableArray arrayWithCapacity:instruction.numberOfCargo];
for (NSInteger i = 0; i < instruction.numberOfCargo; i++) {
[crates addObject:[fromStack getCrate]];
}
for (NSString * crate in [crates reverseObjectEnumerator]) {
[toStack addCrate:crate];
}
}
NSLog(@"Part 2: %@", [cargoShip getTopCrateMarkings]);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
if (![[NSFileManager defaultManager] fileExistsAtPath:@"./input"]) {
NSLog(@"Input file does not exists");
return 1;
}
NSError * error;
NSString * input = [NSString stringWithContentsOfFile:@"./input" encoding:NSASCIIStringEncoding error:&error];
if (error) {
NSLog(@"Error opening file: %@", error.localizedDescription);
return 1;
}
NSArray * inputLines = [input componentsSeparatedByString:@"\n"];
ACCargoShip * cargoShip = [[ACCargoShip alloc] initWithInputLines:inputLines];
// Parse Instructions
NSMutableArray * instructions = [NSMutableArray arrayWithCapacity:[inputLines count] - ([cargoShip getLargestStackHeight] + 2)];
bool foundInstructions = false;
for (NSString * inputLine in inputLines) {
if (!foundInstructions) {
foundInstructions = [inputLine isEqualToString:@""];
continue;
}
if ([inputLine isEqualToString:@""]) {
continue;
}
[instructions addObject:[[ACInstruction alloc] initWithString:inputLine]];
}
partOne(cargoShip, instructions);
cargoShip = [[ACCargoShip alloc] initWithInputLines:inputLines];
partTwo(cargoShip, instructions);
}
return 0;
}

@ -0,0 +1,126 @@
# Day 5: Supply Stacks
The expedition can depart as soon as the final supplies have been unloaded from the ships. Supplies are stored in stacks of marked **crates**, but because the needed supplies are buried under many other crates, the crates need to be rearranged.
The ship has a **giant cargo crane** capable of moving crates between stacks. To ensure none of the crates get crushed or fall over, the crane operator will rearrange them in a series of carefully-planned steps. After the crates are rearranged, the desired crates will be at the top of each stack.
The Elves don't want to interrupt the crane operator during this delicate procedure, but they forgot to ask her **which** crate will end up where, and they want to be ready to unload them as soon as possible so they can embark.
They do, however, have a drawing of the starting stacks of crates **and** the rearrangement procedure (your puzzle input). For example:
```
[D]
[N] [C]
[Z] [M] [P]
1 2 3
move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2
```
In this example, there are three stacks of crates. Stack 1 contains two crates: crate `Z` is on the bottom, and crate `N` is on top. Stack 2 contains three crates; from bottom to top, they are crates `M`, `C`, and `D`. Finally, stack 3 contains a single crate, `P`.
Then, the rearrangement procedure is given. In each step of the procedure, a quantity of crates is moved from one stack to a different stack. In the first step of the above rearrangement procedure, one crate is moved from stack 2 to stack 1, resulting in this configuration:
```
[D]
[N] [C]
[Z] [M] [P]
1 2 3
```
In the second step, three crates are moved from stack 1 to stack 3. Crates are moved **one at a time**, so the first crate to be moved (`D`) ends up below the second and third crates:
```
[Z]
[N]
[C] [D]
[M] [P]
1 2 3
```
Then, both crates are moved from stack 2 to stack 1. Again, because crates are moved **one at a time**, crate `C` ends up below crate `M`:
```
[Z]
[N]
[M] [D]
[C] [P]
1 2 3
```
Finally, one crate is moved from stack 1 to stack 2:
```
[Z]
[N]
[D]
[C] [M] [P]
1 2 3
```
The Elves just need to know **which crate will end up on top of each stack**; in this example, the top crates are `C` in stack 1, `M` in stack 2, and `Z` in stack 3, so you should combine these together and give the Elves the message `CMZ`.
**After the rearrangement procedure completes, what crate ends up on top of each stack?**
# Part Two
As you watch the crane operator expertly rearrange the crates, you notice the process isn't following your prediction.
Some mud was covering the writing on the side of the crane, and you quickly wipe it away. The crane isn't a CrateMover 9000 - it's a **CrateMover 9001**.
The CrateMover 9001 is notable for many new and exciting features: air conditioning, leather seats, an extra cup holder, and **the ability to pick up and move multiple crates at once**.
Again considering the example above, the crates begin in the same configuration:
```
[D]
[N] [C]
[Z] [M] [P]
1 2 3
```
Moving a single crate from stack 2 to stack 1 behaves the same as before:
```
[D]
[N] [C]
[Z] [M] [P]
1 2 3
```
However, the action of moving three crates from stack 1 to stack 3 means that those three moved crates **stay in the same order**, resulting in this new configuration:
```
[D]
[N]
[C] [Z]
[M] [P]
1 2 3
```
Next, as both crates are moved from stack 2 to stack 1, they **retain their order** as well:
```
[D]
[N]
[C] [Z]
[M] [P]
1 2 3
```
Finally, a single crate is still moved from stack 1 to stack 2, but now it's crate `C` that gets moved:
```
[D]
[N]
[Z]
[M] [C] [P]
1 2 3
```
In this example, the CrateMover 9001 has put the crates in a totally different order: `MCD`.
Before the rearrangement process finishes, update your simulation so that the Elves know where they should stand to be ready to unload the final supplies. **After the rearrangement procedure completes, what crate ends up on top of each stack?**

@ -0,0 +1,512 @@
[V] [C] [M]
[V] [J] [N] [H] [V]
[R] [F] [N] [W] [Z] [N]
[H] [R] [D] [Q] [M] [L] [B]
[B] [C] [H] [V] [R] [C] [G] [R]
[G] [G] [F] [S] [D] [H] [B] [R] [S]
[D] [N] [S] [D] [H] [G] [J] [J] [G]
[W] [J] [L] [J] [S] [P] [F] [S] [L]
1 2 3 4 5 6 7 8 9
move 2 from 2 to 7
move 8 from 5 to 6
move 2 from 4 to 5
move 1 from 4 to 5
move 1 from 5 to 8
move 5 from 9 to 2
move 7 from 1 to 6
move 7 from 3 to 8
move 1 from 4 to 6
move 2 from 5 to 6
move 6 from 7 to 5
move 2 from 2 to 4
move 4 from 5 to 2
move 10 from 8 to 1
move 2 from 7 to 4
move 4 from 2 to 8
move 2 from 9 to 8
move 1 from 8 to 4
move 2 from 4 to 9
move 5 from 8 to 2
move 1 from 4 to 6
move 1 from 8 to 9
move 1 from 7 to 2
move 2 from 4 to 2
move 1 from 7 to 3
move 13 from 2 to 1
move 1 from 2 to 4
move 1 from 2 to 3
move 2 from 5 to 4
move 17 from 6 to 4
move 3 from 4 to 9
move 14 from 1 to 4
move 4 from 6 to 8
move 1 from 9 to 8
move 23 from 4 to 8
move 6 from 1 to 7
move 3 from 1 to 5
move 1 from 3 to 8
move 5 from 7 to 8
move 1 from 3 to 4
move 1 from 5 to 3
move 1 from 5 to 1
move 1 from 3 to 2
move 1 from 9 to 4
move 9 from 4 to 9
move 1 from 1 to 2
move 11 from 8 to 2
move 1 from 4 to 5
move 13 from 2 to 3
move 7 from 9 to 6
move 1 from 5 to 6
move 1 from 5 to 2
move 1 from 9 to 4
move 1 from 4 to 9
move 2 from 8 to 9
move 1 from 7 to 8
move 8 from 9 to 1
move 8 from 1 to 4
move 4 from 6 to 7
move 1 from 9 to 4
move 2 from 3 to 9
move 1 from 9 to 1
move 6 from 4 to 1
move 2 from 1 to 3
move 22 from 8 to 6
move 1 from 2 to 5
move 3 from 7 to 8
move 15 from 6 to 4
move 7 from 3 to 7
move 4 from 6 to 9
move 2 from 9 to 2
move 6 from 3 to 5
move 3 from 9 to 5
move 5 from 5 to 8
move 1 from 2 to 1
move 6 from 8 to 2
move 1 from 1 to 2
move 3 from 5 to 3
move 1 from 7 to 2
move 4 from 7 to 8
move 4 from 6 to 1
move 1 from 5 to 1
move 4 from 8 to 7
move 2 from 3 to 2
move 1 from 1 to 3
move 15 from 4 to 2
move 3 from 7 to 3
move 4 from 7 to 2
move 1 from 4 to 9
move 5 from 3 to 8
move 29 from 2 to 1
move 1 from 9 to 5
move 1 from 2 to 1
move 11 from 1 to 5
move 1 from 4 to 5
move 2 from 6 to 3
move 1 from 3 to 4
move 16 from 1 to 9
move 4 from 8 to 4
move 3 from 6 to 9
move 1 from 3 to 7
move 1 from 7 to 3
move 6 from 1 to 6
move 3 from 4 to 3
move 3 from 8 to 5
move 3 from 1 to 8
move 3 from 1 to 4
move 2 from 4 to 9
move 3 from 6 to 3
move 15 from 5 to 2
move 3 from 2 to 3
move 4 from 2 to 7
move 2 from 5 to 9
move 10 from 3 to 6
move 11 from 9 to 5
move 2 from 4 to 9
move 8 from 9 to 4
move 1 from 9 to 6
move 7 from 4 to 6
move 3 from 5 to 8
move 22 from 6 to 9
move 4 from 7 to 8
move 8 from 5 to 8
move 2 from 4 to 3
move 1 from 8 to 1
move 17 from 8 to 3
move 3 from 3 to 4
move 13 from 3 to 9
move 20 from 9 to 7
move 2 from 2 to 9
move 19 from 9 to 5
move 1 from 1 to 4
move 3 from 2 to 7
move 4 from 4 to 3
move 1 from 9 to 8
move 18 from 5 to 1
move 1 from 9 to 4
move 1 from 9 to 7
move 2 from 4 to 8
move 1 from 5 to 4
move 3 from 2 to 7
move 3 from 3 to 1
move 2 from 1 to 3
move 3 from 3 to 8
move 1 from 4 to 8
move 6 from 8 to 2
move 1 from 3 to 9
move 1 from 3 to 9
move 10 from 1 to 9
move 7 from 1 to 7
move 4 from 7 to 4
move 29 from 7 to 3
move 6 from 2 to 9
move 25 from 3 to 6
move 5 from 3 to 9
move 13 from 6 to 9
move 12 from 6 to 2
move 1 from 8 to 9
move 10 from 2 to 6
move 7 from 6 to 5
move 20 from 9 to 3
move 11 from 3 to 6
move 1 from 7 to 9
move 2 from 2 to 9
move 19 from 9 to 2
move 14 from 6 to 8
move 4 from 5 to 2
move 2 from 4 to 6
move 3 from 5 to 1
move 13 from 8 to 5
move 1 from 6 to 1
move 2 from 4 to 2
move 8 from 2 to 4
move 6 from 4 to 7
move 1 from 9 to 8
move 2 from 4 to 7
move 5 from 2 to 4
move 4 from 4 to 2
move 10 from 5 to 6
move 1 from 1 to 7
move 1 from 5 to 4
move 1 from 4 to 9
move 4 from 7 to 8
move 5 from 1 to 7
move 1 from 9 to 7
move 7 from 3 to 2
move 2 from 5 to 2
move 8 from 6 to 9
move 1 from 4 to 6
move 3 from 7 to 4
move 5 from 9 to 7
move 2 from 4 to 3
move 20 from 2 to 4
move 2 from 4 to 8
move 14 from 4 to 2
move 12 from 7 to 4
move 8 from 2 to 1
move 10 from 2 to 4
move 6 from 8 to 5
move 1 from 7 to 8
move 4 from 4 to 3
move 1 from 3 to 9
move 1 from 2 to 7
move 1 from 6 to 8
move 5 from 3 to 5
move 1 from 3 to 2
move 7 from 4 to 5
move 6 from 1 to 7
move 5 from 7 to 6
move 1 from 6 to 5
move 2 from 7 to 8
move 1 from 2 to 6
move 2 from 8 to 2
move 5 from 5 to 7
move 6 from 6 to 8
move 16 from 4 to 9
move 16 from 9 to 4
move 11 from 5 to 4
move 5 from 8 to 3
move 2 from 5 to 2
move 14 from 4 to 2
move 1 from 6 to 3
move 1 from 6 to 9
move 1 from 5 to 3
move 3 from 8 to 2
move 10 from 4 to 7
move 5 from 9 to 2
move 3 from 4 to 7
move 1 from 1 to 4
move 3 from 2 to 5
move 2 from 3 to 7
move 1 from 4 to 2
move 18 from 2 to 8
move 3 from 8 to 4
move 5 from 3 to 1
move 1 from 3 to 9
move 1 from 9 to 3
move 8 from 8 to 7
move 2 from 5 to 4
move 1 from 5 to 6
move 1 from 2 to 5
move 1 from 5 to 8
move 1 from 6 to 9
move 3 from 2 to 7
move 27 from 7 to 4
move 2 from 2 to 4
move 4 from 8 to 4
move 1 from 9 to 8
move 3 from 1 to 6
move 1 from 3 to 5
move 3 from 8 to 3
move 1 from 1 to 4
move 1 from 8 to 1
move 3 from 1 to 4
move 2 from 8 to 2
move 2 from 6 to 2
move 8 from 4 to 9
move 1 from 7 to 1
move 1 from 5 to 4
move 1 from 7 to 3
move 4 from 2 to 7
move 1 from 8 to 6
move 8 from 9 to 7
move 1 from 6 to 3
move 3 from 3 to 4
move 37 from 4 to 1
move 1 from 4 to 5
move 13 from 7 to 8
move 6 from 8 to 4
move 5 from 8 to 3
move 1 from 7 to 6
move 4 from 1 to 5
move 1 from 6 to 5
move 2 from 8 to 4
move 32 from 1 to 5
move 1 from 1 to 4
move 5 from 3 to 5
move 1 from 3 to 2
move 1 from 2 to 9
move 19 from 5 to 2
move 1 from 9 to 1
move 16 from 5 to 1
move 7 from 5 to 6
move 1 from 3 to 1
move 11 from 1 to 2
move 18 from 2 to 4
move 1 from 5 to 9
move 8 from 6 to 1
move 10 from 2 to 6
move 7 from 4 to 9
move 2 from 2 to 1
move 7 from 4 to 2
move 5 from 4 to 5
move 2 from 9 to 6
move 9 from 6 to 3
move 5 from 5 to 3
move 8 from 4 to 9
move 7 from 9 to 8
move 4 from 2 to 9
move 10 from 3 to 1
move 6 from 8 to 1
move 2 from 6 to 3
move 5 from 3 to 8
move 3 from 2 to 7
move 1 from 9 to 5
move 1 from 3 to 5
move 2 from 7 to 8
move 1 from 8 to 9
move 1 from 6 to 1
move 23 from 1 to 4
move 2 from 5 to 3
move 1 from 8 to 2
move 2 from 8 to 5
move 2 from 5 to 6
move 1 from 2 to 7
move 1 from 7 to 5
move 4 from 9 to 7
move 1 from 7 to 5
move 1 from 3 to 6
move 3 from 7 to 4
move 1 from 3 to 8
move 1 from 4 to 6
move 6 from 1 to 8
move 4 from 6 to 4
move 2 from 9 to 1
move 1 from 5 to 1
move 19 from 4 to 2
move 2 from 9 to 3
move 1 from 9 to 3
move 9 from 1 to 8
move 1 from 5 to 8
move 1 from 9 to 3
move 2 from 3 to 9
move 3 from 8 to 4
move 1 from 4 to 9
move 1 from 9 to 5
move 2 from 3 to 4
move 6 from 4 to 7
move 3 from 9 to 5
move 4 from 4 to 7
move 1 from 5 to 6
move 18 from 2 to 7
move 13 from 7 to 9
move 3 from 5 to 1
move 1 from 2 to 1
move 1 from 6 to 5
move 3 from 1 to 7
move 1 from 1 to 5
move 7 from 9 to 6
move 8 from 7 to 4
move 11 from 7 to 6
move 5 from 9 to 2
move 17 from 6 to 1
move 2 from 5 to 1
move 11 from 8 to 1
move 20 from 1 to 2
move 3 from 8 to 1
move 1 from 9 to 8
move 1 from 6 to 1
move 11 from 1 to 7
move 18 from 2 to 3
move 12 from 4 to 8
move 11 from 7 to 3
move 7 from 2 to 3
move 2 from 1 to 5
move 1 from 1 to 3
move 1 from 8 to 1
move 1 from 5 to 9
move 1 from 9 to 6
move 1 from 8 to 7
move 1 from 5 to 3
move 1 from 6 to 7
move 2 from 8 to 1
move 8 from 3 to 2
move 7 from 2 to 9
move 6 from 8 to 6
move 1 from 9 to 3
move 2 from 6 to 4
move 5 from 9 to 6
move 7 from 6 to 2
move 8 from 2 to 9
move 2 from 1 to 9
move 2 from 7 to 2
move 2 from 4 to 8
move 1 from 2 to 7
move 25 from 3 to 7
move 7 from 9 to 7
move 1 from 2 to 5
move 1 from 1 to 4
move 3 from 8 to 1
move 3 from 1 to 8
move 3 from 7 to 8
move 15 from 7 to 3
move 10 from 8 to 3
move 1 from 5 to 7
move 1 from 8 to 5
move 3 from 9 to 2
move 1 from 6 to 4
move 2 from 2 to 7
move 1 from 2 to 5
move 14 from 7 to 9
move 1 from 6 to 2
move 1 from 7 to 1
move 1 from 5 to 4
move 3 from 4 to 3
move 1 from 7 to 6
move 1 from 2 to 7
move 1 from 1 to 2
move 3 from 9 to 1
move 1 from 6 to 2
move 2 from 2 to 6
move 17 from 3 to 6
move 1 from 8 to 3
move 1 from 5 to 4
move 2 from 7 to 2
move 9 from 9 to 8
move 1 from 9 to 3
move 16 from 3 to 2
move 1 from 7 to 5
move 5 from 6 to 5
move 1 from 1 to 6
move 1 from 4 to 1
move 1 from 9 to 3
move 9 from 8 to 6
move 3 from 1 to 5
move 1 from 9 to 1
move 16 from 2 to 1
move 2 from 2 to 7
move 2 from 3 to 9
move 2 from 7 to 4
move 2 from 9 to 3
move 3 from 3 to 5
move 1 from 4 to 5
move 1 from 4 to 2
move 1 from 1 to 7
move 1 from 7 to 1
move 1 from 3 to 6
move 2 from 5 to 1
move 3 from 6 to 2
move 2 from 5 to 8
move 8 from 5 to 4
move 1 from 5 to 3
move 1 from 3 to 2
move 1 from 8 to 3
move 1 from 3 to 8
move 4 from 1 to 7
move 9 from 1 to 7
move 6 from 1 to 8
move 3 from 7 to 4
move 7 from 6 to 7
move 11 from 4 to 3
move 2 from 3 to 8
move 8 from 3 to 8
move 4 from 6 to 1
move 1 from 7 to 4
move 2 from 1 to 2
move 8 from 7 to 2
move 1 from 4 to 8
move 10 from 8 to 2
move 2 from 6 to 1
move 1 from 1 to 4
move 1 from 4 to 8
move 2 from 1 to 4
move 6 from 6 to 5
move 1 from 1 to 9
move 2 from 6 to 8
move 1 from 4 to 5
move 1 from 6 to 9
move 4 from 8 to 9
move 1 from 7 to 1
move 6 from 8 to 6
move 1 from 6 to 1
move 1 from 4 to 9
move 2 from 9 to 5
move 5 from 5 to 9
move 8 from 9 to 5
move 2 from 8 to 5
move 3 from 6 to 9
move 8 from 5 to 7
move 5 from 5 to 6
move 1 from 9 to 2
move 1 from 3 to 1
move 1 from 6 to 7
move 1 from 5 to 6
move 24 from 2 to 4
move 3 from 9 to 7
move 16 from 4 to 5
move 2 from 1 to 3
move 12 from 5 to 6
move 1 from 9 to 5
move 4 from 5 to 9
move 1 from 1 to 6
move 1 from 5 to 2
move 2 from 9 to 8
move 1 from 8 to 1
move 5 from 4 to 5
move 2 from 3 to 5
move 1 from 8 to 3
move 1 from 1 to 6
move 3 from 5 to 7
move 1 from 9 to 1
move 1 from 2 to 8

@ -0,0 +1,9 @@
# Advent of Code 2022 Solutions
This year I've decided to do each day in a different language:
- [Day 1](https://git.nicholemattera.com/NicholeMattera/AOC-2022-Solutions/src/branch/main/Day%201) - [Javascript](https://en.wikipedia.org/wiki/JavaScript)
- [Day 2](https://git.nicholemattera.com/NicholeMattera/AOC-2022-Solutions/src/branch/main/Day%202) - [Rust](https://en.wikipedia.org/wiki/Rust_(programming_language))
- [Day 3](https://git.nicholemattera.com/NicholeMattera/AOC-2022-Solutions/src/branch/main/Day%203) - [C](https://en.wikipedia.org/wiki/C_(programming_language))
- [Day 4](https://git.nicholemattera.com/NicholeMattera/AOC-2022-Solutions/src/branch/main/Day%204) - [Spreadsheet (LibreOffice Calc)](https://en.wikipedia.org/wiki/Spreadsheet)
- [Day 5](https://git.nicholemattera.com/NicholeMattera/AOC-2022-Solutions/src/branch/main/Day%204) - [Objective-C](https://en.wikipedia.org/wiki/Objective-C)
Loading…
Cancel
Save