From e3b7162a22f331a7e8b44982764d9b3977918294 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Tue, 30 Aug 2016 13:45:03 +0200 Subject: Solve octal --- go/octal/README.md | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ go/octal/octal.go | 15 +++++++++++++ go/octal/octal_test.go | 50 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 go/octal/README.md create mode 100644 go/octal/octal.go create mode 100644 go/octal/octal_test.go diff --git a/go/octal/README.md b/go/octal/README.md new file mode 100644 index 0000000..330b5c9 --- /dev/null +++ b/go/octal/README.md @@ -0,0 +1,59 @@ +# Octal + +Write a program that will convert a octal number, represented as a string (e.g. '1735263'), to its decimal equivalent using first principles (i.e. no, you may not use built-in or external libraries to accomplish the conversion). + +Implement octal to decimal conversion. Given an octal input +string, your program should produce a decimal output. + +## Note +- Implement the conversion yourself. + Do not use something else to perform the conversion for you. +- Treat invalid input as octal 0. + +## About Octal (Base-8) +Decimal is a base-10 system. + +A number 233 in base 10 notation can be understood +as a linear combination of powers of 10: + +- The rightmost digit gets multiplied by 10^0 = 1 +- The next number gets multiplied by 10^1 = 10 +- ... +- The *n*th number gets multiplied by 10^*(n-1)*. +- All these values are summed. + +So: +``` + 233 # decimal + = 2*10^2 + 3*10^1 + 3*10^0 + = 2*100 + 3*10 + 3*1 +``` + +Octal is similar, but uses powers of 8 rather than powers of 10. + +So: +``` + 233 # octal + = 2*8^2 + 3*8^1 + 3*8^0 + = 2*64 + 3*8 + 3*1 + = 128 + 24 + 3 + = 155 +``` + +To run the tests simply run the command `go test` in the exercise directory. + +If the test suite contains benchmarks, you can run these with the `-bench` +flag: + + go test -bench . + +For more detailed info about the Go track see the [help +page](http://exercism.io/languages/go). + +## Source + +All of Computer Science [http://www.wolframalpha.com/input/?i=base+8](http://www.wolframalpha.com/input/?i=base+8) + +## Submitting Incomplete Problems +It's possible to submit an incomplete solution so you can see how others have completed the exercise. + diff --git a/go/octal/octal.go b/go/octal/octal.go new file mode 100644 index 0000000..89b1cfc --- /dev/null +++ b/go/octal/octal.go @@ -0,0 +1,15 @@ +package octal + +import "errors" + +func ParseOctal(s string) (int64, error) { + var ret int64 + for _, v := range s { + if v < '0' || v > '7' { + return 0, errors.New("invalid chars") + } + ret *= 8 + ret += int64(v - '0') + } + return ret, nil +} diff --git a/go/octal/octal_test.go b/go/octal/octal_test.go new file mode 100644 index 0000000..35247ee --- /dev/null +++ b/go/octal/octal_test.go @@ -0,0 +1,50 @@ +package octal + +import ( + "testing" +) + +var testCases = []struct { + input string + expectedNum int64 + expectErr bool +}{ + {"1", 1, false}, + {"10", 8, false}, + {"1234567", 342391, false}, + {"carrot", 0, true}, + {"35682", 0, true}, +} + +func TestParseOctal(t *testing.T) { + for _, test := range testCases { + actualNum, actualErr := ParseOctal(test.input) + if actualNum != test.expectedNum { + t.Fatalf("ParseOctal(%s): expected[%d], actual [%d]", + test.input, test.expectedNum, actualNum) + } + + // if we expect an error and there isn't one + if test.expectErr && actualErr == nil { + t.Errorf("ParseOctal(%s): expected an error, but error is nil", test.input) + } + // if we don't expect an error and there is one + if !test.expectErr && actualErr != nil { + t.Errorf("ParseOctal(%s): expected no error, but error is: %s", test.input, actualErr) + } + } +} + +func BenchmarkParseOctal(b *testing.B) { + b.StopTimer() + + for _, test := range testCases { + b.StartTimer() + + for i := 0; i < b.N; i++ { + ParseOctal(test.input) + } + + b.StopTimer() + } +} -- cgit v1.2.3