На днях мой учитель химии объяснял нам научную нотацию (используя небольшое число и умножая ее на десятикратные числа, чтобы легче выразить большие числа), что вернуло меня на несколько лет назад, когда я впервые выучил это. Изучив основы, мы выполнили несколько типичных математических вопросов, некоторые из которых были похожи на следующие:
Представьте следующее в научной записи:
а) 50000000
б) 120000000000000
в) 90000000000000000000000000000000000000
г) пи ^ е ^ я ^ j ^ k ^ std :: vector
...
z) 200
...
И я подумал: «Что? Нам сказали, что научная нотация использовалась, чтобы сделать написание больших чисел более эффективным, но некоторые случаи вовсе не более эффективны!»
Считайте число
300
и его представление в научной записи:
3x10^2
Что, научно записанная версия на самом деле занимает больше места? Мы не можем иметь это сейчас, не так ли? (Пространство экрана драгоценно.)
Мы могли бы сами определить, является ли более эффективным использование пространства для записи числа в научной записи или нет, или ...
задача
Ваша программа или функция должны принимать в качестве входных данных одно положительное число n
произвольного размера (до того, что поддерживает ваш язык) и выводить версию номера с научной точки зрения.
Однако, если исходное число n
после удаления конечных нулей и конечного десятичного знака занимает меньше или такое же количество символов для отображения, чем его версия с научной нотацией, вы должны n
вместо этого вывести это исходное число .
Ваш код должен быть как можно короче, потому что вывод также должен быть максимально коротким.
Характеристики
Эффективная научная нотация определяется следующим образом:
bx10^e
b
является входным числом, соответствующим образом разделенным на степени 10, так что 1 <= b < 10
. У этого числа должны быть удалены все конечные нули (и десятичная точка, если требуется), но должна быть точность исходного числа (конечно, до предела десятичной точки на вашем языке). То есть 90000
становится 9
, 13.500
становится 1.35
, 0.000675
становится 6.75
и т. Д. Если это число содержит больше десятичных знаков, чем может обработать ваш язык, оно должно быть округлено до максимального числа десятичных знаков.
e
это показатель, к которому прибавляется десятка, так что n = b x 10^e
(помните, что это число должно быть отрицательным, если n
оно меньше 1). Это число не должно иметь конечных нулей или десятичных разрядов (главным образом потому, что если это не целое число, то что-то не так ...).
Символы x10^
должны оставаться как есть в строке между b
и e
.
Контрольные примеры
Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Другие правила и разъяснения
- Конечные нули (и / или конечный десятичный знак) не засчитываются в счетчик символов исходного входного числа
n
. Имейте это в виду для таких случаев, как контрольный пример 6 - Вы можете предположить, что если введенное число меньше 1, оно всегда будет начинаться с 0 для цифры (как в тестовых примерах 5-8).
- Входной номер никогда не будет отрицательным
- Встроенные модули, которые делают эту задачу тривиальной, и стандартные лазейки запрещены
- Завершающий перевод строки в выводе в порядке
РЕДАКТИРОВАТЬ
Спасибо пользователю 81655 за указание на контрольные примеры 7 и 8 имели неправильные полномочия десять. Я исправил их, поэтому убедитесь, что ваш код правильно их оценивает.
pi^e^i^j^k^std::vector
?e
:9000 -> 9e3
(почти более 9 000 !)x10^
. И это было бы довольно доработкой по этому вопросу, который я не считаю уместным сейчас, когда он был опубликованОтветы:
ES6,
8381 байтВероятно, терпит неудачу для некоторых крайних случаев, когда
toString
настаивает на экспоненциальном формате.Редактировать: 2 байта сохранены благодаря @ user81655.
источник
/
в конце регулярного выражения.x=>(e=s=>s.replace(/e\+?/,'x10^'),z=e(x.toExponential()),y=e(''+x))[z.length]?z:y
Python 3
346342319302 байтаНаверное, ужасно в гольф, но эй, это моя первая попытка чего-то подобного. Трудно читать, поэтому должно быть хорошо.
Насколько я знаю, он должен работать в каждом случае, даже с учетом тенденции Python автоматически преобразовывать числа, превышающие любой порог, в научную нотацию (за исключением этого крутого и причудливого 'e'). Я не помню точно, как я сделал это, чтобы иметь возможность возвращать стандартные номера форм, но это делает это.
источник
Perl 6,
9690 байтЯ чувствую, что это может быть короче, но это мое лучшее на данный момент
использование : назначьте это переменной
Здесь это немного раскошелилось с некоторыми плохими комментариями:
источник
$_ <1
с1>$_
и1 <=* <10
с10>*>=1
TI BASIC (nspire): 112 байт
объяснение
Преобразует ввод в научную нотацию с помощью функции форматирования, если она уже не находится в этом формате, поскольку небольшие десятичные числа автоматически преобразуются.
Находит позицию необычной E, которая обозначает экспоненты и заменяет ее на «x10 ^».
Проверяет, какой вывод больше, и возвращает оптимальный. Если это не десятичное число, которое по умолчанию меньше.
источник
Python (3.5) 177 байт
Решение с использованием регулярного выражения
объяснение
Импорт модуля регулярных выражений
Определение лямбда-функции для замены
e
наx10^
Конвертация строки в научном обозначении
Удалить 0 отступов в оригинальной строке
сравнить длину
Результаты
источник