開発環境
- macOS Catalina - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Go (プログラミング言語)
入門Goプログラミング (Nathan Youngman(著)、Roger Peppé(著)、吉川 邦夫(監修, 翻訳)、翔泳社)のUNIT 7(並行プログラミング)、LESSON 31(競合状態)の練習問題-2の解答を求めてみる。
コード
package main
import (
"fmt"
"image"
"math/rand"
"time"
)
type command int
const (
right = command(0)
left = command(1)
start = command(2)
stop = command(3)
)
type roverDriver struct {
commandc chan command
}
func newRoverDriver() *roverDriver {
rPtr := &roverDriver{
commandc: make(chan command),
}
go rPtr.drive()
return rPtr
}
func (r *roverDriver) right() {
r.commandc <- right
}
func (r *roverDriver) left() {
r.commandc <- left
}
func (r *roverDriver) start() {
r.commandc <- start
}
func (r *roverDriver) stop() {
r.commandc <- stop
}
func (r *roverDriver) drive() {
pos := image.Point{X: 0, Y: 0}
direction := image.Point{X: 1, Y: 0}
updateInterval := 250 * time.Millisecond
nextMove := time.After(updateInterval)
speed := 0
for {
select {
case c := <-r.commandc:
switch c {
case right:
direction = image.Point{
X: -direction.Y,
Y: direction.X,
}
case left:
direction = image.Point{
X: direction.Y,
Y: -direction.X,
}
case start:
speed = 1
case stop:
speed = 0
}
case <-nextMove:
pos = pos.Add(direction.Mul(speed))
fmt.Printf("moved to %v\n", pos)
nextMove = time.After(updateInterval)
}
}
}
func main() {
rand.Seed(time.Now().UnixNano())
rPtr := newRoverDriver()
methods := []func(){
rPtr.right,
rPtr.left,
rPtr.start,
rPtr.stop,
}
for _, method := range methods {
time.Sleep(time.Second)
method()
}
for i := 0; i < 20; i++ {
time.Sleep(time.Second)
methods[rand.Intn(len(methods))]()
}
}
入出力結果(Zsh、PowerShell、Terminal)
% go build rover.go
% ./rover
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (1,0)
moved to (2,0)
moved to (3,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (5,0)
moved to (6,0)
moved to (7,0)
moved to (8,0)
moved to (9,0)
moved to (10,0)
moved to (11,0)
moved to (12,0)
moved to (12,-1)
moved to (12,-2)
moved to (12,-3)
moved to (12,-4)
moved to (11,-4)
moved to (10,-4)
moved to (9,-4)
moved to (8,-4)
moved to (8,-5)
moved to (8,-6)
moved to (8,-7)
moved to (8,-8)
moved to (8,-9)
moved to (8,-10)
moved to (8,-11)
moved to (8,-12)
moved to (9,-12)
moved to (10,-12)
moved to (11,-12)
moved to (12,-12)
moved to (13,-12)
moved to (14,-12)
moved to (15,-12)
moved to (16,-12)
moved to (16,-13)
moved to (16,-14)
moved to (16,-15)
moved to (16,-16)
moved to (15,-16)
moved to (14,-16)
moved to (13,-16)
moved to (12,-16)
moved to (12,-17)
moved to (12,-18)
moved to (12,-19)
moved to (12,-20)
moved to (11,-20)
moved to (10,-20)
moved to (9,-20)
moved to (8,-20)
moved to (8,-21)
moved to (8,-22)
moved to (8,-23)
moved to (8,-24)
moved to (8,-24)
moved to (8,-24)
moved to (8,-24)
moved to (8,-24)
moved to (8,-25)
moved to (8,-26)
moved to (8,-27)
moved to (8,-28)
moved to (8,-28)
moved to (8,-28)
moved to (8,-28)
moved to (8,-28)
% ./rover
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (0,0)
moved to (1,0)
moved to (2,0)
moved to (3,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (4,0)
moved to (5,0)
moved to (6,0)
moved to (7,0)
moved to (8,0)
moved to (8,-1)
moved to (8,-2)
moved to (8,-3)
moved to (8,-4)
moved to (9,-4)
moved to (10,-4)
moved to (11,-4)
moved to (12,-4)
moved to (12,-5)
moved to (12,-6)
moved to (12,-7)
moved to (12,-8)
moved to (11,-8)
moved to (10,-8)
moved to (9,-8)
moved to (8,-8)
moved to (8,-8)
moved to (8,-8)
moved to (8,-8)
moved to (8,-8)
moved to (7,-8)
moved to (6,-8)
moved to (5,-8)
moved to (4,-8)
moved to (4,-8)
moved to (4,-8)
moved to (4,-8)
moved to (4,-8)
moved to (3,-8)
moved to (2,-8)
moved to (1,-8)
moved to (0,-8)
moved to (0,-7)
moved to (0,-6)
moved to (0,-5)
moved to (0,-4)
moved to (0,-3)
moved to (0,-2)
moved to (0,-1)
moved to (0,0)
moved to (0,1)
moved to (0,2)
moved to (0,3)
moved to (0,4)
moved to (0,4)
moved to (0,4)
moved to (0,4)
moved to (0,4)
moved to (0,4)
moved to (0,4)
moved to (0,4)
moved to (0,4)
moved to (-1,4)
moved to (-2,4)
moved to (-3,4)
moved to (-4,4)
moved to (-4,3)
moved to (-4,2)
moved to (-4,1)
moved to (-4,0)
moved to (-3,0)
moved to (-2,0)
moved to (-1,0)
moved to (0,0)
moved to (0,1)
moved to (0,2)
moved to (0,3)
moved to (0,4)
moved to (-1,4)
moved to (-2,4)
moved to (-3,4)
moved to (-4,4)
%
0 コメント:
コメントを投稿