diff --git a/2018/day24/army.go b/2018/day24/army.go new file mode 100644 index 0000000..2dedcc9 --- /dev/null +++ b/2018/day24/army.go @@ -0,0 +1,80 @@ +package main + +type Army struct { + tp int + units int + hp int + immunities []string + weaknesses []string + damageType string + strength int + init int +} + +func NewArmy(inp string, tp int) *Army { + a := new(Army) + a.tp = tp + + // Pull the parenthetical out, if one is there + var prnth, other string + var inPrnth bool + var ptsOfOther int + for _, v := range strings.Fields(inp) { + if len(v) > 0 && v[len(v)-1] == ')' { + prnth = prnth + " " + v + inPrnth = false + continue + } else if len(v) > 0 && v[0] == '(' { + inPrnth = true + prnth = v + continue + } + if inPrnth { + prnth = prnth + " " + v + } else { + if len(other) > 0 { + other = other + " " + } + other = other + v + ptsOfOther++ + } + } + _, err := fmt.Sscanf(other, "%d units each with %d hit points with an attack that does %d %s damage at initiative %d", &a.units, &a.hp, &a.strength, &a.damageType, &a.init) + if err != nil { + panic(err) + } + // Now parse out immunities and weaknesses + if len(prnth) > 3 { + prnth = prnth[1:len(prnth)-1] + var inImmune bool + for _, v := range strings.Fields(prnth) { + if v == "immune" { + inImmune = true + } else if v == "weak" { + inImmune = false + } + if v == "to" { + continue + } + if v[len(v)-1] == ';' || v[len(v)-1] == ',' { + v = v[:len(v)-1] + } + if inImmune { + a.immunities = append(a.immunities, v) + } else { + a.weaknesses = append(a.weaknesses, v) + } + } + } + return a +} + +func (a *Army) Power() int { + return a.units * a.strength +} + +// Army Sorting +type ByPower []Army +func (b ByPower) Len() int { return len(b) } +func (b ByPower) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b ByPower) Less(i, j int) { b[i].Power() < b[j].Power() } diff --git a/2018/day24/combat.go b/2018/day24/combat.go new file mode 100644 index 0000000..4cd5e2a --- /dev/null +++ b/2018/day24/combat.go @@ -0,0 +1,10 @@ +package main + +// All Battle Logic is in here +func Battle(army1, army2 []Army) { + allCombatants = append(army1, army2...) + sort.Sort(ByPower(allCombatants)) + for _, v := range allCombatants { + fmt.Print("%d %d %d (%d)\n", v.tp, v.units, v.hp, v.Power()) + } +} diff --git a/2018/day24/day24.go b/2018/day24/day24.go index 8c07e21..f656dde 100644 --- a/2018/day24/day24.go +++ b/2018/day24/day24.go @@ -15,7 +15,11 @@ const ( func main() { inp := StdinToStringSlice() immune, infect := ParseInput(inp) - + for _, v := range immune { + fmt.Println("++ ", v.immunities) + fmt.Println("-- ", v.weaknesses) + } + _, _ = immune, infect } func ParseInput(inp []string) ([]Army, []Army) { @@ -42,58 +46,6 @@ func ParseInput(inp []string) ([]Army, []Army) { return immune, infection } -type AttackType int - -type Army struct { - tp int - units int - hp int - immunities []string - weaknesses []string - damageType string - strength int - init int -} - -func NewArmy(inp string, tp int) *Army { - a := new(Army) - a.tp = tp - - // Pull the parenthetical out, if one is there - var prnth, other string - var inPrnth bool - var ptsOfOther int - for _, v := range strings.Fields(inp) { - if len(v) > 0 && v[len(v)-1] == ')' { - prnth = prnth + " " + v - inPrnth = false - continue - } else if len(v) > 0 && v[0] == '(' { - inPrnth = true - prnth = v - continue - } - if inPrnth { - prnth = prnth + " " + v - } else { - if len(other) > 0 { - other = other + " " - } - other = other + v - ptsOfOther++ - } - } - _, err := fmt.Sscanf(other, "%d units each with %d hit points with an attack that does %d %s damage at initiative %d", &a.units, &a.hp, &a.strength, &a.damageType, &a.init) - if err != nil { - panic(err) - } - return a -} - -func (a *Army) Power() int { - return a.units * a.strength -} - func StdinToStringSlice() []string { var input []string scanner := bufio.NewScanner(os.Stdin) diff --git a/2018/day24/problem b/2018/day24/problem new file mode 100644 index 0000000..7d11b12 --- /dev/null +++ b/2018/day24/problem @@ -0,0 +1,231 @@ +Advent of Code + +--- Day 24: Immune System Simulator 20XX --- + + After a weird buzzing noise, you appear back at the man's cottage. He seems + relieved to see his friend, but quickly notices that the little reindeer + caught some kind of cold while out exploring. + + The portly man explains that this reindeer's immune system isn't similar to + regular reindeer immune systems: + + The immune system and the infection each have an army made up of several + groups; each group consists of one or more identical units. The armies + repeatedly fight until only one army has units remaining. + + Units within a group all have the same hit points (amount of damage a unit + can take before it is destroyed), attack damage (the amount of damage each + unit deals), an attack type, an initiative (higher initiative units attack + first and win ties), and sometimes weaknesses or immunities. Here is an + example group: + + 18 units each with 729 hit points (weak to fire; immune to cold, slashing) + with an attack that does 8 radiation damage at initiative 10 + + Each group also has an effective power: the number of units in that group + multiplied by their attack damage. The above group has an effective power of + 18 * 8 = 144. Groups never have zero or negative units; instead, the group + is removed from combat. + + Each fight consists of two phases: target selection and attacking. + + During the target selection phase, each group attempts to choose one target. + In decreasing order of effective power, groups choose their targets; in a + tie, the group with the higher initiative chooses first. The attacking group + chooses to target the group in the enemy army to which it would deal the + most damage (after accounting for weaknesses and immunities, but not + accounting for whether the defending group has enough units to actually + receive all of that damage). + + If an attacking group is considering two defending groups to which it would + deal equal damage, it chooses to target the defending group with the largest + effective power; if there is still a tie, it chooses the defending group + with the highest initiative. If it cannot deal any defending groups damage, + it does not choose a target. Defending groups can only be chosen as a target + by one attacking group. + + At the end of the target selection phase, each group has selected zero or + one groups to attack, and each group is being attacked by zero or one + groups. + + During the attacking phase, each group deals damage to the target it + selected, if any. Groups attack in decreasing order of initiative, + regardless of whether they are part of the infection or the immune system. + (If a group contains no units, it cannot attack.) + + The damage an attacking group deals to a defending group depends on the + attacking group's attack type and the defending group's immunities and + weaknesses. By default, an attacking group would deal damage equal to its + effective power to the defending group. However, if the defending group is + immune to the attacking group's attack type, the defending group instead + takes no damage; if the defending group is weak to the attacking group's + attack type, the defending group instead takes double damage. + + The defending group only loses whole units from damage; damage is always + dealt in such a way that it kills the most units possible, and any remaining + damage to a unit that does not immediately kill it is ignored. For example, + if a defending group contains 10 units with 10 hit points each and receives + 75 damage, it loses exactly 7 units and is left with 3 units at full health. + + After the fight is over, if both armies still contain units, a new fight + begins; combat only ends once one army has lost all of its units. + + For example, consider the following armies: + + Immune System: + 17 units each with 5390 hit points (weak to radiation, bludgeoning) with + an attack that does 4507 fire damage at initiative 2 + 989 units each with 1274 hit points (immune to fire; weak to bludgeoning, + slashing) with an attack that does 25 slashing damage at initiative 3 + + Infection: + 801 units each with 4706 hit points (weak to radiation) with an attack + that does 116 bludgeoning damage at initiative 1 + 4485 units each with 2961 hit points (immune to radiation; weak to fire, + cold) with an attack that does 12 slashing damage at initiative 4 + + If these armies were to enter combat, the following fights, including details during the target selection and attacking phases, would take place: + + Immune System: + Group 1 contains 17 units + Group 2 contains 989 units + Infection: + Group 1 contains 801 units + Group 2 contains 4485 units + + Infection group 1 would deal defending group 1 185832 damage + Infection group 1 would deal defending group 2 185832 damage + Infection group 2 would deal defending group 2 107640 damage + Immune System group 1 would deal defending group 1 76619 damage + Immune System group 1 would deal defending group 2 153238 damage + Immune System group 2 would deal defending group 1 24725 damage + + Infection group 2 attacks defending group 2, killing 84 units + Immune System group 2 attacks defending group 1, killing 4 units + Immune System group 1 attacks defending group 2, killing 51 units + Infection group 1 attacks defending group 1, killing 17 units + + Immune System: + Group 2 contains 905 units + Infection: + Group 1 contains 797 units + Group 2 contains 4434 units + + Infection group 1 would deal defending group 2 184904 damage + Immune System group 2 would deal defending group 1 22625 damage + Immune System group 2 would deal defending group 2 22625 damage + + Immune System group 2 attacks defending group 1, killing 4 units + Infection group 1 attacks defending group 2, killing 144 units + + Immune System: + Group 2 contains 761 units + Infection: + Group 1 contains 793 units + Group 2 contains 4434 units + + Infection group 1 would deal defending group 2 183976 damage + Immune System group 2 would deal defending group 1 19025 damage + Immune System group 2 would deal defending group 2 19025 damage + + Immune System group 2 attacks defending group 1, killing 4 units + Infection group 1 attacks defending group 2, killing 143 units + + Immune System: + Group 2 contains 618 units + Infection: + Group 1 contains 789 units + Group 2 contains 4434 units + + Infection group 1 would deal defending group 2 183048 damage + Immune System group 2 would deal defending group 1 15450 damage + Immune System group 2 would deal defending group 2 15450 damage + + Immune System group 2 attacks defending group 1, killing 3 units + Infection group 1 attacks defending group 2, killing 143 units + + Immune System: + Group 2 contains 475 units + Infection: + Group 1 contains 786 units + Group 2 contains 4434 units + + Infection group 1 would deal defending group 2 182352 damage + Immune System group 2 would deal defending group 1 11875 damage + Immune System group 2 would deal defending group 2 11875 damage + + Immune System group 2 attacks defending group 1, killing 2 units + Infection group 1 attacks defending group 2, killing 142 units + + Immune System: + Group 2 contains 333 units + Infection: + Group 1 contains 784 units + Group 2 contains 4434 units + + Infection group 1 would deal defending group 2 181888 damage + Immune System group 2 would deal defending group 1 8325 damage + Immune System group 2 would deal defending group 2 8325 damage + + Immune System group 2 attacks defending group 1, killing 1 unit + Infection group 1 attacks defending group 2, killing 142 units + + Immune System: + Group 2 contains 191 units + Infection: + Group 1 contains 783 units + Group 2 contains 4434 units + + Infection group 1 would deal defending group 2 181656 damage + Immune System group 2 would deal defending group 1 4775 damage + Immune System group 2 would deal defending group 2 4775 damage + + Immune System group 2 attacks defending group 1, killing 1 unit + Infection group 1 attacks defending group 2, killing 142 units + + Immune System: + Group 2 contains 49 units + Infection: + Group 1 contains 782 units + Group 2 contains 4434 units + + Infection group 1 would deal defending group 2 181424 damage + Immune System group 2 would deal defending group 1 1225 damage + Immune System group 2 would deal defending group 2 1225 damage + + Immune System group 2 attacks defending group 1, killing 0 units + Infection group 1 attacks defending group 2, killing 49 units + + Immune System: + No groups remain. + Infection: + Group 1 contains 782 units + Group 2 contains 4434 units + + In the example above, the winning army ends up with 782 + 4434 = 5216 units. + + You scan the reindeer's condition (your puzzle input); the white-bearded man looks nervous. As it stands now, how many units would the winning army have? + + To begin, get your puzzle input. + + Answer: _____________________ [ [Submit] ] + +References + + Visible links + . https://adventofcode.com/ + . https://adventofcode.com/2018/about + . https://adventofcode.com/2018/events + . https://adventofcode.com/2018/settings + . https://adventofcode.com/2018/auth/logout + . Advent of Code Supporter + https://adventofcode.com/2018/support + . https://adventofcode.com/2018 + . https://adventofcode.com/2018 + . https://adventofcode.com/2018/support + . https://adventofcode.com/2018/sponsors + . https://adventofcode.com/2018/leaderboard + . https://adventofcode.com/2018/stats + . https://adventofcode.com/2018/sponsors + . https://www.youtube.com/watch?v=NDVjLt_QHL8&t=7 + . https://adventofcode.com/2018/day/24/input