2020年5月16日土曜日

開発環境

入門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 コメント:

コメントを投稿