Еженедельная задача 179
Задача, мое решение
Задача 1: Правописание порядковых чисел
Задача
Вам дано положительное число $n
. Напишите скрипт для написания порядкового номера.
Мое решение
Это оказалось немного сложнее, чем я думал, особенно в некоторых крайних случаях. Конечно, существуют модули Python и Perl, которые уже делают это, но это не в духе решения подобных задач.
Я начинаю с определения четырех списков (массивов в Perl). numbers
содержит слова для первых 19 чисел, так что один, два, три и т.д. tens
содержит слова для двадцати, тридцати и т.д. Список ordinal
содержит порядковые слова для первых 19 чисел, например, first, second, third. Наконец, список thousands
содержит слова, которые мы используем для тысяч, миллионов и миллиардов. Я не обрабатываю ничего 1012 или больше.
Далее я разбиваю числа на блоки по три справа. Так 12345 становится [345, 12]
.
Затем нужно вывести слова для каждого блока.
- Если число равно 0 (например, средний блок в числе 1,000,234), ничего не делайте.
- Если число равномерно делится на 100, выведите слова для этого числа.
- Если число больше 100, выведите слова для числа сотен и слова ‘ и ‘. Измените число так, чтобы оно было остатком от 100.
- Если число больше 19, напечатайте слова для десятков и измените число на остаток от 10.
- Выведите число от одного до девятнадцати. Если это первый блок, используйте список
ordinal
, в противном случае используйте списокnumbers
. - Наконец, если это не первый блок, добавьте соответствующее тысячное слово.
Существует также крайний случай, когда решение делится на 100. В этом случае мы никогда не используем список ordinal
. Когда это происходит, я добавляю строку ‘th’ в конец строки.
Во время написания этого блога я также понял, что мы также не печатаем порядковое слово, если число делится на 10 (кроме ста десяти). Я добавил некоторый код, чтобы справиться и с этим. К счастью, для всех слов tens
мы можем заменить ‘y’ на ‘ieth’, чтобы получить нужное слово.
Затем нужно соединить все кусочки вместе, чтобы получить конечную строку.
Примеры
$ ./ch-1.py 11
eleventh
$ ./ch-1.py 62
sixty second
$ ./ch-1.py 99
ninety ninth
Задание 2: Строка Юникода
Задача
Вам дан список положительных чисел @n
.
Напишите скрипт, который будет печатать sparkline в Unicode для заданного списка чисел.
Мое решение
Прежде всего, я передаю атрибуты решения Rosetta Code под лицензией CC BY-SA 4.0.
К счастью, и Python 3, и Perl поддерживают юникод из коробки, поэтому нам не нужно делать ничего особенного для его поддержки.
Код определяет следующие переменные:
Затем он перебирает каждое значение @n
и использует уравнение (n - mn) / extent * barcount
, чтобы определить, какой бар нужно отобразить.
Примеры
$ ./ch-2.py 1 2 3 4 5 6 7 8
▁▂▃▄▅▆▇█
$ ./ch-2.py 1 8 2 7 3 6 10
▁▇▁▆▂▅█