Skip to content

Commit

Permalink
update-exercoses-batch-7
Browse files Browse the repository at this point in the history
  • Loading branch information
meatball133 committed Aug 2, 2023
1 parent b51ce58 commit 76a70bf
Show file tree
Hide file tree
Showing 26 changed files with 451 additions and 342 deletions.
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 exercises/practice/largest-series-product/.meta/template.swift
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 -%}
}
5 changes: 5 additions & 0 deletions exercises/practice/largest-series-product/.meta/tests.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,8 @@ description = "rejects invalid character in digits"

[5fe3c0e5-a945-49f2-b584-f0814b4dd1ef]
description = "rejects negative span"
include = false

[c859f34a-9bfe-4897-9c2f-6d7f8598e7f0]
description = "rejects negative span"
reimplements = "5fe3c0e5-a945-49f2-b584-f0814b4dd1ef"
30 changes: 15 additions & 15 deletions exercises/practice/largest-series-product/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@
import PackageDescription

let package = Package(
name: "LargestSeriesProduct",
products: [
.library(
name: "LargestSeriesProduct",
targets: ["LargestSeriesProduct"]),
],
dependencies: [],
targets: [
.target(
name: "LargestSeriesProduct",
dependencies: []),
.testTarget(
name: "LargestSeriesProductTests",
dependencies: ["LargestSeriesProduct"]),
]
name: "LargestSeriesProduct",
products: [
.library(
name: "LargestSeriesProduct",
targets: ["LargestSeriesProduct"])
],
dependencies: [],
targets: [
.target(
name: "LargestSeriesProduct",
dependencies: []),
.testTarget(
name: "LargestSeriesProductTests",
dependencies: ["LargestSeriesProduct"]),
]
)
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.
}
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)
}
}
}
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!
}
3 changes: 2 additions & 1 deletion exercises/practice/nth-prime/.meta/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
"lyuha",
"masters3d",
"samkrishna",
"ThomasHaz"
"ThomasHaz",
"meatball133"
],
"files": {
"solution": [
Expand Down
22 changes: 22 additions & 0 deletions exercises/practice/nth-prime/.meta/template.swift
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 -%}
}
Loading

0 comments on commit 76a70bf

Please sign in to comment.