Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,14 @@
"prerequisites": [],
"difficulty": 6
},
{
"slug": "say",
"name": "Say",
"uuid": "32d1e25e-86d6-4f2f-8f5e-5a5e8a2d3d32",
"practices": [],
"prerequisites": [],
"difficulty": 6
},
{
"slug": "yacht",
"name": "Yacht",
Expand Down
12 changes: 12 additions & 0 deletions exercises/practice/say/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Instructions

Given a number, your task is to express it in English words exactly as your friend should say it out loud.
Yaʻqūb expects to use numbers from 0 up to 999,999,999,999.

Examples:

- 0 → zero
- 1 → one
- 12 → twelve
- 123 → one hundred twenty-three
- 1,234 → one thousand two hundred thirty-four
6 changes: 6 additions & 0 deletions exercises/practice/say/.docs/introduction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Introduction

Your friend Yaʻqūb works the counter at the busiest deli in town, slicing, weighing, and wrapping orders for a never-ending line of hungry customers.
To keep things moving, each customer takes a numbered ticket when they arrive.

When it’s time to call the next person, Yaʻqūb reads their number out loud, always in full English words to make sure everyone hears it clearly.
19 changes: 19 additions & 0 deletions exercises/practice/say/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"keiravillekode"
],
"files": {
"solution": [
"say.fut"
],
"test": [
"test.fut"
],
"example": [
".meta/example.fut"
]
},
"blurb": "Given a number from 0 to 999,999,999,999, spell out that number in English.",
"source": "A variation on the JavaRanch CattleDrive, Assignment 4",
"source_url": "https://web.archive.org/web/20240907035912/https://coderanch.com/wiki/718804"
}
62 changes: 62 additions & 0 deletions exercises/practice/say/.meta/example.fut
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
def combine2 (first: []u8) (second: []u8): []u8 =
if length first == 0 then second else
if length second == 0 then first else
first ++ " " ++ second

def combine4 (first: []u8) (second: []u8) (third: []u8) (fourth: []u8): []u8 =
combine2 (combine2 first second) (combine2 third fourth)

def name (number: i32): []u8 =
if number == 1 then "one" else
if number == 2 then "two" else
if number == 3 then "three" else
if number == 4 then "four" else
if number == 5 then "five" else
if number == 6 then "six" else
if number == 7 then "seven" else
if number == 8 then "eight" else
if number == 9 then "nine" else
if number == 10 then "ten" else
if number == 11 then "eleven" else
if number == 12 then "twelve" else
if number == 13 then "thirteen" else
if number == 14 then "fourteen" else
if number == 15 then "fifteen" else
if number == 16 then "sixteen" else
if number == 17 then "seventeen" else
if number == 18 then "eighteen" else
if number == 19 then "nineteen" else
if number == 20 then "twenty" else
if number == 30 then "thirty" else
if number == 40 then "forty" else
if number == 50 then "fifty" else
if number == 60 then "sixty" else
if number == 70 then "seventy" else
if number == 80 then "eighty" else
if number == 90 then "ninety" else
assert (false) ""

def two_digit (number: i32): []u8 =
if number < 20 || number % 10 == 0 then name number else
(name (number / 10 * 10)) ++ "-" ++ (name (number % 10))

def three_digit (number: i32): []u8 =
let hundreds = number / 100
let units = number % 100
in
if hundreds == 0 then two_digit units else
if units == 0 then (name hundreds) ++ " hundred" else
(name hundreds) ++ " hundred " ++ (two_digit units)

def chunk (number: i32) (suffix: []u8): []u8 =
if number == 0 then "" else
(three_digit number) ++ suffix

def say (number: i64): []u8 =
if assert ((number >= 0) && (number < 1000000000000i64)) (number == 0) then "zero" else
let billions = i32.i64 (number / 1000000000)
let millions = i32.i64 (number / 1000000 % 1000)
let thousands = i32.i64 (number / 1000 % 1000)
let units = i32.i64 (number % 1000)
in
combine4 (chunk billions " billion") (chunk millions " million") (chunk thousands " thousand") (chunk units "")
67 changes: 67 additions & 0 deletions exercises/practice/say/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# 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.

[5d22a120-ba0c-428c-bd25-8682235d83e8]
description = "zero"

[9b5eed77-dbf6-439d-b920-3f7eb58928f6]
description = "one"

[7c499be1-612e-4096-a5e1-43b2f719406d]
description = "fourteen"

[f541dd8e-f070-4329-92b4-b7ce2fcf06b4]
description = "twenty"

[d78601eb-4a84-4bfa-bf0e-665aeb8abe94]
description = "twenty-two"

[f010d4ca-12c9-44e9-803a-27789841adb1]
description = "thirty"

[738ce12d-ee5c-4dfb-ad26-534753a98327]
description = "ninety-nine"

