Я хотел бы взять число и знать, сколько слогов в нем, когда говорят на английском языке.
Давайте ограничим это положительными целыми числами, которые меньше одной тысячи.
Я британец, поэтому мы будем следовать за колонкой сотен со знаком «и», если после него есть ненулевые цифры.
Соревнование
- Напишите некоторый код, который будет принимать положительное целое число меньше 1000, и выведите количество слогов в словах, которые представляют это число в британском английском.
- НЕ нужно генерировать слова для представления чисел, только количество слогов, которые они содержат.
- Это код гольф, попытка достичь этого в наименьшем количестве байтов.
- Используйте любой язык, который вам нравится.
- Стандартные лазейки запрещены.
Тестовые случаи
| N | In words | Syllables |
| 1 | one | 1 |
| 2 | two | 1 |
| 3 | three | 1 |
| 4 | four | 1 |
| 5 | five | 1 |
| 6 | six | 1 |
| 7 | sev-en | 2 |
| 8 | eight | 1 |
| 9 | nine | 1 |
| 10 | ten | 1 |
| 11 | el-ev-en | 3 |
| 12 | twelve | 1 |
| 13 | thir-teen | 2 |
| 14 | four-teen | 2 |
| 17 | se-ven-teen | 3 |
| 20 | twen-ty | 2 |
| 21 | twen-ty one | 3 |
| 42 | four-ty two | 3 |
| 73 | sev-en-ty three | 4 |
| 77 | sev-en-ty sev-en | 5 |
| 100 | one hund-red | 3 |
| 110 | one hund-red and ten | 5 |
| 111 | one hund-red and el-ev-en | 7 |
| 555 | five hund-red and fif-ty five | 7 |
| 700 | sev-en hund-red | 4 |
| 770 | sev-en hund-red and sev-en-ty | 8 |
| 777 | sev-en hund-red and sev-en-ty sev-en | 10 |
| 999 | nine hund-red and nine-ty nine | 7 |
code-golf
natural-language
AJFaraday
источник
источник
Ответы:
Python 2 ,
84837467 байтСпасибо @xnor за
916 байтов!Попробуйте онлайн!
Python 2 , 79 байт
Прямо, но дольше.
Попробуйте онлайн!
источник
-10
к~9
и переключение вокруг последнего бита к+(0<n%100!=12)-(n%100!=11)
, но это еще больше , чем новое решение.lambda n:4*(n>99)+`n`.count('7')+cmp(n/10%10,1)-n%~9/9-min(n%100,13)%12/~9
min(n%100,13)%12/~9
может на самом деле помочь с подходом, который я пробовал для моего ответа желе, а также.Perl 5
-p
, 53 байтаПопробуйте онлайн!
Как
источник
JavaScript (ES6), 89 байт
Попробуйте онлайн!
источник
Python 2 ,
112108 байтПопробуйте онлайн!
-4 байта, спасибо Шегги
источник
[2]*7
часть потерпит неудачу17
, так как это должно быть 3 вместо 2 (sev-en-teen
).JavaScript,
8684 байтаУлучшенный порт решения Python от TFeld .
Попробуйте онлайн
2 байта сохранены благодаря Арно
источник
Wolfram Language
101115 байтобъяснение
( с заменой
StringSplit
дляs
)IntegerName
отображает число в американском английском (т.е. без «и», включенное в числа больше 100). Например,777-> "seven hundred seventy-seven
.StringSplit[IntegerName@#,"-"]
удаляет все дефисы при рендеринге.StringSplit/@
разбивает рендеринг на слова.Join@@
оставляет простой список слов без встроенного списка (в случае появления дефиса).WordData[#,"Hyphenation"]
разбивает одно слово на его слоги.Join@@
оставляет простой список слогов во всех словах.Length
считает слоги+Boole[#>100&&#~Mod~100!=0]
добавляет1
к числу слогов те числа, которые больше 100 (из-за дополнительных «и», используемых в британском английском рендеринге), исключая целые кратные 100.источник
Java 11,
105102 байтаСодержит множество непечатных символов.
-3 байта спасибо @ OlivierGrégoire .
Попробуйте онлайн.
Объяснение:
источник
.split("7",-1)
в.split("7",9)
и-6+(n>99?4:0)
к-(n>99?2:6)
.-(n>99?2:6)
, но теперь это так очевидно, что вы на это указали. И-1
в9
связи с ограниченным вводом размером я не подумал бы, так что спасибо!05AB1E ,
3431 байтПопробуйте онлайн или проверьте все
[1,999]
контрольные примеры .Объяснение:
Со всеми упомянутыми проверками это приведет к 1 для истины и 0 для фальси.
источник
I
(input) вместоX
(input mod 100) при проверке, больше ли это 20 для +1ty
.>
(проверьте, если вход больше 100) было заменено на@
(проверьте, если вход больше или равен 100). Может быть, я должен был бы сам проверить еще несколько тестовых случаев перед публикацией .. Извините за это ..Древесный уголь ,
3931 байтПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Рассчитайте корректировку количества слогов и выведите результат в виде строки.
Начните с изменения каждой ненулевой цифры на 1, а затем декодируйте как основание 2. Это дает правильный ответ для большинства входных данных.
Добавьте 1 для каждого
7
.Возьмите буквенную строку
10000000001021111111
и добавьте 80 нулей, затем циклически индексируйте входные данные и вычтите эту цифру.источник
Желе ,
282523 байтаПопробуйте онлайн!
Как это устроено
источник
PHP ,
190158145141137 байтПопробуйте онлайн!
Порт решения Кевина Круйссена (к сожалению, он не имеет такой же краткости в PHP :))
-
3245 благодаря Шегги!-3 спасибо Кевину Круйссену!
источник
>99
и>19
вместо>=100
и>=20
.05AB1E , 24 байта
Желе порт Деннис
Попробуйте онлайн! или как тестовый набор
объяснение
источник
05AB1E , 26 байт
Порт ответа @Neil 's Charcoal , так что не забудьте также поддержать его, если вам нравится этот ответ!
Попробуйте онлайн или проверьте все контрольные примеры .
Сжатое целое число
•Ž¢Γ}Þ±6u•
может альтернативно быть•8JA•b2TÌǝ
для того же самого количества байтов.Объяснение:
Смотрите этот 05AB1E ответ моего (раздел Как сжать большие целые числа? ) , Чтобы понять , почему
•Ž¢Γ}Þ±6u•
это10000000001021111111
.источник