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() {
|
||||
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)
|
||||
|
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