[e417d452-129e-4056-bd5b-6eb1df334dce]
description = "one hundred"

[d6924f30-80ba-4597-acf6-ea3f16269da8]
description = "one hundred twenty-three"

[2f061132-54bc-4fd4-b5df-0a3b778959b9]
description = "two hundred"

[feed6627-5387-4d38-9692-87c0dbc55c33]
description = "nine hundred ninety-nine"

[3d83da89-a372-46d3-b10d-de0c792432b3]
description = "one thousand"

[865af898-1d5b-495f-8ff0-2f06d3c73709]
description = "one thousand two hundred thirty-four"

[b6a3f442-266e-47a3-835d-7f8a35f6cf7f]
description = "one million"

[2cea9303-e77e-4212-b8ff-c39f1978fc70]
description = "one million two thousand three hundred forty-five"

[3e240eeb-f564-4b80-9421-db123f66a38f]
description = "one billion"

[9a43fed1-c875-4710-8286-5065d73b8a9e]
description = "a big number"

[49a6a17b-084e-423e-994d-a87c0ecc05ef]
description = "numbers below zero are out of range"

[4d6492eb-5853-4d16-9d34-b0f61b261fd9]
description = "numbers above 999,999,999,999 are out of range"
1 change: 1 addition & 0 deletions exercises/practice/say/say.fut
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
def say (number: i32): []u8 = ???
114 changes: 114 additions & 0 deletions exercises/practice/say/test.fut
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import "say"

-- zero
-- ==
-- input { 0i64 }
-- output { "zero" }

-- one
-- ==
-- input { 1i64 }
-- output { "one" }

-- fourteen
-- ==
-- input { 14i64 }
-- output { "fourteen" }

-- twenty
-- ==
-- input { 20i64 }
-- output { "twenty" }

-- twenty-two
-- ==
-- input { 22i64 }
-- output { "twenty-two" }

-- thirty
-- ==
-- input { 30i64 }
-- output { "thirty" }

-- ninety-nine
-- ==
-- input { 99i64 }
-- output { "ninety-nine" }

-- one hundred
-- ==
-- input { 100i64 }
-- output { "one hundred" }

-- one hundred twenty-three
-- ==
-- input { 123i64 }
-- output { "one hundred twenty-three" }

-- two hundred
-- ==
-- input { 200i64 }
-- output { "two hundred" }

-- nine hundred ninety-nine
-- ==
-- input { 999i64 }
-- output { "nine hundred ninety-nine" }

-- one thousand
-- ==
-- input { 1000i64 }
-- output { "one thousand" }

-- one thousand two hundred thirty-four
-- ==
-- input { 1234i64 }
-- output { "one thousand two hundred thirty-four" }

-- one million
-- ==
-- input { 1000000i64 }
-- output { "one million" }

-- one million two thousand three hundred forty-five
-- ==
-- input { 1002345i64 }
-- output { "one million two thousand three hundred forty-five" }

-- one billion
-- ==
-- input { 1000000000i64 }
-- output { "one billion" }

-- a big number
-- ==
-- input { 987654321123i64 }
-- output { "nine hundred eighty-seven billion six hundred fifty-four million three hundred twenty-one thousand one hundred twenty-three" }

-- numbers below zero are out of range
-- ==
-- input { -1i64 }
-- error: Error*

-- numbers above 999,999,999,999 are out of range
-- ==
-- input { 1000000000000i64 }
-- error: Error*

-- additional big number
-- ==
-- input { 19011016013i64 }
-- output { "nineteen billion eleven million sixteen thousand thirteen" }

-- different big number
-- ==
-- input { 812000070017i64 }
-- output { "eight hundred twelve billion seventy thousand seventeen" }

-- alternative big number
-- ==
-- input { 60010015018i64 }
-- output { "sixty billion ten million fifteen thousand eighteen" }

let main (number: i64): []u8 =
say number
37 changes: 37 additions & 0 deletions generators/exercises/say.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
def extra_cases():
return [
{
"description": "additional big number",
"property": "say",
"input": {"number": 19011016013},
"expected": "nineteen billion eleven million sixteen thousand thirteen",
},
{
"description": "different big number",
"property": "say",
"input": {"number": 812000070017},
"expected": "eight hundred twelve billion seventy thousand seventeen",
},
{
"description": "alternative big number",
"property": "say",
"input": {"number": 60010015018},
"expected": "sixty billion ten million fifteen thousand eighteen",
},
]


def gen_test_case(prop, description, inp, expected, f):
number = inp["number"]
f.write(f"-- {description}\n")
f.write("-- ==\n")
f.write(f"-- input {{ {number}i64 }}\n")
if isinstance(expected, dict):
f.write("-- error: Error*\n\n")
else:
f.write(f'-- output {{ "{expected}" }}\n\n')


def gen_main(f):
f.write("let main (number: i64): []u8 =\n")
f.write(" say number\n")