Initial upload
This commit is contained in:
32
go/tournament/.exercism/config.json
Normal file
32
go/tournament/.exercism/config.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"blurb": "Tally the results of a small football competition.",
|
||||
"authors": [
|
||||
"pminten"
|
||||
],
|
||||
"contributors": [
|
||||
"alebaffa",
|
||||
"bitfield",
|
||||
"ekingery",
|
||||
"ferhatelmas",
|
||||
"hilary",
|
||||
"kytrinyx",
|
||||
"leenipper",
|
||||
"manavo",
|
||||
"petertseng",
|
||||
"robphoenix",
|
||||
"sebito91",
|
||||
"soniakeys",
|
||||
"tleen"
|
||||
],
|
||||
"files": {
|
||||
"solution": [
|
||||
"tournament.go"
|
||||
],
|
||||
"test": [
|
||||
"tournament_test.go"
|
||||
],
|
||||
"example": [
|
||||
".meta/example.go"
|
||||
]
|
||||
}
|
||||
}
|
1
go/tournament/.exercism/metadata.json
Normal file
1
go/tournament/.exercism/metadata.json
Normal file
@@ -0,0 +1 @@
|
||||
{"track":"go","exercise":"tournament","id":"399ebb8ad6844f9f986ef2e70737b8fa","url":"https://exercism.org/tracks/go/exercises/tournament","handle":"halfdan","is_requester":true,"auto_approve":false}
|
40
go/tournament/HELP.md
Normal file
40
go/tournament/HELP.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# Help
|
||||
|
||||
## 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` and `--benchmem`
|
||||
flags:
|
||||
|
||||
go test -v --bench . --benchmem
|
||||
|
||||
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.
|
||||
|
||||
## Submitting your solution
|
||||
|
||||
You can submit your solution using the `exercism submit tournament.go` command.
|
||||
This command will upload your solution to the Exercism website and print the solution page's URL.
|
||||
|
||||
It's possible to submit an incomplete solution which allows you to:
|
||||
|
||||
- See how others have completed the exercise
|
||||
- Request help from a mentor
|
||||
|
||||
## Need to get help?
|
||||
|
||||
If you'd like help solving the exercise, check the following pages:
|
||||
|
||||
- The [Go track's documentation](https://exercism.org/docs/tracks/go)
|
||||
- [Exercism's support channel on gitter](https://gitter.im/exercism/support)
|
||||
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
|
||||
|
||||
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
|
||||
|
||||
To get help if you're having trouble, you can use one of the following resources:
|
||||
|
||||
- [How to Write Go Code](https://golang.org/doc/code.html)
|
||||
- [Effective Go](https://golang.org/doc/effective_go.html)
|
||||
- [Go Resources](http://golang.org/help)
|
||||
- [StackOverflow](http://stackoverflow.com/questions/tagged/go)
|
90
go/tournament/README.md
Normal file
90
go/tournament/README.md
Normal file
@@ -0,0 +1,90 @@
|
||||
# Tournament
|
||||
|
||||
Welcome to Tournament on Exercism's Go Track.
|
||||
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||
|
||||
## Instructions
|
||||
|
||||
Tally the results of a small football competition.
|
||||
|
||||
Based on an input file containing which team played against which and what the
|
||||
outcome was, create a file with a table like this:
|
||||
|
||||
```text
|
||||
Team | MP | W | D | L | P
|
||||
Devastating Donkeys | 3 | 2 | 1 | 0 | 7
|
||||
Allegoric Alaskans | 3 | 2 | 0 | 1 | 6
|
||||
Blithering Badgers | 3 | 1 | 0 | 2 | 3
|
||||
Courageous Californians | 3 | 0 | 1 | 2 | 1
|
||||
```
|
||||
|
||||
What do those abbreviations mean?
|
||||
|
||||
- MP: Matches Played
|
||||
- W: Matches Won
|
||||
- D: Matches Drawn (Tied)
|
||||
- L: Matches Lost
|
||||
- P: Points
|
||||
|
||||
A win earns a team 3 points. A draw earns 1. A loss earns 0.
|
||||
|
||||
The outcome should be ordered by points, descending. In case of a tie, teams are ordered alphabetically.
|
||||
|
||||
## Input
|
||||
|
||||
Your tallying program will receive input that looks like:
|
||||
|
||||
```text
|
||||
Allegoric Alaskans;Blithering Badgers;win
|
||||
Devastating Donkeys;Courageous Californians;draw
|
||||
Devastating Donkeys;Allegoric Alaskans;win
|
||||
Courageous Californians;Blithering Badgers;loss
|
||||
Blithering Badgers;Devastating Donkeys;loss
|
||||
Allegoric Alaskans;Courageous Californians;win
|
||||
```
|
||||
|
||||
The result of the match refers to the first team listed. So this line:
|
||||
|
||||
```text
|
||||
Allegoric Alaskans;Blithering Badgers;win
|
||||
```
|
||||
|
||||
means that the Allegoric Alaskans beat the Blithering Badgers.
|
||||
|
||||
This line:
|
||||
|
||||
```text
|
||||
Courageous Californians;Blithering Badgers;loss
|
||||
```
|
||||
|
||||
means that the Blithering Badgers beat the Courageous Californians.
|
||||
|
||||
And this line:
|
||||
|
||||
```text
|
||||
Devastating Donkeys;Courageous Californians;draw
|
||||
```
|
||||
|
||||
means that the Devastating Donkeys and Courageous Californians tied.
|
||||
|
||||
## Source
|
||||
|
||||
### Created by
|
||||
|
||||
- @pminten
|
||||
|
||||
### Contributed to by
|
||||
|
||||
- @alebaffa
|
||||
- @bitfield
|
||||
- @ekingery
|
||||
- @ferhatelmas
|
||||
- @hilary
|
||||
- @kytrinyx
|
||||
- @leenipper
|
||||
- @manavo
|
||||
- @petertseng
|
||||
- @robphoenix
|
||||
- @sebito91
|
||||
- @soniakeys
|
||||
- @tleen
|
5
go/tournament/go.mod
Normal file
5
go/tournament/go.mod
Normal file
@@ -0,0 +1,5 @@
|
||||
module tournament
|
||||
|
||||
go 1.13
|
||||
|
||||
require golang.org/x/tools v0.1.7 // indirect
|
33
go/tournament/go.sum
Normal file
33
go/tournament/go.sum
Normal file
@@ -0,0 +1,33 @@
|
||||
github.com/yuin/goldmark v1.4.0 h1:OtISOGfH6sOWa1/qXqqAiOIAO6Z5J3AEAE18WAq6BiQ=
|
||||
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI=
|
||||
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA=
|
||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ=
|
||||
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
23
go/tournament/tournament.go
Normal file
23
go/tournament/tournament.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package tournament
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
"io"
|
||||
)
|
||||
func Tally(in io.Reader, out io.Writer) error {
|
||||
buf := new(strings.Builder)
|
||||
_, err := io.Copy(buf, in)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s := buf.String()
|
||||
lines := strings.Split(s, "\n")
|
||||
|
||||
for _, line := range lines {
|
||||
if strings.HasPrefix(line, "#") || len(line) == 0 {
|
||||
continue
|
||||
}
|
||||
}
|
||||
return errors.New("foo")
|
||||
}
|
152
go/tournament/tournament_test.go
Normal file
152
go/tournament/tournament_test.go
Normal file
@@ -0,0 +1,152 @@
|
||||
package tournament
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// Define a function Tally(io.Reader, io.Writer) error.
|
||||
//
|
||||
// Note that unlike other tracks the Go version of the tally function
|
||||
// should not ignore errors. It's not idiomatic Go to ignore errors.
|
||||
|
||||
var _ func(io.Reader, io.Writer) error = Tally
|
||||
|
||||
// These test what testers call the happy path, where there's no error.
|
||||
var happyTestCases = []struct {
|
||||
description string
|
||||
input string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
description: "good",
|
||||
input: `
|
||||
Allegoric Alaskians;Blithering Badgers;win
|
||||
Devastating Donkeys;Courageous Californians;draw
|
||||
Devastating Donkeys;Allegoric Alaskians;win
|
||||
Courageous Californians;Blithering Badgers;loss
|
||||
Blithering Badgers;Devastating Donkeys;loss
|
||||
Allegoric Alaskians;Courageous Californians;win
|
||||
`,
|
||||
expected: `
|
||||
Team | MP | W | D | L | P
|
||||
Devastating Donkeys | 3 | 2 | 1 | 0 | 7
|
||||
Allegoric Alaskians | 3 | 2 | 0 | 1 | 6
|
||||
Blithering Badgers | 3 | 1 | 0 | 2 | 3
|
||||
Courageous Californians | 3 | 0 | 1 | 2 | 1
|
||||
`[1:], // [1:] = strip initial readability newline
|
||||
},
|
||||
{
|
||||
description: "ignore comments and newlines",
|
||||
input: `
|
||||
|
||||
Allegoric Alaskians;Blithering Badgers;win
|
||||
Devastating Donkeys;Allegoric Alaskians;win
|
||||
# Catastrophic Loss of the Californians
|
||||
Courageous Californians;Blithering Badgers;loss
|
||||
|
||||
Blithering Badgers;Devastating Donkeys;loss
|
||||
Allegoric Alaskians;Courageous Californians;win
|
||||
Devastating Donkeys;Courageous Californians;draw
|
||||
|
||||
|
||||
`,
|
||||
expected: `
|
||||
Team | MP | W | D | L | P
|
||||
Devastating Donkeys | 3 | 2 | 1 | 0 | 7
|
||||
Allegoric Alaskians | 3 | 2 | 0 | 1 | 6
|
||||
Blithering Badgers | 3 | 1 | 0 | 2 | 3
|
||||
Courageous Californians | 3 | 0 | 1 | 2 | 1
|
||||
`[1:],
|
||||
},
|
||||
{
|
||||
// A complete competition has all teams play eachother once or twice.
|
||||
description: "incomplete competition",
|
||||
input: `
|
||||
Allegoric Alaskians;Blithering Badgers;win
|
||||
Devastating Donkeys;Allegoric Alaskians;win
|
||||
Courageous Californians;Blithering Badgers;loss
|
||||
Allegoric Alaskians;Courageous Californians;win
|
||||
`,
|
||||
expected: `
|
||||
Team | MP | W | D | L | P
|
||||
Allegoric Alaskians | 3 | 2 | 0 | 1 | 6
|
||||
Blithering Badgers | 2 | 1 | 0 | 1 | 3
|
||||
Devastating Donkeys | 1 | 1 | 0 | 0 | 3
|
||||
Courageous Californians | 2 | 0 | 0 | 2 | 0
|
||||
`[1:],
|
||||
},
|
||||
{
|
||||
description: "tie for first and last place",
|
||||
input: `
|
||||
Courageous Californians;Devastating Donkeys;win
|
||||
Allegoric Alaskians;Blithering Badgers;win
|
||||
Devastating Donkeys;Allegoric Alaskians;loss
|
||||
Courageous Californians;Blithering Badgers;win
|
||||
Blithering Badgers;Devastating Donkeys;draw
|
||||
Allegoric Alaskians;Courageous Californians;draw
|
||||
`,
|
||||
expected: `
|
||||
Team | MP | W | D | L | P
|
||||
Allegoric Alaskians | 3 | 2 | 1 | 0 | 7
|
||||
Courageous Californians | 3 | 2 | 1 | 0 | 7
|
||||
Blithering Badgers | 3 | 0 | 1 | 2 | 1
|
||||
Devastating Donkeys | 3 | 0 | 1 | 2 | 1
|
||||
`[1:],
|
||||
},
|
||||
}
|
||||
|
||||
var errorTestCases = []string{
|
||||
"Bla;Bla;Bla",
|
||||
"Devastating Donkeys_Courageous Californians;draw",
|
||||
"Devastating Donkeys@Courageous Californians;draw",
|
||||
"Devastating Donkeys;Allegoric Alaskians;dra",
|
||||
}
|
||||
|
||||
func TestTallyHappy(t *testing.T) {
|
||||
for _, tt := range happyTestCases {
|
||||
reader := strings.NewReader(tt.input)
|
||||
var buffer bytes.Buffer
|
||||
err := Tally(reader, &buffer)
|
||||
actual := buffer.String()
|
||||
// We don't expect errors for any of the test cases
|
||||
if err != nil {
|
||||
t.Fatalf("Tally for input named %q returned error %q. Error not expected.",
|
||||
tt.description, err)
|
||||
}
|
||||
if actual != tt.expected {
|
||||
t.Fatalf("Tally for input named %q was expected to return...\n%s\n...but returned...\n%s",
|
||||
tt.description, tt.expected, actual)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTallyError(t *testing.T) {
|
||||
for _, s := range errorTestCases {
|
||||
reader := strings.NewReader(s)
|
||||
var buffer bytes.Buffer
|
||||
err := Tally(reader, &buffer)
|
||||
if err == nil {
|
||||
t.Fatalf("Tally for input %q should have failed but didn't.", s)
|
||||
}
|
||||
var _ error = err
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkTally(b *testing.B) {
|
||||
if testing.Short() {
|
||||
b.Skip("skipping benchmark in short mode.")
|
||||
}
|
||||
for i := 0; i < b.N; i++ {
|
||||
for _, tt := range happyTestCases {
|
||||
var buffer bytes.Buffer
|
||||
Tally(strings.NewReader(tt.input), &buffer)
|
||||
}
|
||||
for _, s := range errorTestCases {
|
||||
var buffer bytes.Buffer
|
||||
Tally(strings.NewReader(s), &buffer)
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user