Skip to content

Commit eb863d3

Browse files
committed
Day 16
1 parent f08e9fd commit eb863d3

File tree

4 files changed

+128
-3
lines changed

4 files changed

+128
-3
lines changed

Day 16 - Scala/Main.scala

+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import java.lang.Long.parseLong
2+
import scala.annotation.switch
3+
import scala.collection.mutable.ArrayBuffer
4+
import scala.io.Source
5+
6+
object Const {
7+
val inputFile = "./input.txt"
8+
}
9+
10+
object PacketUtility {
11+
val valuePacketId = 4
12+
13+
def GetPacketVersionAndType(packet: String): (Int, Int) = {
14+
val version = Integer.parseUnsignedInt(packet.substring(0, 3), 2)
15+
val id = Integer.parseUnsignedInt(packet.substring(3, 6), 2)
16+
(version, id)
17+
}
18+
19+
def GetNextPacket(packet: String): Packet = {
20+
val (version, id) = GetPacketVersionAndType(packet)
21+
if(id == valuePacketId) { // Literal Value Packet
22+
var i = 6
23+
var bits = ""
24+
while(true) {
25+
for(j <- 1 until 5) {
26+
bits += packet(i+j)
27+
}
28+
if(packet(i) == '0') {
29+
return new ValuePacket(version, id, i+5, parseLong(bits, 2))
30+
}
31+
i += 5
32+
}
33+
null
34+
}
35+
else { // Operator Packet
36+
val subPackets = new ArrayBuffer[Packet]()
37+
var totalLength = 7
38+
39+
if(packet(6) == '0') { // We know length of subPackets
40+
totalLength += 15
41+
var nextSubPacketIndex = 22
42+
val totalSubPacketsLength = Integer.parseUnsignedInt(packet.substring(7, nextSubPacketIndex),2)
43+
var foundSubPacketsLength = 0
44+
while(foundSubPacketsLength < totalSubPacketsLength) {
45+
val nextSubPacket = GetNextPacket(packet.substring(nextSubPacketIndex))
46+
nextSubPacketIndex += nextSubPacket.length
47+
foundSubPacketsLength += nextSubPacket.length
48+
subPackets.append(nextSubPacket)
49+
}
50+
}
51+
else { // We know amount of subPackets
52+
totalLength += 11
53+
var nextSubPacketIndex = 18
54+
val numberOfSubPackets = Integer.parseUnsignedInt(packet.substring(7, nextSubPacketIndex),2)
55+
for(_ <- 0 until numberOfSubPackets) {
56+
val nextSubPacket = GetNextPacket(packet.substring(nextSubPacketIndex))
57+
nextSubPacketIndex += nextSubPacket.length
58+
subPackets.append(nextSubPacket)
59+
}
60+
}
61+
62+
for(p <- subPackets) {
63+
totalLength += p.length
64+
}
65+
66+
new OperatorPacket(version, id, totalLength, subPackets.toArray)
67+
}
68+
}
69+
}
70+
71+
abstract class Packet(val version: Int, val id: Int, val length: Int) {
72+
def getValue: Long
73+
def getTotalVersion: Int = {
74+
version
75+
}
76+
77+
override def toString: String = {
78+
s"Packet (Ver: $version, Id: $id, Length: $length)"
79+
}
80+
}
81+
82+
class ValuePacket(override val version: Int, override val id: Int, override val length: Int, var value: Long) extends Packet(version, id, length) {
83+
override def getValue: Long = {
84+
value
85+
}
86+
87+
override def toString: String = {
88+
s"${super.toString}: Value = $value"
89+
}
90+
}
91+
92+
class OperatorPacket(override val version: Int, override val id: Int, override val length: Int, val subPackets: Array[Packet]) extends Packet(version, id, length) {
93+
def getValue: Long = {
94+
(id: @switch) match {
95+
case 0 => subPackets.foldLeft(0L)((v, packet) => v + packet.getValue)
96+
case 1 => subPackets.foldLeft(1L)((v, packet) => v * packet.getValue)
97+
case 2 => subPackets.map(packet => packet.getValue).min
98+
case 3 => subPackets.map(packet => packet.getValue).max
99+
case 5 => if (subPackets(0).getValue > subPackets(1).getValue) 1 else 0
100+
case 6 => if (subPackets(0).getValue < subPackets(1).getValue) 1 else 0
101+
case 7 => if (subPackets(0).getValue == subPackets(1).getValue) 1 else 0
102+
}
103+
}
104+
105+
override def getTotalVersion: Int = {
106+
subPackets.foldLeft(version)((last, packet) => last + packet.getTotalVersion)
107+
}
108+
109+
override def toString: String = {
110+
s"${super.toString}: SubPackets: ${subPackets.length}"
111+
}
112+
}
113+
114+
object Main extends App {
115+
val fileSource = Source.fromFile(Const.inputFile)
116+
var bits = fileSource.getLines.toList.head.map(c => String.format("%1$4s" ,Integer.parseUnsignedInt(c.toString, 16).toBinaryString).replace(' ', '0')).foldLeft("")((prev, n) => prev.concat(n))
117+
fileSource.close
118+
119+
val packet = PacketUtility.GetNextPacket(bits)
120+
121+
println(s"Part 1: ${packet.getTotalVersion}")
122+
println(s"Part 2: ${packet.getValue}")
123+
}

