2018 Day 24 Work
This commit is contained in:
parent
d8e15a5d51
commit
4a7a0e872e
80
2018/day24/army.go
Normal file
80
2018/day24/army.go
Normal file
@ -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() }
|
10
2018/day24/combat.go
Normal file
10
2018/day24/combat.go
Normal file
@ -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())
|
||||||
|
}
|
||||||
|
}
|
@ -15,7 +15,11 @@ const (
|
|||||||
func main() {
|
func main() {
|
||||||
inp := StdinToStringSlice()
|
inp := StdinToStringSlice()
|
||||||
immune, infect := ParseInput(inp)
|
immune, infect := ParseInput(inp)
|
||||||
|
for _, v := range immune {
|
||||||
|
fmt.Println("++ ", v.immunities)
|
||||||
|
fmt.Println("-- ", v.weaknesses)
|
||||||
|
}
|
||||||
|
_, _ = immune, infect
|
||||||
}
|
}
|
||||||
|
|
||||||
func ParseInput(inp []string) ([]Army, []Army) {
|
func ParseInput(inp []string) ([]Army, []Army) {
|
||||||
@ -42,58 +46,6 @@ func ParseInput(inp []string) ([]Army, []Army) {
|
|||||||
return immune, infection
|
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 {
|
func StdinToStringSlice() []string {
|
||||||
var input []string
|
var input []string
|
||||||
scanner := bufio.NewScanner(os.Stdin)
|
scanner := bufio.NewScanner(os.Stdin)
|
||||||
|
231
2018/day24/problem
Normal file
231
2018/day24/problem
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user