1
0
Fork 0
mirror of https://gitlab.com/mfocko/LeetCode.git synced 2024-09-19 17:56:55 +02:00
LeetCode/go/robot-collisions.go
Matej Focko c69a2e96c7
go: add «2751. Robot Collisions»
Signed-off-by: Matej Focko <me@mfocko.xyz>
2024-07-13 14:51:07 +02:00

71 lines
1.4 KiB
Go

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
}