Day 16 - Scala/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# [Day 16](https://adventofcode.com/2021/day/16) in [Scala](https://www.scala-lang.org/)

Day 16 - Scala/input.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
620D49005AD2245800D0C9E72BD279CAFB0016B1FA2B1802DC00D0CC611A47FCE2A4ACE1DD144BFABBFACA002FB2C6F33DFF4A0C0119B169B013005F003720004263644384800087C3B8B51C26B449130802D1A0068A5BD7D49DE793A48B5400D8293B1F95C5A3005257B880F5802A00084C788AD0440010F8490F608CACE034401AB4D0F5802726B3392EE2199628CEA007001884005C92015CC8051800130EC0468A01042803B8300D8E200788018C027890088CE0049006028012AB00342A0060801B2EBE400424933980453EFB2ABB36032274C026E4976001237D964FF736AFB56F254CB84CDF136C1007E7EB42298FE713749F973F7283005656F902A004067CD27CC1C00D9CB5FDD4D0014348010C8331C21710021304638C513006E234308B060094BEB76CE3966AA007C6588A5670DC3754395485007A718A7F149CA2DD3B6E7B777800118E7B59C0ECF5AE5D3B6CB1496BAE53B7ADD78C013C00CD2629BF5371D1D4C537EA6E3A3E95A3E180592AC7246B34032CF92804001A1CCF9BA521782ECBD69A98648BC18025800F8C9C37C827CA7BEFB31EADF0AE801BA42B87935B8EF976194EEC426AAF640168CECAF84BC004AE7D1673A6A600B4AB65802D230D35CF81B803D3775683F3A3860087802132FB32F322C92A4C402524F2DE006E8000854378F710C0010D8F30FE224AE428C015E00D40401987F06E3600021D0CE3EC228DA000574E4C3080182931E936E953B200BF656E15400D3496E4A725B92998027C00A84EEEE6B347D30BE60094E537AA73A1D600B880371AA36C3200043235C4C866C018E4963B7E7AA2B379918C639F1550086064BB148BA499EC731004E1AC966BDBC7646600C080370822AC4C1007E38C428BE0008741689D0ECC01197CF216EA16802D3748FE91B25CAF6D5F11C463004E4FD08FAF381F6004D3232CC93E7715B463F780

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
Done in variety of languages
33

44
### Progress
5-
![](https://img.shields.io/badge/days%20completed%20📅-15-blue)
5+
![](https://img.shields.io/badge/days%20completed%20📅-16-blue)
66

7-
![](https://img.shields.io/badge/stars%20⭐-30-yellow)
7+
![](https://img.shields.io/badge/stars%20⭐-32-yellow)
88

99
![](https://img.shields.io/badge/languages%20💬-14-red)
1010

@@ -18,7 +18,7 @@ Done in variety of languages
1818
|----:|:--------:|:---:|----:|:--------:|
1919
|1|Python||14|Go|
2020
|2|C# (.NET Core 6.0)||15|Scala|
21-
|3|C++||16||
21+
|3|C++||16|Scala|
2222
|4|TypeScript||17||
2323
|5|Kotlin||18||
2424
|6|Haskell||19||

0 commit comments

Comments
 (0)