Рассмотрим естественную последовательность до 6 (не учитывая 1) :
2,3,4,5,6
Мы начинаем сканирование слева (в данном случае от 2), ищем число, делимое на 2 (здесь 4), а затем удаляем оба числа из списка (здесь 2 и 4), так что список уменьшается до:
3,5,6
Мы продолжаем тот же процесс, здесь самый левый - 3, поэтому мы ищем число, делимое на 3. 6 - это, несомненно, это число, и, таким образом, 3 и 6 удаляются,
5
Теперь дальнейший поиск невозможен. Таким образом, это становится списком ALONED номеров для n = 6.
ЗАДАЧА
- Если число n больше 1, выведите все соответствующие чисел.
ВХОД
2
6
15
20
22
ВЫХОД
2
5
8,9,11,12,13,15
11,12,13,15,17,19,20
12,13,15,17,19,20,21
ДАЙТЕ ДРУГОЙ РАБОТЫ НА ПРИМЕРЕ
Для n = 22
=>2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
=>3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 (remove 2 & 4)
=>5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 (remove 3 & 6)
=>7,8,9,11,12,13,14,15,16,17,18,19,20,21,22 (remove 5 & 10)
=>8,9,11,12,13,15,16,17,18,19,20,21,22 (remove 7 & 14)
=>9,11,12,13,15,17,18,19,20,21,22 (remove 8 & 16)
=>11,12,13,15,17,19,20,21,22 (remove 9 & 18)
=>12,13,15,17,19,20,21 (remove 11 & 22) (OUTPUT)
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Ответы:
05AB1E ,
22171514 байтовПопробуйте онлайн!
объяснение
источник
Python 2,
907973 байта-6 байт благодаря xnor
Принимает входной номер на стандартный ввод. Идео это!
объяснение
Мы строим начальный список из входного номера и сохраняем его в
L
. Затем выполните цикл, пока последнее число больше или равно 2 разам первого числа и удаляет 2 раза первое число из списка. Это всегда будет следующий номер делится наL[0]
.L=L[1:]
снимает и первый номер. Когда условие больше не выполняется, дальнейшее удаление невозможно, и список печатается.источник
range
уже приведен список.Python, 61 байт
Немного проще понять этот менее понятный код:
Это использует прямую характеристику aloned номера:
Почему это так? При выполнении процесса
n
, скажем, мы удаляем нечетное числоa
в нижней половине (1
доn/2
). Затем2*a
удаляется независимо от того, где он находится в списке. Итак,4*a
остается (если оно существовало). Но если он находится в нижней половине, процесс удаления дойдет до него и удалит оба4*a
и8*a
. Таким образом, мы видим , что верхняя половина номер получает удален , если это форма2*a
,8*a
... с нечетнымc
, но остается , если он имеет формуa
,4*a
,8*a
, ...Исключение составляет for
a=1
, который не запускается в списке и поэтому не удаляется. В результате цепочка удаления начинается сa=2
, и правило для степеней 2 переворачивается.В приведенном выше коде
(i&-i)**.5%1>0
проверяется,i
не хватает ли формыi = a * 2^b
сb
нечетным, с помощью бит-трюка для извлечения коэффициента наибольшей степени двух2^b = i&-i
, а затем проверяется, не является ли результат идеальным квадратом. Затем,i&~-i>0
это еще одна хитрость, чтобы проверить,i
не является ли идеальная степень 2-й. Эти условия затем xor'ed.Здесь есть еще несколько улучшений
Во- первых, мы переходим индекс диапазона 1 до укоротить до
range(n/2,n)
отrange(n/2+1,n+1)
, компенсируя путем замены всегоi
сi+1
(или~-i
).Является ли степень 2 числом, является степенью
4
(2 ^b
сb
четным), можно проверить с помощью2**c/3
нескольких больших значенийc
. Это потому, что2**c/3
имеет двоичное представление10101...101
с единицами в четных позициях битов. Использованиеc=2*n
достаточно. Чтобы свести на нет результат, когдаi
есть степень 2, мы делим пополам это число в этом случае,1
вместо этого помещая в нечетные позиции.источник
Groovy,
6558 байтИдея алгоритма от DSLoc , который заметил, что вам нужно только удалить двойники.
Вот разбивка:
источник
Perl,
53494544 байтаВключает +1 для
-n
Дайте номер ввода на STDIN:
aloned.pl
:Непосредственно проверка возможных номеров дольше:
Это проверяет все числа в верхней половине диапазона. Оставьте числа с четным числом 2 в качестве простых множителей, за исключением случаев, когда число является степенью 2, а затем нечетным (поскольку 1 исключено из исходного ряда). Однако этот метод должен хорошо работать для других языков.
источник
MATL , 18 байт
Заимствовал идею «умножить на 2» из ответа @ Emigna's 05AB1E .
Попробуйте онлайн!
объяснение
источник
Haskell,
71696256 байтПример использования:
q 22
->[12,13,15,17,19,20,21]
.Если есть кратное первое число
a
, то это2*a
. Сохранить,a
если2*a
его нет в списке, и добавить рекурсивный вызов с помощьюa
и2*a
удалить из списка.источник
Pyth - 19 байт
Будет определенно будет рефакторинга.
Тестовый пакет .
источник
Руби, 124
Сравнивая оценки с другими ответами, это, очевидно, неправильный подход:
Несколько умный бит здесь,
a[g[0]]=a[g[1]]=!g[1]
который устанавливает значения хэша в true / false по мере необходимости.источник
PHP, 98 байт
8 байтов сэкономить @Titus Спасибо
Если разрешена запятая, то ее можно сократить на 9 байт
(!$a?:print"$a,");
вместо(!$a?:print$x?",$a":$x=$a);
источник
$a
и$b
скобок? Злая!(!$a?:print"$a,")
->print$a?"$a,":""
. -2 байта для обеих версий, если вы используете подчеркивание в качестве разделителя.foreach(... as$v)
,$v-2
вместо$k
и$v*2-2
вместо$k*2+2
.$a=&$r[$k]&&$b=&$r[$k*2+2]
работает как$a=$r[$k]and$b=$r[$k*2+2]
. Прошу прощения за то, что не нашел ни одной страницы, которая объясняет комбинации со ссылками и&&
оператором. Но мне нужны ссылки, а не задания. Я не уверен, разрешается ли использовать запятую или другой разделитель.&
побитово, и ссылки имеют более высокий приоритет, чем&&
операторJavascript, 149 байт
Вот рабочий пример. Весь HTML и функция wrapper () просто интерактивны.
Показать фрагмент кода
Этот фрагмент кода без символов содержит некоторые комментарии и позволяет в интерактивном режиме видеть шаги для любого заданного ввода.
Показать фрагмент кода
источник
JavaScript (ES6), 92 байта
Я думал, что опубликовал это вчера, но, очевидно, нет ...
Вот другая версия:
источник
Java 7, 210 байт
Определенно можно играть в гольф, используя другой подход, возможно, используя массив с некоторыми хитростями. Из-за приведений, прерываний, типизированных списков и проверок if это немного длиннее, чем ожидалось, но это работает.
Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
Ракетка 191 байт
Ungolfed (комментарии после ';'):
Тестирование:
Выход:
источник