go: add «2751. Robot Collisions»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
c2b4298de8
commit
c69a2e96c7
1 changed files with 71 additions and 0 deletions
71
go/robot-collisions.go
Normal file
71
go/robot-collisions.go
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"cmp"
|
||||||
|
"slices"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Robot struct {
|
||||||
|
index int
|
||||||
|
position int
|
||||||
|
health int
|
||||||
|
direction byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func survivedRobotsHealths(positions []int, healths []int, directions string) []int {
|
||||||
|
// construct a slice of robots instead of separate slices
|
||||||
|
robots := make([]Robot, len(positions))
|
||||||
|
for i := range len(positions) {
|
||||||
|
robots[i] = Robot{
|
||||||
|
index: i,
|
||||||
|
position: positions[i],
|
||||||
|
health: healths[i],
|
||||||
|
direction: directions[i],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort by positions
|
||||||
|
slices.SortFunc(robots, func(a, b Robot) int {
|
||||||
|
return cmp.Compare(a.position, b.position)
|
||||||
|
})
|
||||||
|
|
||||||
|
var stack []*Robot
|
||||||
|
for i := range robots {
|
||||||
|
robot := &robots[i]
|
||||||
|
if robot.direction == 'R' {
|
||||||
|
stack = append(stack, robot)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for len(stack) > 0 && robot.health > 0 {
|
||||||
|
otherRobot := stack[len(stack)-1]
|
||||||
|
stack = stack[:len(stack)-1]
|
||||||
|
|
||||||
|
if otherRobot.health > robot.health {
|
||||||
|
otherRobot.health--
|
||||||
|
robot.health = 0
|
||||||
|
stack = append(stack, otherRobot)
|
||||||
|
} else if otherRobot.health < robot.health {
|
||||||
|
robot.health--
|
||||||
|
otherRobot.health = 0
|
||||||
|
} else {
|
||||||
|
robot.health = 0
|
||||||
|
otherRobot.health = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// revert to the original ordering to preserve the order of the robots
|
||||||
|
// for the output
|
||||||
|
slices.SortFunc(robots, func(a, b Robot) int {
|
||||||
|
return cmp.Compare(a.index, b.index)
|
||||||
|
})
|
||||||
|
|
||||||
|
var hp []int
|
||||||
|
for _, robot := range robots {
|
||||||
|
if robot.health > 0 {
|
||||||
|
hp = append(hp, robot.health)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hp
|
||||||
|
}
|
Loading…
Reference in a new issue