У нас было несколько проблем с базовым преобразованием, но все они, похоже, применимы к целочисленным значениям. Давайте сделаем это с реальными числами!
Соревнование
Входы:
- Действительное положительное число x , выраженное в базе 10. Это может быть принято как число с плавающей запятой двойной точности или как строка. Чтобы избежать проблем с точностью, можно предположить, что число больше 10 -6 и меньше 10 15 .
- Целевые базовые б . Это будет целое число от 2 до 36.
- Количество дробных цифр п . Это будет целое число от 1 до 20.
Выход: представление о х в базовой Ь с п дробных цифр.
При вычислении выходного выражения цифры за пределами n-й должны быть усечены (не округлены). Например, x = 3.141592653589793
в базе b = 3
есть 10.0102110122...
, поэтому для n = 3
вывода будет 10.010
(усечение), а не 10.011
(округление).
Для x и b, которые дают конечное число цифр в дробной части, также допускается эквивалентное бесконечное представление (усеченное до n цифр). Например, 4.5
в десятичном виде также можно представить как 4.49999...
.
Не беспокойтесь об ошибках с плавающей запятой .
Формат ввода и вывода
х будет дан без начальных нулей. Если x окажется целым числом, вы можете предположить, что оно будет дано с нулевой десятичной частью ( 3.0
) или без десятичной части ( 3
).
Выход гибкий. Например, это может быть:
- Строка, представляющая число с подходящим разделителем (десятичная точка) между целыми и дробными частями. Цифры
11
и12
т. Д. (Для b больше 10) могут быть представлены в виде буквA
,B
как обычно, или в виде любых других отдельных символов (просьба указать). - Строка для целочисленной части и другая строка для дробной части.
- Два массива / списка, по одному для каждой части, содержащие числа от
0
до35
как цифры.
Единственными ограничениями являются то, что целые и дробные части могут быть разделены (подходящий разделитель) и использовать один и тот же формат (например, нет [5, 11]
для списка, представляющего целую часть, и ['5', 'B']
для списка, представляющего дробную часть).
Дополнительные правила
- Программы или функции разрешены на любом языке программирования . Стандартные лазейки запрещены.
- Самый короткий код в байтах побеждает.
Контрольные примеры
Вывод показан в виде строки с цифрами 0
, ..., 9
, A
..., Z
, используя в .
качестве десятичного разделителя.
x, b, n -> output(s)
4.5, 10, 5 -> 4.50000 or 4.49999
42, 13, 1 -> 33.0 or 32.C
3.141592653589793, 3, 8 -> 10.01021101
3.141592653589793, 5, 10 -> 3.0323221430
1.234, 16, 12 -> 1.3BE76C8B4395
10.5, 2, 8 -> 1010.10000000 or 1010.01111111
10.5, 3, 8 -> 101.11111111
6.5817645, 20, 10 -> 6.BCE2680000 or 6.BCE267JJJJ
0.367879441171442, 25, 10 -> 0.94N2MGH7G8
12944892982609, 29, 9 -> PPCGROCKS.000000000
источник
42, 13, 1
мы можем иметь33
вместо33.0
?n
десятичные цифрыОтветы:
Желе , 16 байт
Попробуйте онлайн!
Обратите внимание, что синглтоны печатаются как элемент на выходе.
источник
JavaScript (ES8),
817471 байтРаботает
x
между1e-6
и1e21
,b
от2
до36
(точно так же, как требуется) иn
от1
до чего угодно от10
до в48
зависимости от базы до появления ошибок с плавающей запятой. Редактирование: 7 байт с помощью @Birjolaxew. Сохранено еще 3 байта с помощью @tsh. Предыдущая 74-байтовая версия также работала с отрицательными числами:источник
n
"цифр" из строки..toString(b)
... тупой меня> _ <Python 2 ,
153149144137135109 байтовНе заметил, что я могу просто вернуть цифры в виде чисел, так что это намного проще. Возвращает два списка цифр, первый для целой части, второй для дробной части.
Попробуйте онлайн!
источник
1e-6
(и меньше, чем1e15
раньше)Perl 6 , 25 байт
Попытайся
Expanded:
Обратите внимание, что пространство так, что оно анализируется как
(+x).base(b,n)
нет
+( x.base(b,n) )
.источник
1e-6
(и меньше чем1e15
, как и раньше)Mathematica, 158 байт
Поскольку этот вопрос уже получил очень хороший ответ в Mathematica от @KellyLowder, я попытался (с другим подходом) получить точные результаты, как показано в тестовых примерах.
вход
выход
источник
Рубин , 45 байт
Почему?
Поскольку b ^ n в базе b равно 10 ^ n, мы умножаем x на это число, а затем добавляем десятичную точку, к которой оно принадлежит.
Попробуйте онлайн!
источник
.round
на.to_i
; это исправляет последнюю цифру вывода для тех, где она не совпадает с результатами теста. -1 байт больше.insert ~n,?.
без использования круглых скобок.C (gcc) ,
157152 байтаlong int
Для работы с большими контрольными примерами требуется 64 бита .-5 байт благодаря Питеру Кордесу
Попробуйте онлайн!
редактировать: несколько байтов можно сбрить, если разрешено выводить две строки, разделенные разделителем новой строки:
149 байт:
редактировать: это представление не самое длинное, ууу!
источник
printf(z+r)
если он не содержит%
символов. (Это код-гольф; безопасность и хорошие практики выходят в окно: P). Вы также можете использовать,puts(z+r)
чтобы получить новую строку бесплатно (сохранениеputs("")
во второй версии).float
корочеdouble
, но, похоже, вопрос требуетdouble
ввода или строки.long
, и согласно правилам code-golf это все, что вам нужно, чтобы ваш ответ был действительным. (Кроме того, ответы на вопросы о коде-гольфе на C и C ++ обычно принимают 64-битныеlong
, поскольку именно это использует Try It Online.) Я бы предложил откатить ваши правки, и просто добавить примечание типа "long
должно быть 64-битным для это для поддержки больших тестовых случаев. "Mathematica 47 байт
Вызов
RealDigits
дважды, чтобы сначала выяснить количество цифр слева от десятичной дроби.источник
1e-6
(и меньше, чем1e15
прежде)TakeDrop@@RealDigits[##]
но потом я понял, что неправильно понял - ваше решение кажется оптимальным.SageMath , 68 байт
Попробуйте онлайн!
источник
1e-6
(и меньше чем1e15
, как и раньше)Haskell , 188 байт
Попробуйте онлайн!
g
преобразует число в список, представляющий это число в данной базеz
отображает целые числа в буквы (36 = .
)h
применяет предыдущие функции к целой и дробной части числа.источник
Аксиома, 566 байт
это был особенно сложный вопрос; после некоторого времени в записи чего-то, правильные результаты, которые, кажется, генерируются с использованием одного макроса для сохранения цифр () ... это не слишком много для игры в гольф ... результаты:
настоящая цель - одна функция, которая преобразует в базу 2..36 каждого числа с плавающей точкой [с k: = digits ()] или каждого вычисленного числа в виде% pi или% e или деления двух чисел с плавающей точкой / int, как в 1./3 , ['оо' цифры]
источник
Аксиома, 127 байт
Результаты
У него есть небольшая проблема для окончательного нулевого примера
Вернет «4,5», а не «4,50000»
источник