Sfoglia il codice sorgente

More puzzles done

master
Lachlan Jacob 5 anni fa
parent
commit
0d76c2f8d2

+ 13
- 0
exercism/fsharp/armstrong-numbers/ArmstrongNumbers.fs Vedi File

@@ -0,0 +1,13 @@
module ArmstrongNumbers

let intFromChar a = int a - int '0'

// a ^ b where they are both ints
let rec intPow (a: int) (b: int) =
if b = 0 then 1 else a * (intPow a (b - 1))

let isArmstrongNumber (number: int): bool =
let len = String.length (string (number))
number =
(Seq.toList (string (number))
|> Seq.fold (fun a c -> a + (intPow (intFromChar c) len)) 0)

+ 21
- 0
exercism/fsharp/armstrong-numbers/ArmstrongNumbers.fsproj Vedi File

@@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<Compile Include="ArmstrongNumbers.fs" />
<Compile Include="ArmstrongNumbersTests.fs" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
<PackageReference Include="FsUnit.xUnit" Version="3.8.1" />
</ItemGroup>

</Project>

+ 45
- 0
exercism/fsharp/armstrong-numbers/ArmstrongNumbersTests.fs Vedi File

@@ -0,0 +1,45 @@
// This file was auto-generated based on version 1.1.0 of the canonical data.

module ArmstrongNumbersTests

open FsUnit.Xunit
open Xunit

open ArmstrongNumbers

[<Fact>]
let ``Zero is an Armstrong number`` () =
isArmstrongNumber 0 |> should equal true

[<Fact>]
let ``Single digit numbers are Armstrong numbers`` () =
isArmstrongNumber 5 |> should equal true

[<Fact>]
let ``There are no 2 digit Armstrong numbers`` () =
isArmstrongNumber 10 |> should equal false

[<Fact>]
let ``Three digit number that is an Armstrong number`` () =
isArmstrongNumber 153 |> should equal true

[<Fact>]
let ``Three digit number that is not an Armstrong number`` () =
isArmstrongNumber 100 |> should equal false

[<Fact>]
let ``Four digit number that is an Armstrong number`` () =
isArmstrongNumber 9474 |> should equal true

[<Fact>]
let ``Four digit number that is not an Armstrong number`` () =
isArmstrongNumber 9475 |> should equal false

[<Fact>]
let ``Seven digit number that is an Armstrong number`` () =
isArmstrongNumber 9926315 |> should equal true

[<Fact>]
let ``Seven digit number that is not an Armstrong number`` () =
isArmstrongNumber 9926314 |> should equal false


+ 32
- 0
exercism/fsharp/armstrong-numbers/README.md Vedi File

@@ -0,0 +1,32 @@
# Armstrong Numbers

