From 70d83353e6c636180211e90ab8892b4bf9d22d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Thu, 24 Apr 2025 13:32:27 -0700 Subject: [PATCH] Add `diamond` --- config.json | 8 ++ .../practice/diamond/.docs/instructions.md | 52 +++++++++++ exercises/practice/diamond/.meta/config.json | 19 ++++ exercises/practice/diamond/.meta/example.vim | 26 ++++++ exercises/practice/diamond/.meta/tests.toml | 25 ++++++ exercises/practice/diamond/diamond.vader | 90 +++++++++++++++++++ exercises/practice/diamond/diamond.vim | 6 ++ 7 files changed, 226 insertions(+) create mode 100644 exercises/practice/diamond/.docs/instructions.md create mode 100644 exercises/practice/diamond/.meta/config.json create mode 100644 exercises/practice/diamond/.meta/example.vim create mode 100644 exercises/practice/diamond/.meta/tests.toml create mode 100644 exercises/practice/diamond/diamond.vader create mode 100644 exercises/practice/diamond/diamond.vim diff --git a/config.json b/config.json index c928e09..7a55771 100644 --- a/config.json +++ b/config.json @@ -651,6 +651,14 @@ "prerequisites": [], "difficulty": 4 }, + { + "slug": "diamond", + "name": "Diamond", + "uuid": "79acd8ec-adf4-4163-8361-0f71950213fb", + "practices": [], + "prerequisites": [], + "difficulty": 5 + }, { "slug": "grade-school", "name": "Grade School", diff --git a/exercises/practice/diamond/.docs/instructions.md b/exercises/practice/diamond/.docs/instructions.md new file mode 100644 index 0000000..3034802 --- /dev/null +++ b/exercises/practice/diamond/.docs/instructions.md @@ -0,0 +1,52 @@ +# Instructions + +The diamond kata takes as its input a letter, and outputs it in a diamond shape. +Given a letter, it prints a diamond starting with 'A', with the supplied letter at the widest point. + +## Requirements + +- The first row contains one 'A'. +- The last row contains one 'A'. +- All rows, except the first and last, have exactly two identical letters. +- All rows have as many trailing spaces as leading spaces. (This might be 0). +- The diamond is horizontally symmetric. +- The diamond is vertically symmetric. +- The diamond has a square shape (width equals height). +- The letters form a diamond shape. +- The top half has the letters in ascending order. +- The bottom half has the letters in descending order. +- The four corners (containing the spaces) are triangles. + +## Examples + +In the following examples, spaces are indicated by `·` characters. + +Diamond for letter 'A': + +```text +A +``` + +Diamond for letter 'C': + +```text +··A·· +·B·B· +C···C +·B·B· +··A·· +``` + +Diamond for letter 'E': + +```text +····A···· +···B·B··· +··C···C·· +·D·····D· +E·······E +·D·····D· +··C···C·· +···B·B··· +····A···· +``` diff --git a/exercises/practice/diamond/.meta/config.json b/exercises/practice/diamond/.meta/config.json new file mode 100644 index 0000000..fc7a2fe --- /dev/null +++ b/exercises/practice/diamond/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "diamond.vim" + ], + "test": [ + "diamond.vader" + ], + "example": [ + ".meta/example.vim" + ] + }, + "blurb": "Given a letter, print a diamond starting with 'A' with the supplied letter at the widest point.", + "source": "Seb Rose", + "source_url": "https://web.archive.org/web/20220807163751/http://claysnow.co.uk/recycling-tests-in-tdd/" +} diff --git a/exercises/practice/diamond/.meta/example.vim b/exercises/practice/diamond/.meta/example.vim new file mode 100644 index 0000000..6c076c8 --- /dev/null +++ b/exercises/practice/diamond/.meta/example.vim @@ -0,0 +1,26 @@ +function! Rows(letter) abort + if a:letter ==# 'A' + return 'A' + endif + + let l:start = char2nr('A') + let l:end = char2nr(a:letter) + let l:size = l:end - l:start + 1 + + let l:diamond = [] + for l:i in range(0, l:size - 1) + let l:outer = repeat(' ', l:size - 1 - i) + let l:inner = nr2char(l:start + i) + if l:i > 0 + let l:inner = l:inner . repeat(' ', 2 * l:i - 1) . l:inner + endif + let line = l:outer . l:inner . l:outer + call add(l:diamond, l:line) + endfor + + for l:i in range(l:size - 2, 0, -1) + call add(l:diamond, l:diamond[l:i]) + endfor + + return join(l:diamond, '\n') +endfunction diff --git a/exercises/practice/diamond/.meta/tests.toml b/exercises/practice/diamond/.meta/tests.toml new file mode 100644 index 0000000..4e7802e --- /dev/null +++ b/exercises/practice/diamond/.meta/tests.toml @@ -0,0 +1,25 @@ +# 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. + +[202fb4cc-6a38-4883-9193-a29d5cb92076] +description = "Degenerate case with a single 'A' row" + +[bd6a6d78-9302-42e9-8f60-ac1461e9abae] +description = "Degenerate case with no row containing 3 distinct groups of spaces" + +[af8efb49-14ed-447f-8944-4cc59ce3fd76] +description = "Smallest non-degenerate case with odd diamond side length" + +[e0c19a95-9888-4d05-86a0-fa81b9e70d1d] +description = "Smallest non-degenerate case with even diamond side length" + +[82ea9aa9-4c0e-442a-b07e-40204e925944] +description = "Largest possible diamond" diff --git a/exercises/practice/diamond/diamond.vader b/exercises/practice/diamond/diamond.vader new file mode 100644 index 0000000..03c5e48 --- /dev/null +++ b/exercises/practice/diamond/diamond.vader @@ -0,0 +1,90 @@ +Execute (Degenerate case with a single 'A' row): + let g:letter = 'A' + let g:expected = 'A' + AssertEqual g:expected, Rows(g:letter) + +Execute (Degenerate case with no row containing 3 distinct groups of spaces): + let g:letter = 'B' + let g:expected = join([ + \ ' A ', + \ 'B B', + \ ' A '], '\n') + AssertEqual g:expected, Rows(g:letter) + +Execute (Smallest non-degenerate case with odd diamond side length): + let g:letter = 'C' + let g:expected = join([ + \ ' A ', + \ ' B B ', + \ 'C C', + \ ' B B ', + \ ' A '], '\n') + AssertEqual g:expected, Rows(g:letter) + +Execute (Smallest non-degenerate case with even diamond side length): + let g:letter = 'D' + let g:expected = join([ + \ ' A ', + \ ' B B ', + \ ' C C ', + \ 'D D', + \ ' C C ', + \ ' B B ', + \ ' A '], '\n') + AssertEqual g:expected, Rows(g:letter) + +Execute (Largest possible diamond): + let g:letter = 'Z' + let g:expected = join([ + \ ' A ', + \ ' B B ', + \ ' C C ', + \ ' D D ', + \ ' E E ', + \ ' F F ', + \ ' G G ', + \ ' H H ', + \ ' I I ', + \ ' J J ', + \ ' K K ', + \ ' L L ', + \ ' M M ', + \ ' N N ', + \ ' O O ', + \ ' P P ', + \ ' Q Q ', + \ ' R R ', + \ ' S S ', + \ ' T T ', + \ ' U U ', + \ ' V V ', + \ ' W W ', + \ ' X X ', + \ ' Y Y ', + \ 'Z Z', + \ ' Y Y ', + \ ' X X ', + \ ' W W ', + \ ' V V ', + \ ' U U ', + \ ' T T ', + \ ' S S ', + \ ' R R ', + \ ' Q Q ', + \ ' P P ', + \ ' O O ', + \ ' N N ', + \ ' M M ', + \ ' L L ', + \ ' K K ', + \ ' J J ', + \ ' I I ', + \ ' H H ', + \ ' G G ', + \ ' F F ', + \ ' E E ', + \ ' D D ', + \ ' C C ', + \ ' B B ', + \ ' A '], '\n') + AssertEqual g:expected, Rows(g:letter) diff --git a/exercises/practice/diamond/diamond.vim b/exercises/practice/diamond/diamond.vim new file mode 100644 index 0000000..a0f4436 --- /dev/null +++ b/exercises/practice/diamond/diamond.vim @@ -0,0 +1,6 @@ +" +" Generate a formatted diamond based on an input letter. +" +function! Rows(letter) abort + " your implementation goes here +endfunction