diff --git a/config.json b/config.json index cfb29693..7f8de4a8 100644 --- a/config.json +++ b/config.json @@ -945,6 +945,14 @@ "practices": [], "prerequisites": [], "difficulty": 6 + }, + { + "slug": "dominoes", + "name": "Dominoes", + "uuid": "76e27165-47f5-4c4f-b747-c047872ff02c", + "practices": [], + "prerequisites": [], + "difficulty": 5 } ] }, diff --git a/exercises/practice/dominoes/.docs/instructions.append.md b/exercises/practice/dominoes/.docs/instructions.append.md new file mode 100644 index 00000000..8f19767c --- /dev/null +++ b/exercises/practice/dominoes/.docs/instructions.append.md @@ -0,0 +1,2 @@ +# Instructions append +In this version of the exercise, you are required to return `true` or `false` if a valid chain is possible or not. \ No newline at end of file diff --git a/exercises/practice/dominoes/.docs/instructions.md b/exercises/practice/dominoes/.docs/instructions.md new file mode 100644 index 00000000..1ced9f64 --- /dev/null +++ b/exercises/practice/dominoes/.docs/instructions.md @@ -0,0 +1,13 @@ +# Instructions + +Make a chain of dominoes. + +Compute a way to order a given set of dominoes in such a way that they form a correct domino chain (the dots on one half of a stone match the dots on the neighboring half of an adjacent stone) and that dots on the halves of the stones which don't have a neighbor (the first and last stone) match each other. + +For example given the stones `[2|1]`, `[2|3]` and `[1|3]` you should compute something +like `[1|2] [2|3] [3|1]` or `[3|2] [2|1] [1|3]` or `[1|3] [3|2] [2|1]` etc, where the first and last numbers are the same. + +For stones `[1|2]`, `[4|1]` and `[2|3]` the resulting chain is not valid: `[4|1] [1|2] [2|3]`'s first and last numbers are not the same. +4 != 3 + +Some test cases may use duplicate stones in a chain solution, assume that multiple Domino sets are being used. diff --git a/exercises/practice/dominoes/.meta/config.json b/exercises/practice/dominoes/.meta/config.json new file mode 100644 index 00000000..227a6ba2 --- /dev/null +++ b/exercises/practice/dominoes/.meta/config.json @@ -0,0 +1,15 @@ +{ + "authors": [], + "files": { + "solution": [ + "dominoes.jl" + ], + "test": [ + "runtests.jl" + ], + "example": [ + ".meta/example.jl" + ] + }, + "blurb": "Make a chain of dominoes." +} diff --git a/exercises/practice/dominoes/.meta/example.jl b/exercises/practice/dominoes/.meta/example.jl new file mode 100644 index 00000000..9f9802ec --- /dev/null +++ b/exercises/practice/dominoes/.meta/example.jl @@ -0,0 +1,15 @@ +function dominoes(stones) + function dfs(stones, chain, indices) + length(indices) == length(stones) && first(first(chain)) == last(last(chain)) && return true + for (i, stone) in enumerate(stones) + if i ∉ indices && last(last(chain)) ∈ stone + check = dfs(stones, push!(chain, last(last(chain)) == first(stone) ? stone : reverse(stone)), push!(indices, i)) + check && return true + delete!(indices, i) + pop!(chain) + end + end + false + end + isempty(stones) || dfs(stones, [first(stones)], Set(1)) +end diff --git a/exercises/practice/dominoes/.meta/tests.toml b/exercises/practice/dominoes/.meta/tests.toml new file mode 100644 index 00000000..08c8e08d --- /dev/null +++ b/exercises/practice/dominoes/.meta/tests.toml @@ -0,0 +1,49 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[31a673f2-5e54-49fe-bd79-1c1dae476c9c] +description = "empty input = empty output" + +[4f99b933-367b-404b-8c6d-36d5923ee476] +description = "singleton input = singleton output" + +[91122d10-5ec7-47cb-b759-033756375869] +description = "singleton that can't be chained" + +[be8bc26b-fd3d-440b-8e9f-d698a0623be3] +description = "three elements" + +[99e615c6-c059-401c-9e87-ad7af11fea5c] +description = "can reverse dominoes" + +[51f0c291-5d43-40c5-b316-0429069528c9] +description = "can't be chained" + +[9a75e078-a025-4c23-8c3a-238553657f39] +description = "disconnected - simple" + +[0da0c7fe-d492-445d-b9ef-1f111f07a301] +description = "disconnected - double loop" + +[b6087ff0-f555-4ea0-a71c-f9d707c5994a] +description = "disconnected - single isolated" + +[2174fbdc-8b48-4bac-9914-8090d06ef978] +description = "need backtrack" + +[167bb480-dfd1-4318-a20d-4f90adb4a09f] +description = "separate loops" + +[cd061538-6046-45a7-ace9-6708fe8f6504] +description = "nine elements" + +[44704c7c-3adb-4d98-bd30-f45527cf8b49] +description = "separate three-domino loops" diff --git a/exercises/practice/dominoes/dominoes.jl b/exercises/practice/dominoes/dominoes.jl new file mode 100644 index 00000000..9f2b51c4 --- /dev/null +++ b/exercises/practice/dominoes/dominoes.jl @@ -0,0 +1,3 @@ +function dominoes(stones) + # Your code here +end diff --git a/exercises/practice/dominoes/runtests.jl b/exercises/practice/dominoes/runtests.jl new file mode 100644 index 00000000..4b2ea031 --- /dev/null +++ b/exercises/practice/dominoes/runtests.jl @@ -0,0 +1,57 @@ +using Test + +include("dominoes.jl") + +@testset verbose = true "tests" begin + @testset "empty input = empty output" begin + @test dominoes([]) == true + end + + @testset "singleton input = singleton output" begin + @test dominoes([1, 1]) == true + end + + @testset "singleton that can't be chained" begin + @test dominoes([1, 2]) == false + end + + @testset "three elements" begin + @test dominoes([[1, 2], [3, 1], [2, 3]]) == true + end + + @testset "can reverse dominoes" begin + @test dominoes([[1, 2], [1, 3], [2, 3]]) == true + end + + @testset "can't be chained" begin + @test dominoes([[1, 2], [4, 1], [2, 3]]) == false + end + + @testset "disconnected - simple" begin + @test dominoes([[1, 1], [2, 2]]) == false + end + + @testset "disconnected - double loop" begin + @test dominoes([[1, 2], [2, 1], [3, 4], [4, 3]]) == false + end + + @testset "disconnected - single isolated" begin + @test dominoes([[1, 2], [2, 3], [3, 1], [4, 4]]) == false + end + + @testset "need backtrack" begin + @test dominoes([[1, 2], [2, 3], [3, 1], [2, 4], [2, 4]]) == true + end + + @testset "separate loops" begin + @test dominoes([[1, 2], [2, 3], [3, 1], [1, 1], [2, 2], [3, 3]]) == true + end + + @testset "nine elements" begin + @test dominoes([[1, 2], [5, 3], [3, 1], [1, 2], [2, 4], [1, 6], [2, 3], [3, 4], [5, 6]]) == true + end + + @testset "separate three-domino loops" begin + @test dominoes([[1, 2], [2, 3], [3, 1], [4, 5], [5, 6], [6, 4]]) == false + end +end