An [Armstrong number](https://en.wikipedia.org/wiki/Narcissistic_number) is a number that is the sum of its own digits each raised to the power of the number of digits.

For example:

- 9 is an Armstrong number, because `9 = 9^1 = 9`
- 10 is *not* an Armstrong number, because `10 != 1^2 + 0^2 = 1`
- 153 is an Armstrong number, because: `153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153`
- 154 is *not* an Armstrong number, because: `154 != 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190`

Write some code to determine whether a number is an Armstrong number.

## Running the tests

To run the tests, run the command `dotnet test` from within the exercise directory.

## Autoformatting the code

F# source code can be formatted with the [Fantomas](https://github.com/fsprojects/fantomas) tool.

After installing it with `dotnet tool restore`, run `dotnet fantomas .` to format code within the current directory.

## Further information

For more detailed information about the F# track, including how to get help if
you're having trouble, please visit the exercism.io [F# language page](http://exercism.io/languages/fsharp/resources).

## Source

Wikipedia [https://en.wikipedia.org/wiki/Narcissistic_number](https://en.wikipedia.org/wiki/Narcissistic_number)


+ 29
- 0
exercism/fsharp/sum-of-multiples/README.md Vedi File

@@ -0,0 +1,29 @@
# Sum Of Multiples

Given a number, find the sum of all the unique multiples of particular numbers up to
but not including that number.

If we list all the natural numbers below 20 that are multiples of 3 or 5,
we get 3, 5, 6, 9, 10, 12, 15, and 18.

The sum of these multiples is 78.

## Running the tests

To run the tests, run the command `dotnet test` from within the exercise directory.

## Autoformatting the code

F# source code can be formatted with the [Fantomas](https://github.com/fsprojects/fantomas) tool.

After installing it with `dotnet tool restore`, run `dotnet fantomas .` to format code within the current directory.

## Further information

For more detailed information about the F# track, including how to get help if
you're having trouble, please visit the exercism.io [F# language page](http://exercism.io/languages/fsharp/resources).

## Source

A variation on Problem 1 at Project Euler [http://projecteuler.net/problem=1](http://projecteuler.net/problem=1)


+ 9
- 0
exercism/fsharp/sum-of-multiples/SumOfMultiples.fs Vedi File

@@ -0,0 +1,9 @@
module SumOfMultiples

let isMultiple factors number =
List.fold (fun a x -> (a || number % x = 0)) false factors

let sum (factors: int list) (upperBound: int): int =
let goodFactors = List.filter (fun i -> i <> 0) factors
let numbers = [ for i in 1..(upperBound - 1) -> i]
List.sum (List.filter (fun el -> isMultiple goodFactors el) numbers)

+ 21
- 0
exercism/fsharp/sum-of-multiples/SumOfMultiples.fsproj Vedi File

@@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<Compile Include="SumOfMultiples.fs" />
<Compile Include="SumOfMultiplesTests.fs" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.2" />
<PackageReference Include="FsUnit.xUnit" Version="3.8.1" />
</ItemGroup>

</Project>

+ 73
- 0
exercism/fsharp/sum-of-multiples/SumOfMultiplesTests.fs Vedi File

@@ -0,0 +1,73 @@
// This file was auto-generated based on version 1.5.0 of the canonical data.

module SumOfMultiplesTests

open FsUnit.Xunit
open Xunit

open SumOfMultiples

[<Fact>]
let ``No multiples within limit`` () =
sum [3; 5] 1 |> should equal 0

[<Fact>]
let ``One factor has multiples within limit`` () =
sum [3; 5] 4 |> should equal 3

[<Fact>]
let ``More than one multiple within limit`` () =
sum [3] 7 |> should equal 9

[<Fact>]
let ``More than one factor with multiples within limit`` () =
sum [3; 5] 10 |> should equal 23

[<Fact>]
let ``Each multiple is only counted once`` () =
sum [3; 5] 100 |> should equal 2318

[<Fact>]
let ``A much larger limit`` () =
sum [3; 5] 1000 |> should equal 233168

[<Fact>]
let ``Three factors`` () =
sum [7; 13; 17] 20 |> should equal 51

[<Fact>]
let ``Factors not relatively prime`` () =
sum [4; 6] 15 |> should equal 30

[<Fact>]
let ``Some pairs of factors relatively prime and some not`` () =
sum [5; 6; 8] 150 |> should equal 4419

[<Fact>]
let ``One factor is a multiple of another`` () =
sum [5; 25] 51 |> should equal 275

[<Fact>]
let ``Much larger factors`` () =
sum [43; 47] 10000 |> should equal 2203160

[<Fact>]
let ``All numbers are multiples of 1`` () =
sum [1] 100 |> should equal 4950

[<Fact>]
let ``No factors means an empty sum`` () =
sum [] 10000 |> should equal 0

[<Fact>]
let ``The only multiple of 0 is 0`` () =
sum [0] 1 |> should equal 0

[<Fact>]
let ``The factor 0 does not affect the sum of multiples of other factors`` () =
sum [3; 0] 4 |> should equal 3

[<Fact>]
let ``Solutions using include-exclude must extend to cardinality greater than 3`` () =
sum [2; 3; 5; 7; 11] 10000 |> should equal 39614537


Loading…
Annulla
Salva