From 1e03865a21328cab32b99d7da3390410834642b9 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Thu, 2 Jan 2025 20:45:40 +0100 Subject: [PATCH] Add `micro-blog` exercise (#138) --- config.json | 8 ++++ .../practice/micro-blog/.docs/instructions.md | 37 +++++++++++++++ .../practice/micro-blog/.meta/config.json | 17 +++++++ .../practice/micro-blog/.meta/example.ua | 1 + .../practice/micro-blog/.meta/tests.toml | 46 +++++++++++++++++++ exercises/practice/micro-blog/micro-blog.ua | 3 ++ exercises/practice/micro-blog/tests.ua | 37 +++++++++++++++ 7 files changed, 149 insertions(+) create mode 100644 exercises/practice/micro-blog/.docs/instructions.md create mode 100644 exercises/practice/micro-blog/.meta/config.json create mode 100644 exercises/practice/micro-blog/.meta/example.ua create mode 100644 exercises/practice/micro-blog/.meta/tests.toml create mode 100644 exercises/practice/micro-blog/micro-blog.ua create mode 100644 exercises/practice/micro-blog/tests.ua diff --git a/config.json b/config.json index ce20117..833866f 100644 --- a/config.json +++ b/config.json @@ -170,6 +170,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "micro-blog", + "name": "Micro Blog", + "uuid": "d2ba9ce7-42ee-4ab9-a378-0fc4fd505713", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "armstrong-numbers", "name": "Armstrong Numbers", diff --git a/exercises/practice/micro-blog/.docs/instructions.md b/exercises/practice/micro-blog/.docs/instructions.md new file mode 100644 index 0000000..d6c6cf6 --- /dev/null +++ b/exercises/practice/micro-blog/.docs/instructions.md @@ -0,0 +1,37 @@ +# Instructions + +You have identified a gap in the social media market for very very short posts. +Now that Twitter allows 280 character posts, people wanting quick social media updates aren't being served. +You decide to create your own social media network. + +To make your product noteworthy, you make it extreme and only allow posts of 5 or less characters. +Any posts of more than 5 characters should be truncated to 5. + +To allow your users to express themselves fully, you allow Emoji and other Unicode. + +The task is to truncate input strings to 5 characters. + +## Text Encodings + +Text stored digitally has to be converted to a series of bytes. +There are 3 ways to map characters to bytes in common use. + +- **ASCII** can encode English language characters. + All characters are precisely 1 byte long. +- **UTF-8** is a Unicode text encoding. + Characters take between 1 and 4 bytes. +- **UTF-16** is a Unicode text encoding. + Characters are either 2 or 4 bytes long. + +UTF-8 and UTF-16 are both Unicode encodings which means they're capable of representing a massive range of characters including: + +- Text in most of the world's languages and scripts +- Historic text +- Emoji + +UTF-8 and UTF-16 are both variable length encodings, which means that different characters take up different amounts of space. + +Consider the letter 'a' and the emoji 'πŸ˜›'. +In UTF-16 the letter takes 2 bytes but the emoji takes 4 bytes. + +The trick to this exercise is to use APIs designed around Unicode characters (codepoints) instead of Unicode codeunits. diff --git a/exercises/practice/micro-blog/.meta/config.json b/exercises/practice/micro-blog/.meta/config.json new file mode 100644 index 0000000..b82d716 --- /dev/null +++ b/exercises/practice/micro-blog/.meta/config.json @@ -0,0 +1,17 @@ +{ + "authors": [ + "erikschierboom" + ], + "files": { + "solution": [ + "micro-blog.ua" + ], + "test": [ + "tests.ua" + ], + "example": [ + ".meta/example.ua" + ] + }, + "blurb": "Given an input string, truncate it to 5 characters." +} diff --git a/exercises/practice/micro-blog/.meta/example.ua b/exercises/practice/micro-blog/.meta/example.ua new file mode 100644 index 0000000..12158da --- /dev/null +++ b/exercises/practice/micro-blog/.meta/example.ua @@ -0,0 +1 @@ +Truncate ← ⍜graphemes(↙↧5⧻.) diff --git a/exercises/practice/micro-blog/.meta/tests.toml b/exercises/practice/micro-blog/.meta/tests.toml new file mode 100644 index 0000000..f23ff0b --- /dev/null +++ b/exercises/practice/micro-blog/.meta/tests.toml @@ -0,0 +1,46 @@ +# 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. + +[b927b57f-7c98-42fd-8f33-fae091dc1efc] +description = "English language short" + +[a3fcdc5b-0ed4-4f49-80f5-b1a293eac2a0] +description = "English language long" + +[01910864-8e15-4007-9c7c-ac956c686e60] +description = "German language short (broth)" + +[f263e488-aefb-478f-a671-b6ba99722543] +description = "German language long (bear carpet β†’ beards)" + +[0916e8f1-41d7-4402-a110-b08aa000342c] +description = "Bulgarian language short (good)" + +[bed6b89c-03df-4154-98e6-a61a74f61b7d] +description = "Greek language short (health)" + +[485a6a70-2edb-424d-b999-5529dbc8e002] +description = "Maths short" + +[8b4b7b51-8f48-4fbe-964e-6e4e6438be28] +description = "Maths long" + +[71f4a192-0566-4402-a512-fe12878be523] +description = "English and emoji short" + +[6f0f71f3-9806-4759-a844-fa182f7bc203] +description = "Emoji short" + +[ce71fb92-5214-46d0-a7f8-d5ba56b4cc6e] +description = "Emoji long" + +[5dee98d2-d56e-468a-a1f2-121c3f7c5a0b] +description = "Royal Flush?" diff --git a/exercises/practice/micro-blog/micro-blog.ua b/exercises/practice/micro-blog/micro-blog.ua new file mode 100644 index 0000000..696136b --- /dev/null +++ b/exercises/practice/micro-blog/micro-blog.ua @@ -0,0 +1,3 @@ +# Truncate text taking graphemes into consideration +# Truncated ? Text +Truncate ← |1 βŠ™(⍀"Please implement Truncate" 0) diff --git a/exercises/practice/micro-blog/tests.ua b/exercises/practice/micro-blog/tests.ua new file mode 100644 index 0000000..6e25c55 --- /dev/null +++ b/exercises/practice/micro-blog/tests.ua @@ -0,0 +1,37 @@ +~ "micro-blog.ua" ~ Truncate + +# englishLanguageShort +⍀’≍ "Hi" Truncate "Hi" + +# english language - long +⍀’≍ "Hello" Truncate "Hello there" + +# german language - short - broth +⍀’≍ "brΓΌhe" Truncate "brΓΌhe" + +# german language - long - bear carpet to beards +⍀’≍ "BΓ€rte" Truncate "BΓ€rteppich" + +# bulgarian language - short - good +⍀’≍ "Π”ΠΎΠ±ΡŠΡ€" Truncate "Π”ΠΎΠ±ΡŠΡ€" + +# greek language - short - health +⍀’≍ "υγΡιά" Truncate "υγΡιά" + +# maths - short +⍀’≍ "a=Ο€rΒ²" Truncate "a=Ο€rΒ²" + +# maths - kong +⍀’≍ "βˆ…βŠŠβ„•βŠŠβ„€" Truncate "βˆ…βŠŠβ„•βŠŠβ„€βŠŠβ„šβŠŠβ„βŠŠβ„‚" + +# english - and emoji - short +⍀’≍ "Fly πŸ›«" Truncate "Fly πŸ›«" + +# emoji - short +⍀’≍ "πŸ’‡" Truncate "πŸ’‡" + +# emoji - long +⍀’≍ "β„πŸŒ‘πŸ€§πŸ€’πŸ₯" Truncate "β„πŸŒ‘πŸ€§πŸ€’πŸ₯πŸ•°πŸ˜€" + +# royal flush +⍀’≍ "πŸƒŽπŸ‚ΈπŸƒ…πŸƒ‹πŸƒ" Truncate "πŸƒŽπŸ‚ΈπŸƒ…πŸƒ‹πŸƒπŸƒπŸƒŠ"