Вызов
Напишите функцию или программу, которая принимает положительное десятичное число, назовите его A и выведите два положительных числа, B и C , так, чтобы:
- A == B bitxor C
- B и C не должны содержать ни одной из цифр 0, 3 или 7 в своем десятичном представлении.
Примеры
>>> decompose(3)
1, 2
>>> decompose(7)
1, 6
>>> decompose(718)
121, 695
>>> decompose(99997)
2, 99999
>>> decompose(4294967296)
4294968218, 922
>>> decompose(5296080632396965608312971217160142474083606142654386510789497504098664630388377556711796340247136376)
6291484486961499292662848846261496489294168969458648464915998254691295448225881546425551225669515922,
1191982455588299219648819556299554251659915414942295896926425126251962564256469862862114191986258666
Поскольку декомпозиция не уникальна, ваша функция / программа не должна выводить те же самые результаты, что и приведенные примеры.
Очень подробные правила
Материалы должны быть в виде полной функции или программы .
import
Заявления же засчитываются окончательный счет.Вы можете предположить, что вход A всегда содержит хотя бы цифру 0, 3 или 7.
Вы можете предположить, что разложение всегда существует.
Вы можете использовать BigInt, если они являются частью стандартных библиотек языка или могут быть установлены через менеджер пакетов языка de jure .
Функция должна быть быстрой. Для запуска на достаточно современном компьютере должно потребоваться не более 20 секунд при вводе 100-значного числа и не более 2 секунд при вводе 10-значного числа.
Функция / программа должна поддерживать ввод не менее 100 цифр .
- Если функция / программа может поддерживать только целые числа до N <100 цифр, штраф до + 10 × (100 / N - 1) байтов к окончательному счету будет уменьшен. Это должно поощрить игроков в гольф поддерживать более широкий диапазон чисел, даже если импорт может быть многословным.
Нет ограничений на представление входных / выходных данных, если они явно представлены в десятичном формате.
- Функция может вводить и выводить строки / BigInts, если встроенных целочисленных типов недостаточно.
- Входные данные могут поступать из параметра функции, аргумента командной строки или STDIN.
- Функция может вернуть результат или просто распечатать результат непосредственно в STDOUT.
- Однако переполнение со знаком на входах / выходах не допускается.
- Приблизительные ответы не допускаются, ввод / вывод должен быть точным.
счет
Это код-гольф . Самое короткое решение в байтах побеждает.
Существует штраф, если программа может поддерживать только цифры менее 100 цифр:
- 64-разрядные целые числа (19 цифр) = +42 байта
- 63-разрядные целые числа (18 цифр) = +45 байтов
- 53-разрядные целые числа (15 цифр) = +56 байт
- 31/32-битные целые числа (9 цифр) = +101 байт
Ответы:
CJam, 70 байт
Попробуйте онлайн.
Случайно выбирает целые числа, пока не найдет совпадение. Это едва соответствует 20-секундному пределу для 64-разрядных целых чисел (с использованием интерпретатора Java), поэтому я добавил 42 к фактическому количеству байтов.
Пример запуска
источник
Common Lisp,
240224183173169 байтCommon Lisp немного многословен для игры в гольф. Однако это позволяет разложить 100-значные числа менее чем за секунду и 200-значные целые числа менее чем за десять секунд, поэтому штрафы не требуются. Алгоритм является детерминированным.
Перевод строки между функциями предназначен только для типографских целей. Пробный запуск с эталонным вводом из 100 цифр:
В качестве бонуса я включаю версию кода, которая постепенно создает решение сверху вниз. Он может управлять 1000-значным числом менее чем за десять секунд, но не может соревноваться в гольфе из-за дополнительного кода.
источник
Python 2, 103 + 42 = 145 байт
Python изначально поддерживает bigints, но эта программа намного превышает 20 секунд для 100-значного числа. Однако он разлагает 64-разрядные целые числа примерно за 2 секунды.
источник
while
цикл, чтобы продолжать пробовать случайные значения - вы можете просто вызвать функцию снова. Без необходимости структуры управления, вы можете свернуть функции кlambda
и трехкомпонентной:from random import* d=lambda a,b=0:set(`b`+`a^b`)&set(\'037\')and d(a,randint(1,a))or(b,a^b)
. Хотя вам может быть лучше просто не использовать функцию.Python 3 (132 байта)
(Это просто для того, чтобы стимулировать лучшие решения. Это мое решение при решении исходной проблемы в фильме ASCII.)
Хотя поведение побитового xor в десятичной системе довольно сложное, есть одно важное наблюдение: изменение младших разрядов не повлияет на старшие . Поэтому мы можем работать сверху вниз: попытаться освободить верхние цифры от 0, 3, 7, а затем работать с следующей цифрой, пока не будет получено все число. Это позволяет нам работать за линейное время, после чего обработка тысячного числа может завершиться менее чем за 1 секунду. (Решение Common Lisp также использует ту же технику, которую я считаю.)
источник
997^8 == 1005
. Я думаю, что здесь есть ядро идеи, но это не очевидно.{1,2,4,5,6,8,9}
, некоторые из них не будут влиять на старшие цифры. (например997^2 == 999
). Внутреннийwhile
цикл делает исчерпание, чтобы найти выбор, который поддерживает старшие цифры действительными.