Введение
В этой задаче мы будем иметь дело с определенным порядком положительных целых чисел. Порядок выглядит так:
3, 5, 7, 9, 11, ...
2*3, 2*5, 2*7, 2*9, 2*11, ...
4*3, 4*5, 4*7, 4*9, 4*11, ...
8*3, 8*5, 8*7, 8*9, 8*11, ...
16*3, 16*5, 16*7, 16*9, 16*11, ...
...
... 64, 32, 16, 8, 4, 2, 1
Сначала мы перечислим все нечетные целые числа больше 1 в порядке возрастания. Затем мы перечислим два нечетных целых числа, больше 1, затем 4 раза, затем 8 раз и т. Д.: Для всех k мы перечислим 2 k нечетных чисел больше 1 в порядке возрастания. Наконец, мы перечисляем степени двойки в порядке убывания, заканчивающемся на 1. Каждое положительное целое число встречается в этом «списке» ровно один раз.
Более подробно рассмотрим два различных положительных целых числа A = n · 2 p и B = m · 2 q , где n, m ≥ 1 нечетные, а p, q ≥ 0 . Тогда A предшествует B в порядке, если выполняется одно из следующих условий:
- n> 1 , m> 1 и p <q
- 1 <n <m и p = q
- n> m = 1
- n = m = 1 и p> q
Это упорядочение появляется в удивительном математическом результате, известном как теорема Шарковского , которая касается периодических точек динамических систем. Я не буду вдаваться в подробности здесь.
Задание
Ваша задача в этой задаче - вычислить вышеуказанный порядок. Ваши входные данные - это два натуральных числа A и B , которые могут быть равны. Ваш вывод является истинным значением, если A предшествует B в порядке, и ложным значением в противном случае. Если A = B , ваш вывод должен быть правдивым. Вы можете взять A и B в любом порядке, если вы последовательны.
Вам не нужно беспокоиться о целочисленном переполнении, но ваш алгоритм теоретически должен работать для произвольно больших входных данных.
Контрольные примеры
Правдивые случаи
3 11
9 6
48 112
49 112
158 158
36 24
14 28
144 32
32 32
32 8
3 1
1 1
Ложные случаи
1 2
1 5
11 5
20 25
2 8
256 255
256 257
72 52
2176 1216
2176 2496
a&1|~b&1&f(a/2,b/2)
работать?b<2
что в конечном итоге это будет правдой Теперь другая проблема заключается в том, что вы будете обрабатывать больше итераций, чем необходимо, и получать значения с плавающей запятой. Но я не могу найти какой-либо контрпример, который не работал бы, как ожидалось.b<2
изначально не пользовался , но думаю, теперь это сработает.f(a/2,b/2)
только возвращается0
,1
,false
илиtrue
, я даже не нужен&1
.Python 2, 50 байт
Каждое число сопоставляется с тройкой, сортированный порядок которой является желаемым порядком.
[-n][n&n-1:]
, которое обрабатывает степени 2 в конце. Побитовое «и»n&n-1
равно нулю именно тогда, когдаn
это степень2
. Если это так, мы получаем список[-n]
, а в противном случае пустой список[]
. Это помещает все степени 2 в конце порядка, в порядке убывания.n&-n
извлекает коэффициент степени 2n
.n
связывает равные степени 2 в пользу большего числа.Соответствующие кортежи передаются,
cmp
чтобы увидеть, если это сравнение<=0
. Python 3 сохранит байт с плавающим делением(n&n-1<1)/n
для первого значения в тройке, но ему не хватаетcmp
.источник
cmp(...)<=0
эквивалентноcmp(...)<1
?~
вместо них<1
Python 2,
8771 байтЭто, вероятно, не принесет никаких наград за размер, но этот ответ работает путем построения 3-кортежа с использованием 3 выражений из целого числа, которое при лексикографическом упорядочении приведет к правильному упорядочению.
В понятных терминах кортеж для A = n · 2 p :
источник
JavaScript (ES6),
7064 байтаВероятно, можно играть в гольф еще, но в качестве первой попытки:
Принимает ввод с синтаксисом карри
(x)(y)
. Возвращает0
/1
.Контрольные примеры
Показать фрагмент кода
источник
b>a||(b==a&&y>=x)
, не будет иметь никакого значения для исполнения.[1, 5]
, будут неверно определены как достоверные.Perl 6 ,
8984 байта( Попробуйте онлайн. )
Не совсем коротко, но я подумал, что было бы интересно написать решение, которое фактически генерирует последовательность упорядочения (с точностью до безопасной верхней границы для каждой подпоследовательности), а затем проверяет, какой вход появляется в нем первым.
Например:
Для ввода
... а затем наблюдает, что2, 3
он генерирует:3
появляется раньше2
.Для ввода
... а затем наблюдает, что9, 6
он генерирует:9
появляется раньше6
.Это может быть умнее и генерировать еще меньше последовательности, но это займет больше байтов кода.
источник
Python 2, 54 байта
Рекурсивное решение, похожее на решение Нейла.
источник
f(158,158)
Ложь иf(2,8)
Правда.f(1,5)
Ложь.f(1,5)
должно быть False, но код дает True.Mathematica, 65 байт
Безымянная функция, принимающая список натуральных чисел и возвращающая,
True
если список формирует восходящую последовательность в порядке Шарковского, вFalse
противном случае. (В частности, список ввода не должен содержать только два элемента - мы получаем дополнительную функциональность бесплатно.)Сердцем алгоритма является функция
{1,#}&/@#//.{a_,b_/;EvenQ@b}->{2a,b/2}
, которая многократно перемещает множители 2 для преобразования целого числа формыm*2^k
сm
нечетным в упорядоченную пару{2^k,m}
(и делает это для каждого элемента входного списка).OrderedQ
затем решает, отсортирован ли результирующий список упорядоченных пар; по умолчанию это означает возрастание порядка по первому элементу, а затем увеличение порядка по второму элементу.Это именно то, что мы хотим, за исключением того, что числа со степенью 2 следуют другим правилам. Поэтому перед проверкой с помощью
OrderingQ
мы применяем одно последнее правило/.{a_,1}->{∞,-a}
, которое преобразует (например){64,1}
в{∞,-64}
; это помещает полномочия 2 в правильное место в заказе.источник
APL (Dyalog Extended) , 27 байт
Попробуйте онлайн!
Молчаливая двоичная функция, левый аргумент которой
a
а правый естьb
.Подход почти идентичен решению xnor Python 2 в том, что мы конвертируем каждое число во вложенный массив и проводим лексикографическое сравнение между ними.
Часть 1. Преобразование числа во вложенный массив
Часть 2: Сравните два вложенных массива
Синтаксис dfn поддерживает условные операторы, например,
{a:x ⋄ b:y ⋄ z}
значениеif a then x else if b then y else z
, но в этом случае он слишком многословен, чтобы использовать его.источник
Haskell,
143138 байтВ основном относительно простая реализация критериев:
Попробуйте онлайн!
источник
Python,
159158153144142141 байтСохраненный 2 байта благодаря Kritixi Lithos!
В основном это просто практика игры в гольф на моем Питоне!
Использовал формулу, заданную ОП, а не способы всех более умных ответов
источник
(a, b)
второй строке, где вы можете убрать пробел между запятой иb
.05AB1E , 14 байтов
Попробуйте онлайн! или подтвердите все контрольные примеры .
источник