Пожалуйста, извините за заголовок.
Этот вопрос вдохновлен «Любопытной собственностью» 82000 . В нем автор указывает, что число 82000 является двоичным в основаниях 2, 3, 4 и 5. В этом посте возникает вопрос «есть ли число двоичное в основаниях 2, 3, 4, 5 и 6?» «? (Для любопытных я проверил значения до 10 ^ 1 000 000, и пока ответ - нет.)
Это заставило меня задуматься: учитывая число, на каких основаниях оно является двоичным?
Наше любопытное число 82000 на самом деле является двоичным по шести базам:
Base 2 = 10100000001010000
Base 3 = 11011111001
Base 4 = 110001100
Base 5 = 10111000
Base 81999 = 11
Base 82000 = 10
Не все числа будут иметь двоичные базы, которые являются последовательными. Рассмотрим число 83521. Это двоичное в базах 2, 17, 289, 83520 и 83521.
Ваша задача состоит в том, чтобы определить и отобразить, в каких основаниях число является двоичным.
правила
- Число считается «двоичным» в данной базе, если его представление в этой базе состоит только из нулей и единиц.
110110
это двоичное значение, а12345
нет,A380F
это определенно нет. - Ваш номер будет указан на стандартном вводе. Это будет целочисленное значение от 2 до 2 ^ 32-1 включительно и будет предоставлено в формате base-10.
- В порядке возрастания отобразите каждую базу больше единицы, в которой число является двоичным. Каждая база должна находиться в отдельной строке. Если вы включили двоичное значение в эту базу (см. Оценку бонусов ниже), разделите базу и двоичное значение пробелом. Будет оцениваться только вывод на стандартный выход, стандартная ошибка и другие источники будут игнорироваться.
счет
Ваша оценка - это размер вашей программы в байтах. Чем ниже оценка, тем лучше.
Бонус :
если ваша программа также выводит двоичные значения в найденных базах, умножьте ваш счет на 0,75
вашего отображаемого двоичного значения не должно быть лишних знаков препинания, никаких посторонних нулей, никаких десятичных точек, только нули и единицы.
Примеры
Входные данные:
82000
Вывод (получает бонус):
2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10
Входные данные:
1234321
Выход (без бонуса):
2
1111
1234320
1234321
источник
n
всегда по крайней мере бинарная в базах1
(не учитывается),2
,n-1
, иn
.[1, 0, 1, 1, 0]
бы хорошо, или числа должны быть объединены как10110
?Ответы:
Pyth,
1413Спасибо Jakube за указание на новую
S
функцию.Попробуй это здесь.
Интернет-версия слишком медленная, чтобы сделать
1234321
. Это просто преобразует входные данные для каждой базы из 2 в себя и отбрасывает результаты, которые содержат значения, отличные от 0 и 1.Объяснение:
Кроме того, это бонусная версия (
не очень хорошо играемая вгольф, опять же благодаря Jakube) (20 * .75 = 15):Попробуй здесь
источник
VQI!-JjQK+2NU2pdKjkJ
иногда функциональное программирование не лучший подход.Юлия,
7270 байтЭто на самом деле больше с бонусом, поэтому здесь нет бонуса.
Это читает строку из STDIN, преобразует ее в целое число и печатает результат. Несмотря на то, что метод «грубой силы», ввод 1234321 занял у меня менее 1 секунды.
Ungolfed + объяснение:
Примеры:
ПРИМЕЧАНИЕ . Если входные данные могут быть приняты в качестве аргумента функции, а не из STDIN (в ожидании подтверждения от OP), решение имеет 55 байтов.
источник
CJam, 20 байтов (или 27 байтов * 0,75 = 20,25)
Вот версия без бонуса, 20 байт:
Попробуйте это здесь.
Просто для удовольствия, вот бонусная версия, 27 байт:
Попробуйте онлайн здесь
источник
ri_,f{2+S@2$bN}4/{2=2,-!},
(19,5 байт)Mathematica, 59 байт
Тьфу ...
IntegerDigits
D:На самом деле не так много объяснений по поводу кода ... 12 байтов тратятся впустую из-за необходимости использовать STDIN и STDOUT.
Я не думаю, что могу претендовать на бонус. Лучшее, что у меня есть, это 84 байта (что дает оценку более 60):
источник
Питон 2,
88 8680Довольно просто, без бонусов. Python хорош и мягок с глобальными переменными.
Лучшее, что мне удалось получить за этот бонус - 118 * .75 = 87.75 :
источник
g(N)
вместоn=N
.g(N,b)
так, что запятая делала два одинаковых), но что ты имеешь в виду, мне не нужна переменная для N?g(n/b)
на «(g(n/b)+'n%b')
где» означает обратный удар?Python 2, 90 * 0,75 = 67,5
Довольно простой итеративный подход.
Без бонуса это 73 байта:
источник
SQL (PostgreSQL),
247,5255230,25 (307 * .75)Поскольку известно, что SQL прекрасно справляется с подобными задачами, я подумал, что лучше собрать его вместе :) Бонус действительно стоил этого.
Это должно соответствовать спецификации, но у меня нет простого способа проверить COPY I FROM STDIN .
Редактировать Фиксированный заказ. Изменен способ обработки столбца R для использования массива.
В качестве теста я просто использовал прямые вставки в
I
таблицу. Тестовый прогон расширен и прокомментирован.источник
order by
. Теперь, чтобы посмотреть, смогу ли я вернуть этих персонажейHaskell 109 * 0,75 = 81,75 байт
Пример использования (примечание: двоичные значения сначала lsb):
Без ограничений ввода / вывода, т.е. ввод через аргумент функции, вывод в собственном формате через REPL):
Haskell, 67 * 0,75 = 50,25 байт
Возвращает список пар (база, значение). Сначала значения lsb, например (добавлены новые строки / пробелы для лучшего отображения):
источник
R 111
Вероятно, есть много возможностей для улучшения этого на данный момент
Работает с предупреждениями
источник
I%/%b
к логическомуany()
условию. `Java,
181155,25 (207 * 0,75)151,5 (202 * .75) байтовДополнено объяснением:
Оригинал (без бонуса):
3,75 байта благодаря Ypnypn :)
источник
R
948379Использование:
Суть функции заключается в том,
!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})
что для каждого основания x от 2 до n сохраняется частное n / x до тех пор, пока остаток равен 0 и 1. Затем выводится результат (который равен 0, если все остатки равны 1 или 0) и отрицает его (0 отрицает ИСТИНА, все остальное отрицает ЛОЖЬ). Благодаря области действия функции нет необходимости создавать фиктивную переменную для n. Полученный вектор логических значений затем используется для индексации2:n
и, следовательно, выводит только те базы, для которых он работал.источник
TI-Basic, 45 байт
объяснение
Сложная часть
Вторая строка работает следующим образом:
Заметка
Программа работает значительно быстрее, если закрывающая скобка
)
ставится в конце второй строки. Смотрите здесь для получения дополнительной информации об этом.источник
TI-BASIC,
3129Это, вероятно, оптимально для TI-BASIC.
Объяснение:
randIntNoRep(1,32)
возвращает случайную перестановку чисел от 1 до 32 (все, что нам нужно, это числа в некотором порядке; в TI-BASIC нет ничего похожего на команду iota APL). 32 элемента достаточно, потому что наименьшее возможное основание - 2, а наибольшее - 2 ^ 32-1.B^randIntNoRep(1,31)
возводит этот список в степень Bth, что приводит к списку, содержащему всеB^1,B^2,...,B^32
(в некотором порядке).Затем вход (в
Ans
переменной wer, которая вводится в форму[number]:[program name]
) делится на это число. Если вы введете 42, а база равна 2, результатом будет список21,10.5,5.25,...,42/32,42/64,[lots of numbers less than 1/2]
, опять же в некотором порядке.Взяв дробную часть и умножив число на вашу базу, вы получите цифру в этой позиции в представлении base-b. Если все цифры меньше 2, то наибольшая цифра будет меньше 2.
Как заявил Ypnypn, закрывающая скобка на
For
операторе ускоряет это из-за ошибки синтаксического анализатора.31-> 31: Сохранен байт, но исправлены ошибки округления, которые снова добавили байт.
31-> 29: сохранил два байта, используя
RandIntNoRep()
вместоcumSum(binomcdf())
.источник
seq(expression, variable, start, end[, step])
. Если шаг не указан, по умолчанию используется значение 1. ОднакоcumSum(binomcdf(31,0
это 8 байтов, тогдаseq(X,X,1,32
как 9 байтов.Желе , 9 байт
Попробуйте онлайн!
Совершено рядом с Кайрдом в чате .
Как это работает
источник
Javascript, ES6,
118 * .75 = 88,5,110 * .75 = 82,5Предыдущая версия:
Проверьте:
источник
JavaScript ( ES6 ) 65
68 байт для функции с параметром и вывода на консоль.
65 байтов с вводом / выводом через всплывающее окно
Требование бонуса: 88 * 0,75 => 66
источник
Mathematica, 76 * 0,75 = 57
Изначально забыл про входные требования ... К счастью, они не добавили слишком много лишних.
источник
Рубин , 44 байта
Попробуйте онлайн!
источник
Perl 5 , 63 байта
Попробуйте онлайн!
Никакого бонуса по этому поводу, потому что он выиграл немного лучше, чем моя версия с бонусом:
Perl 5 , 85 байт * 0,75 = 63,75
Попробуйте онлайн!
источник