diff --git a/config.json b/config.json index 36a93ae6..a49b8ffc 100644 --- a/config.json +++ b/config.json @@ -780,6 +780,14 @@ "prerequisites": [], "difficulty": 5 }, + { + "slug": "satellite", + "name": "Satellite", + "uuid": "02d23d01-c4c6-4fd1-9e0b-f6a457c402ed", + "practices": [], + "prerequisites": [], + "difficulty": 6 + }, { "slug": "knapsack", "name": "Knapsack", diff --git a/exercises/practice/satellite/.docs/instructions.md b/exercises/practice/satellite/.docs/instructions.md new file mode 100644 index 00000000..fbbf14f4 --- /dev/null +++ b/exercises/practice/satellite/.docs/instructions.md @@ -0,0 +1,27 @@ +# Instructions + +Imagine you need to transmit a binary tree to a satellite approaching Alpha Centauri and you have limited bandwidth. +Since the tree has no repeating items it can be uniquely represented by its [pre-order and in-order traversals][wiki]. + +Write the software for the satellite to rebuild the tree from the traversals. + +A pre-order traversal reads the value of the current node before (hence "pre") reading the left subtree in pre-order. +Afterwards the right subtree is read in pre-order. + +An in-order traversal reads the left subtree in-order then the current node and finally the right subtree in-order. +So in order from left to right. + +For example the pre-order traversal of this tree is [a, i, x, f, r]. +The in-order traversal of this tree is [i, a, f, x, r] + +```text + a + / \ +i x + / \ + f r +``` + +Note: the first item in the pre-order traversal is always the root. + +[wiki]: https://en.wikipedia.org/wiki/Tree_traversal diff --git a/exercises/practice/satellite/.meta/config.json b/exercises/practice/satellite/.meta/config.json new file mode 100644 index 00000000..d7503331 --- /dev/null +++ b/exercises/practice/satellite/.meta/config.json @@ -0,0 +1,17 @@ +{ + "authors": [ + "keiravillekode" + ], + "files": { + "solution": [ + "satellite.el" + ], + "test": [ + "satellite-test.el" + ], + "example": [ + ".meta/example.el" + ] + }, + "blurb": "Rebuild binary trees from pre-order and in-order traversals." +} diff --git a/exercises/practice/satellite/.meta/example.el b/exercises/practice/satellite/.meta/example.el new file mode 100644 index 00000000..b4fb6ac8 --- /dev/null +++ b/exercises/practice/satellite/.meta/example.el @@ -0,0 +1,31 @@ +;;; satellite.el --- Satellite (exercism) -*- lexical-binding: t; -*- + +;;; Commentary: + +;;; Code: + +(require 'cl-lib) +(require 'seq) + +(defun tree-from-traversals (preorder inorder) + (when (/= (length preorder) (length inorder)) + (error "traversals must have the same length")) + (when (or (/= (length preorder) (length (seq-uniq preorder))) + (/= (length inorder) (length (seq-uniq inorder)))) + (error "traversals must contain unique items")) + (cl-labels + ((traverse (successor) + (cond + ((and successor (equal (car inorder) successor)) nil) + ((null preorder) (error "traversals must have the same elements")) + (t (let ((v (car preorder))) + (setq preorder (cdr preorder)) + (let ((l (funcall #'traverse v))) + (setq inorder (cdr inorder)) + (let ((r (and inorder (funcall #'traverse successor)))) + (list (cons :v v) (cons :l l) (cons :r r))))))))) + (and preorder (funcall #'traverse nil)))) + +(provide 'satellite) +;;; satellite.el ends here + diff --git a/exercises/practice/satellite/.meta/tests.toml b/exercises/practice/satellite/.meta/tests.toml new file mode 100644 index 00000000..b32dc3b1 --- /dev/null +++ b/exercises/practice/satellite/.meta/tests.toml @@ -0,0 +1,28 @@ +# 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. + +[8df3fa26-811a-4165-9286-ff9ac0850d19] +description = "Empty tree" + +[f945ccfc-05e3-47d7-825b-0270559d43ad] +description = "Tree with one item" + +[a0121d5f-37b0-48dd-9c64-cba4c4464135] +description = "Tree with many items" + +[6074041f-4891-4d81-a128-401050c2a3b0] +description = "Reject traversals of different length" + +[27916ce4-45f3-4d8b-8528-496fedc157ca] +description = "Reject inconsistent traversals of same length" + +[d86a3d72-76a9-43b5-9d3a-e64cb1216035] +description = "Reject traversals with repeated items" diff --git a/exercises/practice/satellite/satellite-test.el b/exercises/practice/satellite/satellite-test.el new file mode 100644 index 00000000..bfa19d13 --- /dev/null +++ b/exercises/practice/satellite/satellite-test.el @@ -0,0 +1,52 @@ +;;; satellite-test.el --- Tests for Satellite (exercism) -*- lexical-binding: t; -*- + +;;; Commentary: + +;;; Code: + + +(load-file "satellite.el") +(declare-function tree-from-traversals "satellite.el" (preorder inorder)) + + +(ert-deftest empty-tree () + (should (equal nil + (tree-from-traversals '() '())))) + + +(ert-deftest tree-with-one-item () + (should (equal '((:v . "a") + (:l . nil) + (:r . nil)) + (tree-from-traversals '("a") '("a"))))) + + +(ert-deftest tree-with-many-items () + (should (equal '((:v . "a") + (:l . ((:v . "i") + (:l . nil) + (:r . nil))) + (:r . ((:v . "x") + (:l . ((:v . "f") + (:l . nil) + (:r . nil))) + (:r . ((:v . "r") + (:l . nil) + (:r . nil)))))) + (tree-from-traversals '("a" "i" "x" "f" "r") '("i" "a" "f" "x" "r"))))) + + +(ert-deftest reject-traversals-of-different-length () + (should-error (tree-from-traversals '("a" "b") '("b" "a" "r")))) + + +(ert-deftest reject-inconsistent-traversals-of-same-length () + (should-error (tree-from-traversals '("x" "y" "z") '("a" "b" "c")))) + + +(ert-deftest reject-traversals-with-repeated-items () + (should-error (tree-from-traversals '("a" "b" "a") '("b" "a" "a")))) + + +(provide 'satellite-test) +;;; satellite-test.el ends here diff --git a/exercises/practice/satellite/satellite.el b/exercises/practice/satellite/satellite.el new file mode 100644 index 00000000..ad0e3447 --- /dev/null +++ b/exercises/practice/satellite/satellite.el @@ -0,0 +1,14 @@ +;;; satellite.el --- Satellite (exercism) -*- lexical-binding: t; -*- + +;;; Commentary: + +;;; Code: + + +(defun tree-from-traversals (preorder inorder) + (error "Delete this S-Expression and write your own implementation")) + + +(provide 'satellite) +;;; satellite.el ends here +