2018 Day 24 Work
This commit is contained in:
		
							
								
								
									
										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 | ||||
		Reference in New Issue
	
	Block a user