This commit is contained in:
Sven Weidauer 2021-12-16 19:06:25 +01:00
parent 630829ea2f
commit c5129af5a1
2 changed files with 217 additions and 1 deletions

View file

@ -27,6 +27,8 @@
269BE5CD2762A08800871C85 /* common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5CB2762A08800871C85 /* common.swift */; }; 269BE5CD2762A08800871C85 /* common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5CB2762A08800871C85 /* common.swift */; };
269BE5CE2762A08800871C85 /* common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5CB2762A08800871C85 /* common.swift */; }; 269BE5CE2762A08800871C85 /* common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5CB2762A08800871C85 /* common.swift */; };
269BE5CF2762A08800871C85 /* common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5CB2762A08800871C85 /* common.swift */; }; 269BE5CF2762A08800871C85 /* common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5CB2762A08800871C85 /* common.swift */; };
26EA5DFE276BA670003E0305 /* common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5CB2762A08800871C85 /* common.swift */; };
26EA5E00276BA680003E0305 /* day16.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EA5DFF276BA680003E0305 /* day16.swift */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
@ -120,6 +122,15 @@
); );
runOnlyForDeploymentPostprocessing = 1; runOnlyForDeploymentPostprocessing = 1;
}; };
26EA5DF5276BA668003E0305 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
@ -144,6 +155,8 @@
269BE5C12762A03F00871C85 /* Day9 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Day9; sourceTree = BUILT_PRODUCTS_DIR; }; 269BE5C12762A03F00871C85 /* Day9 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Day9; sourceTree = BUILT_PRODUCTS_DIR; };
269BE5C82762A04F00871C85 /* day9.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = day9.swift; sourceTree = "<group>"; }; 269BE5C82762A04F00871C85 /* day9.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = day9.swift; sourceTree = "<group>"; };
269BE5CB2762A08800871C85 /* common.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = common.swift; sourceTree = "<group>"; }; 269BE5CB2762A08800871C85 /* common.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = common.swift; sourceTree = "<group>"; };
26EA5DF7276BA668003E0305 /* Day16 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Day16; sourceTree = BUILT_PRODUCTS_DIR; };
26EA5DFF276BA680003E0305 /* day16.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = day16.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -217,12 +230,20 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
26EA5DF4276BA668003E0305 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
263BA594275E974800839C92 = { 263BA594275E974800839C92 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
26EA5DFF276BA680003E0305 /* day16.swift */,
26155467276A6D0A00374D18 /* day15.swift */, 26155467276A6D0A00374D18 /* day15.swift */,
26155459276A6C2C00374D18 /* day14.swift */, 26155459276A6C2C00374D18 /* day14.swift */,
265112962767D16D009B7607 /* day13.swift */, 265112962767D16D009B7607 /* day13.swift */,
@ -251,6 +272,7 @@
2651128F2767D15A009B7607 /* Day13 */, 2651128F2767D15A009B7607 /* Day13 */,
26155452276A6C1C00374D18 /* Day14 */, 26155452276A6C1C00374D18 /* Day14 */,
26155460276A6CF700374D18 /* Day15 */, 26155460276A6CF700374D18 /* Day15 */,
26EA5DF7276BA668003E0305 /* Day16 */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@ -428,6 +450,23 @@
productReference = 269BE5C12762A03F00871C85 /* Day9 */; productReference = 269BE5C12762A03F00871C85 /* Day9 */;
productType = "com.apple.product-type.tool"; productType = "com.apple.product-type.tool";
}; };
26EA5DF6276BA668003E0305 /* Day16 */ = {
isa = PBXNativeTarget;
buildConfigurationList = 26EA5DFD276BA668003E0305 /* Build configuration list for PBXNativeTarget "Day16" */;
buildPhases = (
26EA5DF3276BA668003E0305 /* Sources */,
26EA5DF4276BA668003E0305 /* Frameworks */,
26EA5DF5276BA668003E0305 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = Day16;
productName = Day16;
productReference = 26EA5DF7276BA668003E0305 /* Day16 */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */ /* End PBXNativeTarget section */
/* Begin PBXProject section */ /* Begin PBXProject section */
@ -435,7 +474,7 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
BuildIndependentTargetsInParallel = 1; BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1310; LastSwiftUpdateCheck = 1320;
LastUpgradeCheck = 1310; LastUpgradeCheck = 1310;
TargetAttributes = { TargetAttributes = {
26155451276A6C1C00374D18 = { 26155451276A6C1C00374D18 = {
@ -475,6 +514,9 @@
269BE5C02762A03F00871C85 = { 269BE5C02762A03F00871C85 = {
CreatedOnToolsVersion = 13.1; CreatedOnToolsVersion = 13.1;
}; };
26EA5DF6276BA668003E0305 = {
CreatedOnToolsVersion = 13.2;
};
}; };
}; };
buildConfigurationList = 263BA598275E974800839C92 /* Build configuration list for PBXProject "AoC21" */; buildConfigurationList = 263BA598275E974800839C92 /* Build configuration list for PBXProject "AoC21" */;
@ -500,6 +542,7 @@
2651128E2767D15A009B7607 /* Day13 */, 2651128E2767D15A009B7607 /* Day13 */,
26155451276A6C1C00374D18 /* Day14 */, 26155451276A6C1C00374D18 /* Day14 */,
2615545F276A6CF700374D18 /* Day15 */, 2615545F276A6CF700374D18 /* Day15 */,
26EA5DF6276BA668003E0305 /* Day16 */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
@ -595,6 +638,15 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
26EA5DF3276BA668003E0305 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
26EA5DFE276BA670003E0305 /* common.swift in Sources */,
26EA5E00276BA680003E0305 /* day16.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
@ -1024,6 +1076,30 @@
}; };
name = Release; name = Release;
}; };
26EA5DFB276BA668003E0305 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 722B335UM5;
ENABLE_HARDENED_RUNTIME = YES;
MACOSX_DEPLOYMENT_TARGET = 12.1;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
26EA5DFC276BA668003E0305 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 722B335UM5;
ENABLE_HARDENED_RUNTIME = YES;
MACOSX_DEPLOYMENT_TARGET = 12.1;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
name = Release;
};
/* End XCBuildConfiguration section */ /* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */ /* Begin XCConfigurationList section */
@ -1126,6 +1202,15 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
26EA5DFD276BA668003E0305 /* Build configuration list for PBXNativeTarget "Day16" */ = {
isa = XCConfigurationList;
buildConfigurations = (
26EA5DFB276BA668003E0305 /* Debug */,
26EA5DFC276BA668003E0305 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */ /* End XCConfigurationList section */
}; };
rootObject = 263BA595275E974800839C92 /* Project object */; rootObject = 263BA595275E974800839C92 /* Project object */;

131
day16.swift Normal file
View file

@ -0,0 +1,131 @@
@main
struct Day16: Puzzle {
mutating func run() {
var start = Cursor.start
let part2 = packet(at: &start)
print("Part 1:", versionSum)
print("Part 2:", part2)
}
var versionSum = 0
mutating func packet(at cursor: inout Cursor) -> UInt64 {
let version = getBits(at: &cursor, count: 3)
let type = getBits(at: &cursor, count: 3)
versionSum += Int(version)
if type == 4 {
return literal(at: &cursor)
}
let subPackets = operatorPacket(at: &cursor)
switch type {
case 0: return subPackets.reduce(0, +)
case 1: return subPackets.reduce(1, *)
case 2: return subPackets.min()!
case 3: return subPackets.max()!
case 5: return subPackets[0] > subPackets[1] ? 1 : 0
case 6: return subPackets[0] < subPackets[1] ? 1 : 0
case 7: return subPackets[0] == subPackets[1] ? 1 : 0
default: fatalError("Unknown packet type \(type)")
}
}
func literal(at cursor: inout Cursor) -> UInt64 {
var result: UInt64 = 0
while getBit(at: &cursor) {
result = result << 4 | getBits(at: &cursor, count: 4)
}
result = result << 4 | getBits(at: &cursor, count: 4)
return result
}
mutating func operatorPacket(at cursor: inout Cursor) -> [UInt64] {
let type = getBit(at: &cursor)
var result: [UInt64] = []
if type {
let count = getBits(at: &cursor, count: 11)
for _ in 0..<count {
result.append(packet(at: &cursor))
}
} else {
let length = getBits(at: &cursor, count: 15)
let end = cursor.adding(bits: Int(length))
while cursor < end {
result.append(packet(at: &cursor))
}
}
return result
}
struct Cursor: Equatable {
var offset: Int
var bit: Int
static let start = Cursor(offset: 0, bit: 0)
var remainingBits: Int { 4 - bit }
mutating func skip(_ bits: Int) {
bit += bits
offset += bit / 4
bit = bit % 4
}
func adding(bits: Int) -> Cursor {
var result = self
result.skip(bits)
return result
}
var bitPos: Int {
offset * 4 + bit
}
static func < (lhs: Cursor, rhs: Cursor) -> Bool {
lhs.bitPos < rhs.bitPos
}
}
func getBit(at cursor: inout Cursor) -> Bool {
getBits(at: &cursor, count: 1) == 1
}
func getBitRange(_ x: Int, start: Int, count: Int) -> UInt64 {
let mask = UInt64((1 << count) - 1)
let shift = 4 - count - start
precondition(shift >= 0)
return UInt64(x) >> shift & mask
}
func getBits(at cursor: inout Cursor, count: Int) -> UInt64 {
var remaining = count
var result: UInt64 = 0
while remaining > 0 {
let take = min(cursor.remainingBits, remaining)
let bits = getBitRange(input[cursor.offset], start: cursor.bit, count: take)
result = result << take | bits
remaining -= take
cursor.bit += take
if cursor.bit == 4 {
cursor.bit = 0
cursor.offset += 1
}
}
return result
}
let input = """
E20D79005573F71DA0054E48527EF97D3004653BB1FC006867A8B1371AC49C801039171941340066E6B99A6A58B8110088BA008CE6F7893D4E6F7893DCDCFDB9D6CBC4026FE8026200DC7D84B1C00010A89507E3CCEE37B592014D3C01491B6697A83CB4F59E5E7FFA5CC66D4BC6F05D3004E6BB742B004E7E6B3375A46CF91D8C027911797589E17920F4009BE72DA8D2E4523DCEE86A8018C4AD3C7F2D2D02C5B9FF53366E3004658DB0012A963891D168801D08480485B005C0010A883116308002171AA24C679E0394EB898023331E60AB401294D98CA6CD8C01D9B349E0A99363003E655D40289CBDBB2F55D25E53ECAF14D9ABBB4CC726F038C011B0044401987D0BE0C00021B04E2546499DE824C015B004A7755B570013F2DD8627C65C02186F2996E9CCD04E5718C5CBCC016B004A4F61B27B0D9B8633F9344D57B0C1D3805537ADFA21F231C6EC9F3D3089FF7CD25E5941200C96801F191C77091238EE13A704A7CCC802B3B00567F192296259ABD9C400282915B9F6E98879823046C0010C626C966A19351EE27DE86C8E6968F2BE3D2008EE540FC01196989CD9410055725480D60025737BA1547D700727B9A89B444971830070401F8D70BA3B8803F16A3FC2D00043621C3B8A733C8BD880212BCDEE9D34929164D5CB08032594E5E1D25C0055E5B771E966783240220CD19E802E200F4588450BC401A8FB14E0A1805B36F3243B2833247536B70BDC00A60348880C7730039400B402A91009F650028C00E2020918077610021C00C1002D80512601188803B4000C148025010036727EE5AD6B445CC011E00B825E14F4BBF5F97853D2EFD6256F8FFE9F3B001420C01A88915E259002191EE2F4392004323E44A8B4C0069CEF34D304C001AB94379D149BD904507004A6D466B618402477802E200D47383719C0010F8A507A294CC9C90024A967C9995EE2933BA840
""".compactMap { $0.hexDigitValue }
}