Прелюдия:
Я хотел научиться делать тестовые случаи, поэтому я собираюсь попробовать их на чем-нибудь простом.
Вызов:
Возьмите любой заданный (строковый) ввод (в пределах видимого диапазона ASCII) и определите, является ли это число, и выведите что-то, что можно использовать для оценки.
Правила:
- Число будет содержать только символы
-0123456789,.
- Ответы требуются только для распознавания чисел от -1000000000 до 1000000000 (исключая), но могут распознавать произвольно большие числа.
- Вы можете написать полную программу или функцию.
- Если число, верните все, что можно было бы использовать, чтобы распознать его и документировать вывод в описании (например
My program outputs T if a number, F if not.
). - Ввод будет любым количеством символов в диапазоне ASCII или пустым (если пустое значение возвращает то, что вы выведите, если не число).
- Числа могут включать десятичную точку (напр.
3.14
). Если это так, у них должна быть хотя бы одна цифра перед десятичной запятой и хотя бы одна после нее. - Числа могут иметь начальные или конечные нули (например,
000001.00000
). - Целая часть числа может быть разделена для удобства чтения на куски из трех цифр с запятыми (например
1,000.23456
). В этом случае они должны быть разделены каждые три цифры справа налево (напр.1,234,567
,10,000.202
,123,234.00
,0,123.293
). - Отрицательные числа обозначены лидирующими символами
-
(напр.-1.23
). Знак,+
указывающий положительное число, не допускается и должен привести к ложному выводу. - Исключения НЕ считаются действительными и различимыми выходными данными (за исключением случаев, когда они могут передавать выходные данные в стандартный выходной поток (например,
Exception on line N [...]
могут быть вставлены в качестве выходных данных для числа / не числа), если строка помещена в стандартный выходной поток.
Тестовые случаи:
(при условии My program outputs T if a number, F if not.
версии)
123 -> T [on integer]
-123 -> T [negative numbers need to be handled]
0 -> T [on zero]
123.456 -> T [on floating point]
123,456.789 -> T [on evenly divided by 3 digits with comas]
123456789 -> T [thousand separators are not required]
0000001.00000 -> T [on leading/trailing zeros]
00.00 -> T [on zero and leading/trailing zeros]
999999999.9999999999999999999999999999999999999999999999999999 -> T [on close to the maximum value]
-999999999.9999999999999999999999999999999999999999999999999999 -> T [on close to the minimum value]
-> F [on empty]
lolz -> F [on non-number value]
n4melyh4xor -> F [on non-number with digits]
1.2 -> F [on space-padded]
9.3 1.3 -> F [on anyhow separated multiple numbers]
1e5 -> F [no scientific notation]
50cl05e.buty3ts0f4r -> F [on input with letters obscuring the number]
1,2,3,4.5678 -> F [on badly readability-divided number]
1,234.5,678 -> F [on readability-divided floating point part]
.234 -> F [on no leading zero]
+1 -> F [no leading + sign]
1.234.3 -> F [only one decimal point]
12345,678 -> F [on separator stopping mid-way]
Код-гольф , минимум символов является победителем.
code-golf
number
decision-problem
n4melyh4xor
источник
источник
-123
все в порядке, как насчет+456
-> хорошо или плохо. Или+
остался вне партии?Ответы:
Retina ,
2829314034 байтаВыводы,
1
если правда, в0
противном случае. Насколько я понимаю, в этом случае Retina выводит количество совпадений, которые есть у регулярного выражения на входе.Попробуйте онлайн!
Тестирование
Правки
RegExplanation
источник
m
иg
) в Retina?`
перед регулярным выражением, а затем перед этим идут модификаторы, напримерm`^.$
.g
не существует в .NET, по умолчанию совпадения глобальны.JavaScript,
4649 байтЭто прямой порт моего ответа Retina. Единственная причина, по которой я использовал JS, заключается в том, что есть простой способ протестировать регулярное выражение, используя Snacket Snippet ниже
источник
isNaN(+prompt())
для 16 символов. Такова жизнь, я полагаюPerl 6 , 42 байта
Попытайся
Expanded:
источник
PHP, 62 байта
Встроенный не может обрабатывать запятые и принимает научные обозначения; поэтому мне пришлось идти по пути регулярных выражений.
<?=is_numeric($argv[1]);
было бы 24 байта.источник
инструменты bash / Unix, 64 байта
Сохраните это как файл и передайте проверяемую строку в качестве первого аргумента команды.
Выходные данные равны 0 для не числа, 1 для числа.
Если вы готовы принять входные данные от stdin и можете гарантировать, что входные данные состоят только из одной строки, вы можете удалить <<< «$ 1» в конце, что приведет к 57 байтам. .
Что касается самого кода, опция -c для egrep подсчитывает количество совпадающих строк (которые будут либо 0, либо 1).
источник
Pyth, 25 символов
Сжимает регулярное выражение Kritixi Lithos .
Попробуйте онлайн. Использует символы Unicode вне базовой многоязычной плоскости, с которой TIO, очевидно, не может справиться? Это маленькое приложение сообщает о неправильном размере строки. Этот счетчик символов / байтов делает это правильно.
источник
C89, 195 байт
Ungolfed:
источник
Python 2, 79 байт
Regex решение
Попробуйте онлайн
источник
c #, 75 байтов
источник