Эта задача аналогична другой , однако я наложил ограничение (см. Жирный текст ниже), которое, я думаю, сделало бы его гораздо более разнообразным и (я надеюсь) веселым.
Соревнование
Напишите программу или функцию на любом языке программирования, которая принимает в качестве входных данных английское имя положительного целого числа, n
не превышающего, 100
и возвращает его n
как целое число.
Стандартные лазейки запрещены, и вы не можете использовать любую встроенную функцию, внешний инструмент или библиотеку, которая уже выполняет эту работу .
Самый короткий исходный код в байтах побеждает.
Тестовое задание
Здесь все input->output
дела:
one -> 1
two -> 2
three -> 3
four -> 4
five -> 5
six -> 6
seven -> 7
eight -> 8
nine -> 9
ten -> 10
eleven -> 11
twelve -> 12
thirteen -> 13
fourteen -> 14
fifteen -> 15
sixteen -> 16
seventeen -> 17
eighteen -> 18
nineteen -> 19
twenty -> 20
twenty-one -> 21
twenty-two -> 22
twenty-three -> 23
twenty-four -> 24
twenty-five -> 25
twenty-six -> 26
twenty-seven -> 27
twenty-eight -> 28
twenty-nine -> 29
thirty -> 30
thirty-one -> 31
thirty-two -> 32
thirty-three -> 33
thirty-four -> 34
thirty-five -> 35
thirty-six -> 36
thirty-seven -> 37
thirty-eight -> 38
thirty-nine -> 39
forty -> 40
forty-one -> 41
forty-two -> 42
forty-three -> 43
forty-four -> 44
forty-five -> 45
forty-six -> 46
forty-seven -> 47
forty-eight -> 48
forty-nine -> 49
fifty -> 50
fifty-one -> 51
fifty-two -> 52
fifty-three -> 53
fifty-four -> 54
fifty-five -> 55
fifty-six -> 56
fifty-seven -> 57
fifty-eight -> 58
fifty-nine -> 59
sixty -> 60
sixty-one -> 61
sixty-two -> 62
sixty-three -> 63
sixty-four -> 64
sixty-five -> 65
sixty-six -> 66
sixty-seven -> 67
sixty-eight -> 68
sixty-nine -> 69
seventy -> 70
seventy-one -> 71
seventy-two -> 72
seventy-three -> 73
seventy-four -> 74
seventy-five -> 75
seventy-six -> 76
seventy-seven -> 77
seventy-eight -> 78
seventy-nine -> 79
eighty -> 80
eighty-one -> 81
eighty-two -> 82
eighty-three -> 83
eighty-four -> 84
eighty-five -> 85
eighty-six -> 86
eighty-seven -> 87
eighty-eight -> 88
eighty-nine -> 89
ninety -> 90
ninety-one -> 91
ninety-two -> 92
ninety-three -> 93
ninety-four -> 94
ninety-five -> 95
ninety-six -> 96
ninety-seven -> 97
ninety-eight -> 98
ninety-nine -> 99
one hundred -> 100
Ответы:
C 160 байт
Проверь это
Как это устроено
После нескольких попыток, я нашел функцию , которая отображает "исключительное" число
one
,two
,three
,four
,five
,six
,seven
,eight
,nine
,ten
,eleven
,twelve
,thirteen
,fourteen
,fifteen
,sixteen
,seventeen
,eighteen
,nineteen
,twenty
,thirty
,forty
,fifty
,sixty
,seventy
,eighty
,ninety
,one hundred
, для печатаемых символов ASCIIk
,.
,[
,<
,*
,,
c
,K
,w
,y
,e
,(
,S
,_
,-
,C
,)
,7
,=
,4
,&
,o
,]
,s
,Y
,g
,m
,N
, Соответственно.Эта функция:
Программа для игры в гольф вычисляет
hash
функцию ввода, пока не достигнет конца строки или символа-
. Затем он ищет хеш в строкеk.[<* cKwye(S_-C)7=4&o]sYgmN
и определяет соответствующий номер. Если достигнут конец входной строки, возвращается число, если вместо него-
был достигнут а, то возвращается номер плюс результат программы гольфа, примененной к остальной части входной строки.источник
JavaScript (ES6),
175166163156153147 байтСохранено 7 байтов благодаря @Neil
Проверьте это здесь:
Показать фрагмент кода
Как это устроено
Основная идея состоит в том, чтобы разбить каждое число на его цифры-слова, а затем сопоставить каждое слово с соответствующей цифрой. Почти все слова настроены так, чтобы соответствовать обычному регулярному выражению, но есть несколько аномалий:
eleven
черезnineteen
: если слово содержитel
, илиte
в середине (чтобы избежатьten
), мы добавляемon-
в начало, изменяя их наon-eleven
сквознойon-nineteen
.twenty
,thirty
И т.д .: замена завершающуюy
с-d
изменением их кtwent-d
,thirt-d
и т.д.Теперь мы разбиваем дефисы, пробелы и
dr
s. Это расколы все от 11 до 99 в его соответствующих цифрах-слова, и"one hundred"
в[one,hun,ed]
. Затем мы отображаем каждое из этих слов через массив регулярных выражений и сохраняем индекс того, который соответствует первому.К настоящему времени каждый вход будет массивом правильных цифр. Все, что нам нужно сделать, это присоединиться к ним
join``
, преобразовать в число с унарным+
, и все готово.источник
.findIndex(y=>x.match(y))
работает?replace
.sh + coreutils, 112 байт
Может быть запущен на всех тестовых примерах, по одному на строку.
объяснение
Обратная пометка
awk
оцениваетsed
сценарийкоторый превращает части чисел в их числовое представление.
Дополнительные строки сценария sed
заботиться о
-ty
с иone hundred
.Наконец, удалите начальные
+
s и все, что не является+
,*
или цифру.Остаются только математические выражения
и может быть по трубопроводу
bc
.источник
Пиф,
79767568 байтСпасибо @ETHproductions за 7 байтов.
В основном сначала проверяется угловой регистр 100, затем используется массив первых двух букв чисел от 0 до 11, чтобы определить семантику ввода и изменить значение в соответствии с суффиксом ("-ty" и "-teen"; " лв "в 12 это еще один угловой случай). Сначала разбивает входные данные на список слов, затем сопоставляет каждое из них со значением и суммирует их.
В питоническом псевдокоде:
Тестирование
Python 3, 218 байт
В основном идентичный ответу Pyth.
Не по теме:
Я только что обнаружил значимую версию ответа на жизнь, вселенную и все остальное: это жаждущие чая веточки. Вау, веточки, которые жаждут чая! Я не уверен, сколько других ответов делают это, но для моего ответа, если ввод "чай-жажду прутьев", вывод 42.
источник
"ontwthfofisiseeiniteel"
этой программы.Python 3,
365361310303 символовGolfed
Ungolfed
источник
n="one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".split(",")
но, как я вижу, должно работать, не назначая его переменной n, просто вызовите его.index()
напрямую."one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir;four;fif;six;seven;eigh;nine;twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".replace(";","teen,").split(",")
.Haskell,
252231 байтЭто создает список всех английских имен чисел от «один» до «девяносто девять», а затем просматривает индекс ввода вверх. Если его не существует, мы находимся в крайнем случае «сто», поэтому он возвращает
100
, в противном случае он собирается вернуть индекс.Ungolfed
источник
Python 2, 275 символов
Он просто строит список каждого числа и находит индекс.
источник
Japt, 82 байта
Каждый
¿
представляет непечатаемый символ. Проверьте это онлайн!На основании моего ответа JS. Вычтите один байт, если вывод не должен быть целым числом, так как он будет выглядеть точно так же, как строка.
Как это устроено
источник
JavaScript,
214199 байтКак всегда: оказывается, это слишком долго, чтобы соревноваться, но теперь, когда я закончил, было бы бесполезно не публиковать это.
Возможно, есть еще один очевидный способ игры в гольф, который я упустил из виду?
JSFiddle для тестовых случаев
источник
f
наf=s=>([t,u]=s.split('-'),~s.indexOf('le')?11:~s.indexOf('lv')?12:e(t)+(t.slice(-3)=='een')*10+''+(u?e(u):t.slice(-1)=='y'?0:''))
? Кроме того, один строковый аргумент может быть передан функции, например, так:s.indexOf`lv`
Perl, 158 байт
Запускается из командной строки.
one hundred
должен быть введен так,"one hundred"
чтобы остановить его как два входа.источник