Syncing
This commit is contained in:
		| @@ -1 +0,0 @@ | |||||||
| prime-factors |  | ||||||
							
								
								
									
										27
									
								
								go/nth-prime/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								go/nth-prime/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | # Nth Prime | ||||||
|  |  | ||||||
|  | Write a program that can tell you what the nth prime is. | ||||||
|  |  | ||||||
|  | By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that | ||||||
|  | the 6th prime is 13. | ||||||
|  |  | ||||||
|  | If your language provides methods in the standard library to deal with prime | ||||||
|  | numbers, pretend they don't exist and implement them yourself. | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  |  | ||||||
|  | A variation on Problem 7 at Project Euler [http://projecteuler.net/problem=7](http://projecteuler.net/problem=7) | ||||||
|  |  | ||||||
|  | ## Submitting Incomplete Problems | ||||||
|  | It's possible to submit an incomplete solution so you can see how others have completed the exercise. | ||||||
|  |  | ||||||
							
								
								
									
										33
									
								
								go/nth-prime/nth_prime.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								go/nth-prime/nth_prime.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | package prime | ||||||
|  |  | ||||||
|  | var sieve []int | ||||||
|  |  | ||||||
|  | func Nth(n int) (int, bool) { | ||||||
|  | 	if len(sieve) == 0 { | ||||||
|  | 		sieve = append(sieve, 0) | ||||||
|  | 		sieve = append(sieve, 2) | ||||||
|  | 	} | ||||||
|  | 	if n == 0 { | ||||||
|  | 		return 0, false | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for i := sieve[len(sieve)-1]; n <= len(sieve); i++ { | ||||||
|  | 		// Check if i is a prime | ||||||
|  | 		isPrime := true | ||||||
|  | 		for j := 1; j < len(sieve); j++ { | ||||||
|  | 			if i%sieve[j] == 0 { | ||||||
|  | 				// Not a prime | ||||||
|  | 				isPrime = false | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if isPrime { | ||||||
|  | 			// Found a new prime | ||||||
|  | 			sieve = append(sieve, i) | ||||||
|  | 			if len(sieve) >= n { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return sieve[n], true | ||||||
|  | } | ||||||
							
								
								
									
										39
									
								
								go/nth-prime/nth_prime_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								go/nth-prime/nth_prime_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | |||||||
|  | package prime | ||||||
|  |  | ||||||
|  | import "testing" | ||||||
|  |  | ||||||
|  | var tests = []struct { | ||||||
|  | 	n  int | ||||||
|  | 	p  int | ||||||
|  | 	ok bool | ||||||
|  | }{ | ||||||
|  | 	{1, 2, true}, | ||||||
|  | 	{2, 3, true}, | ||||||
|  | 	{3, 5, true}, | ||||||
|  | 	{4, 7, true}, | ||||||
|  | 	{5, 11, true}, | ||||||
|  | 	{6, 13, true}, | ||||||
|  | 	{10001, 104743, true}, | ||||||
|  | 	{0, 0, false}, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestNth(t *testing.T) { | ||||||
|  | 	for _, test := range tests { | ||||||
|  | 		switch p, ok := Nth(test.n); { | ||||||
|  | 		case !ok: | ||||||
|  | 			if test.ok { | ||||||
|  | 				t.Fatalf("Nth(%d) returned !ok.  Expecting ok.", test.n) | ||||||
|  | 			} | ||||||
|  | 		case !test.ok: | ||||||
|  | 			t.Fatalf("Nth(%d) = %d, ok = %t.  Expecting !ok.", test.n, p, ok) | ||||||
|  | 		case p != test.p: | ||||||
|  | 			t.Fatalf("Nth(%d) = %d, want %d.", test.n, p, test.p) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func BenchmarkNth(b *testing.B) { | ||||||
|  | 	for i := 0; i < b.N; i++ { | ||||||
|  | 		Nth(10001) | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -1,16 +1,19 @@ | |||||||
| package prime | package prime | ||||||
|  |  | ||||||
| import "fmt" |  | ||||||
|  |  | ||||||
| const testVersion = 2 | const testVersion = 2 | ||||||
|  |  | ||||||
| var sieve []int64 | var sieve []int64 | ||||||
| var iter int | var iter int | ||||||
|  |  | ||||||
| func Factors(num int64) []int64 { | func Factors(num int64) []int64 { | ||||||
| 	fmt.Println("Factors Called on ", num) | 	if len(sieve) == 0 { | ||||||
| 	if num == 1 { | 		sieve = append(sieve, int64(2)) | ||||||
|  | 	} | ||||||
|  | 	switch num { | ||||||
|  | 	case 1: | ||||||
| 		return []int64{} | 		return []int64{} | ||||||
|  | 	case 2: | ||||||
|  | 		return []int64{2} | ||||||
| 	} | 	} | ||||||
| 	for i := range sieve { | 	for i := range sieve { | ||||||
| 		if sieve[i] == num { | 		if sieve[i] == num { | ||||||
| @@ -22,28 +25,26 @@ func Factors(num int64) []int64 { | |||||||
| 			return append([]int64{sieve[i]}, Factors(div)...) | 			return append([]int64{sieve[i]}, Factors(div)...) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// If we're here, we don't have the prime factors for this number | 	// If we're here, we don't have the prime factors for this number | ||||||
| 	// Add 1 to the highest prime that we have and find the next prime | 	topPrime := sieve[len(sieve)-1] | ||||||
| 	i := int64(2) | 	for i := sieve[0]; i*topPrime <= num; i++ { | ||||||
| 	if len(sieve) > 0 { | 		// Check if i is a prime | ||||||
| 		i = sieve[len(sieve)-1] |  | ||||||
| 	} |  | ||||||
| 	fmt.Println("  Looking for a new prime starting at ", i) |  | ||||||
| 	for ; i <= num; i++ { |  | ||||||
| 		isPrime := true | 		isPrime := true | ||||||
| 		for j := range sieve { | 		for j := range sieve { | ||||||
| 			if i%sieve[j] == 0 { | 			if i%sieve[j] == 0 { | ||||||
|  | 				// Not a prime | ||||||
| 				isPrime = false | 				isPrime = false | ||||||
| 			} |  | ||||||
| 			if !isPrime { |  | ||||||
| 				break | 				break | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if isPrime { | 		if isPrime { | ||||||
|  | 			// Found a new prime | ||||||
| 			sieve = append(sieve, i) | 			sieve = append(sieve, i) | ||||||
| 			// New prime in the sieve, try again | 			// New data, recurse | ||||||
| 			return Factors(num) | 			return Factors(num) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return []int64{} | 	// Is this a prime? | ||||||
|  | 	return []int64{num} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,7 +3,6 @@ package prime | |||||||
| // Return prime factors in increasing order | // Return prime factors in increasing order | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" |  | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
| @@ -32,13 +31,7 @@ func TestPrimeFactors(t *testing.T) { | |||||||
| 		t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion) | 		t.Fatalf("Found testVersion = %v, want %v", testVersion, targetTestVersion) | ||||||
| 	} | 	} | ||||||
| 	for _, test := range tests { | 	for _, test := range tests { | ||||||
| 		fmt.Print("Running Test: ") |  | ||||||
| 		fmt.Print(test) |  | ||||||
| 		fmt.Print(" :: ") |  | ||||||
| 		actual := Factors(test.input) | 		actual := Factors(test.input) | ||||||
| 		fmt.Print(actual) |  | ||||||
| 		fmt.Print("  Sieve: ") |  | ||||||
| 		fmt.Println(sieve) |  | ||||||
| 		if !reflect.DeepEqual(actual, test.expected) { | 		if !reflect.DeepEqual(actual, test.expected) { | ||||||
| 			t.Errorf("prime.Factors(%d) = %v; expected %v", | 			t.Errorf("prime.Factors(%d) = %v; expected %v", | ||||||
| 				test.input, actual, test.expected) | 				test.input, actual, test.expected) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user