Started the kotlin track
This commit is contained in:
148
go/robot-simulator/robot.go
Normal file
148
go/robot-simulator/robot.go
Normal file
@@ -0,0 +1,148 @@
|
||||
package robot
|
||||
|
||||
import "fmt"
|
||||
|
||||
const testVersion = 3
|
||||
|
||||
// Stuff added for step 1
|
||||
const (
|
||||
N = iota
|
||||
E
|
||||
S
|
||||
W
|
||||
ErrDir
|
||||
)
|
||||
|
||||
func Advance() {
|
||||
switch Step1Robot.Dir {
|
||||
case N:
|
||||
Step1Robot.Y++
|
||||
case E:
|
||||
Step1Robot.X++
|
||||
case S:
|
||||
Step1Robot.Y--
|
||||
case W:
|
||||
Step1Robot.X--
|
||||
}
|
||||
}
|
||||
|
||||
func Left() {
|
||||
switch Step1Robot.Dir {
|
||||
case N:
|
||||
Step1Robot.Dir = W
|
||||
case E:
|
||||
Step1Robot.Dir = N
|
||||
case S:
|
||||
Step1Robot.Dir = E
|
||||
case W:
|
||||
Step1Robot.Dir = S
|
||||
}
|
||||
}
|
||||
|
||||
func Right() {
|
||||
switch Step1Robot.Dir {
|
||||
case N:
|
||||
Step1Robot.Dir = E
|
||||
case E:
|
||||
Step1Robot.Dir = S
|
||||
case S:
|
||||
Step1Robot.Dir = W
|
||||
case W:
|
||||
Step1Robot.Dir = N
|
||||
}
|
||||
}
|
||||
|
||||
func (d Dir) String() string {
|
||||
switch d {
|
||||
case N:
|
||||
return "N"
|
||||
case E:
|
||||
return "E"
|
||||
case S:
|
||||
return "S"
|
||||
default:
|
||||
return "W"
|
||||
}
|
||||
}
|
||||
|
||||
// Stuff added for step 2
|
||||
type Action byte
|
||||
|
||||
func StartRobot(cmd chan Command, act chan Action) {
|
||||
fmt.Println("Starting Robot")
|
||||
for {
|
||||
fmt.Println("Waiting for command")
|
||||
j, more := <-cmd
|
||||
fmt.Println("Received a Command:", j)
|
||||
if more {
|
||||
// Received a command, try to act in the room
|
||||
act <- Action(j)
|
||||
}
|
||||
}
|
||||
fmt.Println("Robot Done")
|
||||
}
|
||||
|
||||
func Room(extent Rect, robot Step2Robot, act chan Action, rep chan Step2Robot) {
|
||||
fmt.Println("Starting Room")
|
||||
for {
|
||||
j, more := <-act
|
||||
if more {
|
||||
// Received an action, try to perform it
|
||||
if j == 'R' { // Turn Right
|
||||
switch robot.Dir {
|
||||
case N:
|
||||
robot.Dir = E
|
||||
case E:
|
||||
robot.Dir = S
|
||||
case S:
|
||||
robot.Dir = W
|
||||
case W:
|
||||
robot.Dir = N
|
||||
}
|
||||
} else if j == 'L' { // Turn Left
|
||||
switch robot.Dir {
|
||||
case N:
|
||||
robot.Dir = W
|
||||
case E:
|
||||
robot.Dir = N
|
||||
case S:
|
||||
robot.Dir = E
|
||||
case W:
|
||||
robot.Dir = S
|
||||
}
|
||||
} else if j == 'A' { // Advance
|
||||
switch robot.Dir {
|
||||
case N:
|
||||
if robot.Pos.Northing < extent.Max.Northing {
|
||||
robot.Pos.Northing++
|
||||
} else {
|
||||
fmt.Println("Hit North Wall")
|
||||
}
|
||||
case E:
|
||||
if robot.Pos.Easting < extent.Max.Easting {
|
||||
robot.Pos.Easting++
|
||||
} else {
|
||||
fmt.Println("Hit East Wall")
|
||||
}
|
||||
case S:
|
||||
if robot.Pos.Northing > extent.Min.Northing {
|
||||
robot.Pos.Northing--
|
||||
} else {
|
||||
fmt.Println("Hit South Wall")
|
||||
}
|
||||
case W:
|
||||
if robot.Pos.Easting > extent.Min.Easting {
|
||||
robot.Pos.Easting--
|
||||
} else {
|
||||
fmt.Println("Hit West Wall")
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Done, report back
|
||||
rep <- robot
|
||||
}
|
||||
}
|
||||
close(rep)
|
||||
fmt.Println("Room Done")
|
||||
}
|
@@ -2,7 +2,10 @@
|
||||
|
||||
package robot
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// For step 1 you implement robot movements, but it's not much of a simulation.
|
||||
// For example where in the source code is "the robot"? Where is "the grid"?
|
||||
@@ -72,7 +75,9 @@ func TestStep2(t *testing.T) {
|
||||
rep := make(chan Step2Robot)
|
||||
go StartRobot(cmd, act)
|
||||
go Room(Rect{Pos{1, 1}, Pos{2, 2}}, test2[0].Step2Robot, act, rep)
|
||||
fmt.Println("Starting Tests")
|
||||
for j := 1; j < i; j++ {
|
||||
fmt.Println("Channeling: ", test2[j])
|
||||
cmd <- test2[j].Command
|
||||
}
|
||||
close(cmd)
|
||||
|
54
go/space-age/README.md
Normal file
54
go/space-age/README.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Space Age
|
||||
|
||||
Given an age in seconds, calculate how old someone would be on:
|
||||
|
||||
- Earth: orbital period 365.25 Earth days, or 31557600 seconds
|
||||
- Mercury: orbital period 0.2408467 Earth years
|
||||
- Venus: orbital period 0.61519726 Earth years
|
||||
- Mars: orbital period 1.8808158 Earth years
|
||||
- Jupiter: orbital period 11.862615 Earth years
|
||||
- Saturn: orbital period 29.447498 Earth years
|
||||
- Uranus: orbital period 84.016846 Earth years
|
||||
- Neptune: orbital period 164.79132 Earth years
|
||||
|
||||
So if you were told someone were 1,000,000,000 seconds old, you should
|
||||
be able to say that they're 31.69 Earth-years old.
|
||||
|
||||
If you're wondering why Pluto didn't make the cut, go watch [this
|
||||
youtube video](http://www.youtube.com/watch?v=Z_2gbGXzFbs).
|
||||
|
||||
## No Stub
|
||||
|
||||
This may be the first Go track exercise you encounter without a stub: a
|
||||
pre-existing `space_age.go` file for your solution. You may not see stubs in
|
||||
the future and should begin to get comfortable with creating your own Go files
|
||||
for your solutions.
|
||||
|
||||
One way to figure out what the function signature(s) you would need is to look
|
||||
at the corresponding \*\_test.go file. It will show you what the package level
|
||||
functions(s) should be that the test will use to verify the solution.
|
||||
|
||||
|
||||
## Running the tests
|
||||
|
||||
To run the tests run the command `go test` from within the exercise directory.
|
||||
|
||||
If the test suite contains benchmarks, you can run these with the `-bench`
|
||||
flag:
|
||||
|
||||
go test -bench .
|
||||
|
||||
Keep in mind that each reviewer will run benchmarks on a different machine, with
|
||||
different specs, so the results from these benchmark tests may vary.
|
||||
|
||||
## Further information
|
||||
|
||||
For more detailed information about the Go track, including how to get help if
|
||||
you're having trouble, please visit the exercism.io [Go language page](http://exercism.io/languages/go/about).
|
||||
|
||||
## Source
|
||||
|
||||
Partially inspired by Chapter 1 in Chris Pine's online Learn to Program tutorial. [http://pine.fm/LearnToProgram/?Chapter=01](http://pine.fm/LearnToProgram/?Chapter=01)
|
||||
|
||||
## Submitting Incomplete Solutions
|
||||
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
61
go/space-age/cases_test.go
Normal file
61
go/space-age/cases_test.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package space
|
||||
|
||||
// Source: exercism/problem-specifications
|
||||
// Commit: 8d4df79 space-age: Apply new "input" policy
|
||||
// Problem Specifications Version: 1.1.0
|
||||
|
||||
var testCases = []struct {
|
||||
description string
|
||||
planet Planet
|
||||
seconds float64
|
||||
expected float64
|
||||
}{
|
||||
{
|
||||
description: "age on Earth",
|
||||
planet: "Earth",
|
||||
seconds: 1000000000,
|
||||
expected: 31.69,
|
||||
},
|
||||
{
|
||||
description: "age on Mercury",
|
||||
planet: "Mercury",
|
||||
seconds: 2134835688,
|
||||
expected: 280.88,
|
||||
},
|
||||
{
|
||||
description: "age on Venus",
|
||||
planet: "Venus",
|
||||
seconds: 189839836,
|
||||
expected: 9.78,
|
||||
},
|
||||
{
|
||||
description: "age on Mars",
|
||||
planet: "Mars",
|
||||
seconds: 2329871239,
|
||||
expected: 39.25,
|
||||
},
|
||||
{
|
||||
description: "age on Jupiter",
|
||||
planet: "Jupiter",
|
||||
seconds: 901876382,
|
||||
expected: 2.41,
|
||||
},
|
||||
{
|
||||
description: "age on Saturn",
|
||||
planet: "Saturn",
|
||||
seconds: 3000000000,
|
||||
expected: 3.23,
|
||||
},
|
||||
{
|
||||
description: "age on Uranus",
|
||||
planet: "Uranus",
|
||||
seconds: 3210123456,
|
||||
expected: 1.21,
|
||||
},
|
||||
{
|
||||
description: "age on Neptune",
|
||||
planet: "Neptune",
|
||||
seconds: 8210123456,
|
||||
expected: 1.58,
|
||||
},
|
||||
}
|
25
go/space-age/space_age_test.go
Normal file
25
go/space-age/space_age_test.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package space
|
||||
|
||||
import (
|
||||
"math"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestAge(t *testing.T) {
|
||||
const precision = 0.01
|
||||
for _, tc := range testCases {
|
||||
actual := Age(tc.seconds, tc.planet)
|
||||
if math.IsNaN(actual) || math.Abs(actual-tc.expected) > precision {
|
||||
t.Fatalf("FAIL: %s\nExpected: %#v\nActual: %#v", tc.description, tc.expected, actual)
|
||||
}
|
||||
t.Logf("PASS: %s", tc.description)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkAge(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
for _, tc := range testCases {
|
||||
Age(tc.seconds, tc.planet)
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user