-
-
Notifications
You must be signed in to change notification settings - Fork 158
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
b51ce58
commit 76a70bf
Showing
26 changed files
with
451 additions
and
342 deletions.
There are no files selected for viewing
70 changes: 35 additions & 35 deletions
70
...rgest-series-product/.meta/Sources/LargestSeriesProduct/LargestSeriesProductExample.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,49 +1,49 @@ | ||
struct NumberSeries { | ||
enum NumberSeriesError: Error { | ||
case invalidCharacter | ||
case spanLongerThanInput | ||
case spanIsZeroOrNegative | ||
} | ||
|
||
enum NumberSeriesError: Error { | ||
case invalidCharacter | ||
case spanLongerThanStringLength | ||
case negativeSpan | ||
} | ||
struct NumberSeries { | ||
|
||
let numbers: [Int] | ||
let numbers: [Int] | ||
|
||
init(_ numberString: String) throws { | ||
self.numbers = try numberString.map { | ||
guard let intValue = Int(String($0)) else { | ||
throw NumberSeriesError.invalidCharacter | ||
} | ||
return intValue | ||
} | ||
init(_ numberString: String) throws { | ||
self.numbers = try numberString.map { | ||
guard let intValue = Int(String($0)) else { | ||
throw NumberSeriesError.invalidCharacter | ||
} | ||
return intValue | ||
} | ||
} | ||
|
||
func largestProduct(_ numberOfDigits: Int) throws -> Int { | ||
guard numberOfDigits >= 0 else { | ||
throw NumberSeriesError.negativeSpan | ||
} | ||
|
||
let endIndex = numbers.count - numberOfDigits | ||
guard endIndex >= 0 else { | ||
throw NumberSeriesError.spanLongerThanStringLength | ||
} | ||
func largestProduct(_ numberOfDigits: Int) throws -> Int { | ||
guard numberOfDigits >= 0 else { | ||
throw NumberSeriesError.spanIsZeroOrNegative | ||
} | ||
|
||
var result = 0 | ||
let endIndex = numbers.count - numberOfDigits | ||
guard endIndex >= 0 else { | ||
throw NumberSeriesError.spanLongerThanInput | ||
} | ||
|
||
for startIndex in 0 ... endIndex { | ||
let selectedNumbers = numbers[startIndex ..< startIndex + numberOfDigits] | ||
var result = 0 | ||
|
||
var total = 1 | ||
for startIndex in 0...endIndex { | ||
let selectedNumbers = numbers[startIndex..<startIndex + numberOfDigits] | ||
|
||
for selectedNumber in selectedNumbers { | ||
total *= selectedNumber | ||
} | ||
var total = 1 | ||
|
||
if total > result { | ||
result = total | ||
} | ||
} | ||
for selectedNumber in selectedNumbers { | ||
total *= selectedNumber | ||
} | ||
|
||
return result | ||
if total > result { | ||
result = total | ||
} | ||
} | ||
|
||
return result | ||
} | ||
|
||
} |
28 changes: 28 additions & 0 deletions
28
exercises/practice/largest-series-product/.meta/template.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
import XCTest | ||
@testable import {{exercise|camelCase}} | ||
class {{exercise|camelCase}}Tests: XCTestCase { | ||
let runAll = Bool(ProcessInfo.processInfo.environment["RUNALL", default: "false"]) ?? false | ||
|
||
{% for case in cases %} | ||
{% if forloop.first -%} | ||
func test{{case.description |camelCase }}() { | ||
{% else -%} | ||
func test{{case.description |camelCase }}() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
{% endif -%} | ||
{% if case.expected.error -%} | ||
XCTAssertThrowsError(try NumberSeries("{{case.input.digits}}").largestProduct({{case.input.span}})) { error in | ||
{% if case.expected.error == "span must be smaller than string length" -%} | ||
XCTAssertEqual(error as? NumberSeriesError, NumberSeriesError.spanLongerThanInput) | ||
{% elif case.expected.error == "digits input must only contain digits" -%} | ||
XCTAssertEqual(error as? NumberSeriesError, NumberSeriesError.invalidCharacter) | ||
{% else -%} | ||
XCTAssertEqual(error as? NumberSeriesError, NumberSeriesError.spanIsZeroOrNegative) | ||
{% endif -%} | ||
} | ||
{% else -%} | ||
XCTAssertEqual(try! NumberSeries("{{case.input.digits}}").largestProduct({{case.input.span}}), {{case.expected}}) | ||
{% endif -%} | ||
} | ||
{% endfor -%} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 3 additions & 1 deletion
4
...s/practice/largest-series-product/Sources/LargestSeriesProduct/LargestSeriesProduct.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,3 @@ | ||
//Solution goes in Sources | ||
class NumberSeries { | ||
// Write your code for the 'LargestSeriesProduct' exercise in this file. | ||
} |
130 changes: 69 additions & 61 deletions
130
...ce/largest-series-product/Tests/LargestSeriesProductTests/LargestSeriesProductTests.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,73 +1,81 @@ | ||
import XCTest | ||
|
||
@testable import LargestSeriesProduct | ||
|
||
class LargestSeriesProductTests: XCTestCase { | ||
|
||
func testCanFindTheLargestProductOf2WithNumbersInOrder() { | ||
XCTAssertEqual(72, try? NumberSeries("0123456789").largestProduct(2)) | ||
} | ||
|
||
func testCanFindTheLargestProductOf2() { | ||
XCTAssertEqual(48, try? NumberSeries("576802143").largestProduct(2)) | ||
} | ||
|
||
func testFindsTheLargestProductIfSpanEqualsLength() { | ||
XCTAssertEqual(18, try? NumberSeries("29").largestProduct(2)) | ||
} | ||
|
||
func testCanFindTheLargestProductOf3WithNumbersInOrder() { | ||
XCTAssertEqual(504, try? NumberSeries("0123456789").largestProduct(3)) | ||
} | ||
|
||
func testCanFindTheLargestProductOf3() { | ||
XCTAssertEqual(270, try? NumberSeries("1027839564").largestProduct(3)) | ||
} | ||
|
||
func testCanFindTheLargestProductOf5WithNumbersInOrder() { | ||
XCTAssertEqual(15120, try? NumberSeries("0123456789").largestProduct(5)) | ||
} | ||
|
||
func testCanGetTheLargestProductOfABigNumber() { | ||
XCTAssertEqual(23520, try? NumberSeries("73167176531330624919225119674426574742355349194934").largestProduct(6)) | ||
} | ||
|
||
func testCanGetTheLargestProductOfAnotherBigNumber() { | ||
XCTAssertEqual(28350, try? NumberSeries("52677741234314237566414902593461595376319419139427").largestProduct(6)) | ||
} | ||
|
||
func testCanGetTheLargestProductOfABigNumberProjectEuler() { | ||
XCTAssertEqual(23514624000, try? NumberSeries("7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450").largestProduct(13)) | ||
} | ||
|
||
func testReportsZeroIfTheOnlyDigitsAreZero() { | ||
XCTAssertEqual(0, try? NumberSeries("0000").largestProduct(2)) | ||
} | ||
|
||
func testReportsZeroIfAllSpansIncludeZero() { | ||
XCTAssertEqual(0, try? NumberSeries("99099").largestProduct(3)) | ||
} | ||
|
||
func testRejectsSpanLongerThanStringLength() { | ||
XCTAssertThrowsError(_ = try NumberSeries("123").largestProduct(4)) { error in | ||
XCTAssertEqual(error as? NumberSeries.NumberSeriesError, .spanLongerThanStringLength) | ||
} | ||
let runAll = Bool(ProcessInfo.processInfo.environment["RUNALL", default: "false"]) ?? false | ||
|
||
func testFindsTheLargestProductIfSpanEqualsLength() { | ||
XCTAssertEqual(try! NumberSeries("29").largestProduct(2), 18) | ||
} | ||
|
||
func testCanFindTheLargestProductOf2WithNumbersInOrder() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertEqual(try! NumberSeries("0123456789").largestProduct(2), 72) | ||
} | ||
|
||
func testCanFindTheLargestProductOf2() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertEqual(try! NumberSeries("576802143").largestProduct(2), 48) | ||
} | ||
|
||
func testCanFindTheLargestProductOf3WithNumbersInOrder() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertEqual(try! NumberSeries("0123456789").largestProduct(3), 504) | ||
} | ||
|
||
func testCanFindTheLargestProductOf3() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertEqual(try! NumberSeries("1027839564").largestProduct(3), 270) | ||
} | ||
|
||
func testCanFindTheLargestProductOf5WithNumbersInOrder() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertEqual(try! NumberSeries("0123456789").largestProduct(5), 15120) | ||
} | ||
|
||
func testCanGetTheLargestProductOfABigNumber() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertEqual( | ||
try! NumberSeries("73167176531330624919225119674426574742355349194934").largestProduct(6), | ||
23520) | ||
} | ||
|
||
func testReportsZeroIfTheOnlyDigitsAreZero() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertEqual(try! NumberSeries("0000").largestProduct(2), 0) | ||
} | ||
|
||
func testReportsZeroIfAllSpansIncludeZero() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertEqual(try! NumberSeries("99099").largestProduct(3), 0) | ||
} | ||
|
||
func testRejectsSpanLongerThanStringLength() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertThrowsError(try NumberSeries("123").largestProduct(4)) { error in | ||
XCTAssertEqual(error as? NumberSeriesError, NumberSeriesError.spanLongerThanInput) | ||
} | ||
} | ||
|
||
func testRejectsEmptyStringAndNonzeroSpan() { | ||
XCTAssertThrowsError(_ = try NumberSeries("").largestProduct(1)) { error in | ||
XCTAssertEqual(error as? NumberSeries.NumberSeriesError, .spanLongerThanStringLength) | ||
} | ||
func testRejectsEmptyStringAndNonzeroSpan() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertThrowsError(try NumberSeries("").largestProduct(1)) { error in | ||
XCTAssertEqual(error as? NumberSeriesError, NumberSeriesError.spanLongerThanInput) | ||
} | ||
} | ||
|
||
func testRejectsInvalidCharacterInDigits() { | ||
XCTAssertThrowsError(_ = try NumberSeries("1234a5").largestProduct(2)) { error in | ||
XCTAssertEqual(error as? NumberSeries.NumberSeriesError, .invalidCharacter) | ||
} | ||
func testRejectsInvalidCharacterInDigits() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertThrowsError(try NumberSeries("1234a5").largestProduct(2)) { error in | ||
XCTAssertEqual(error as? NumberSeriesError, NumberSeriesError.invalidCharacter) | ||
} | ||
} | ||
|
||
func testRejectsNegativeSpan() { | ||
XCTAssertThrowsError(_ = try NumberSeries("12345").largestProduct(-1)) { error in | ||
XCTAssertEqual(error as? NumberSeries.NumberSeriesError, .negativeSpan) | ||
} | ||
func testRejectsNegativeSpan() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
XCTAssertThrowsError(try NumberSeries("12345").largestProduct(-1)) { error in | ||
XCTAssertEqual(error as? NumberSeriesError, NumberSeriesError.spanIsZeroOrNegative) | ||
} | ||
} | ||
} |
49 changes: 13 additions & 36 deletions
49
exercises/practice/nth-prime/.meta/Sources/NthPrime/NthPrimeExample.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,39 +1,16 @@ | ||
#if os(Linux) | ||
import Glibc | ||
#elseif os(OSX) | ||
import Darwin | ||
#endif | ||
|
||
struct Prime { | ||
static func nth(_ nth: Int) -> Int? { | ||
if nth < 1 { | ||
return nil | ||
} | ||
|
||
var primes = 0 | ||
var i = 1 | ||
|
||
while primes < nth { | ||
i += 1 | ||
if isPrime(i) { | ||
primes += 1 | ||
} | ||
} | ||
|
||
return i | ||
} | ||
|
||
private static func isPrime(_ number: Int) -> Bool { | ||
if number == 1 { | ||
return false | ||
} else if number == 2 { | ||
return true | ||
} | ||
|
||
for i in 2...Int(ceil(sqrt(Double(number)))) where number % i == 0 { | ||
return false | ||
} | ||
enum PrimeError: Error { | ||
case noZerothPrime | ||
} | ||
|
||
return true | ||
func nthPrime(_ n: Int) throws -> Int { | ||
guard n > 0 else { throw PrimeError.noZerothPrime } | ||
var primes = [2] | ||
var candidate = 3 | ||
while primes.count < n { | ||
if primes.allSatisfy({ candidate % $0 != 0 }) { | ||
primes.append(candidate) | ||
} | ||
candidate += 2 | ||
} | ||
return primes.last! | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
import XCTest | ||
@testable import {{exercise|camelCase}} | ||
class {{exercise|camelCase}}Tests: XCTestCase { | ||
let runAll = Bool(ProcessInfo.processInfo.environment["RUNALL", default: "false"]) ?? false | ||
|
||
{% for case in cases %} | ||
{% if forloop.first -%} | ||
func test{{case.description |camelCase }}() { | ||
{% else -%} | ||
func test{{case.description |camelCase }}() throws { | ||
try XCTSkipIf(true && !runAll) // change true to false to run this test | ||
{% endif -%} | ||
{% if case.expected.error -%} | ||
XCTAssertThrowsError(try nthPrime({{case.input.number}})) { error in | ||
XCTAssertEqual(error as? PrimeError, PrimeError.noZerothPrime) | ||
} | ||
{% else -%} | ||
XCTAssertEqual(try! nthPrime({{case.input.number}}), {{case.expected}}) | ||
{% endif -%} | ||
} | ||
{% endfor -%} | ||
} |
Oops, something went wrong.