Последовательности
Вам даны четыре числовые последовательности, пронумерованные до 1
конца 4
.
OEIS Местоположение
0
's, когда натуральные числа перечислены в двоичном виде. Вот пример того, как рассчитать последовательность:0,1,10,11,100,101,110,111 ^ ^ ^^ ^ ^ 0 3 78 10 14
Начало последовательности выглядит так:
0, 3, 7, 8, 10, 14, 19, 20, 21, 23, 24, 27, 29, 31, 36, 37, 40, 45, 51, ...
OEIS Эта последовательность включает в себя первое натуральное число, пропускает следующие два, затем включает следующие три, затем пропускает следующие четыре и продолжает.
0, 3, 4, 5, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25, 26, 27, 36, ...
OEIS Положительные целые числа, где как число
0
's, так и число1
' s в двоичном представлении числа являются степенями2
.2, 4, 5, 6, 9, 10, 12, 16, 23, 27, 29, 30, 33, 34, 36, 39,
OEIS Q последовательность Хофштадтера .
а (1) = а (2) = 1;
a (n) = a (na (n-1)) + a (na (n-2)) для n> 2.1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 6, 8, 8, 8, 10, 9, 10, 11, 11, 12, 12, 12, 12, 16, 14, ...
Мало что строго доказано об этой последовательности, но существует много эмпирических результатов. Один из них особенно важен, и вы можете предположить, что он действителен для всей серии:
В этой статье отмечается, что элементы ряда могут быть сгруппированы в поколения. Если мы нумеруем их, начиная с 1, то k- е поколение содержит ровно 2 k элементов. Соответствующим свойством является то, что все числа в поколении k получаются суммированием двух чисел из поколений k-1. и / или k-2 , но никогда из предыдущих поколений. Вы можете использовать это (и только это) наблюдение, чтобы установить нижнюю границу для оставшихся элементов в последовательности.
Вызов
Ваша задача - напечатать первые x
числа на пересечении заданных входных последовательностей.
Ввод: два числа, разделенные пробелом STDIN
. Первое число представляет собой целое число от 1
до 15
включительно, где каждый бит соответствует последовательности. Самый младший бит соответствует последовательности 1
, а самый старший - последовательности 4
. Второе количество цифр,x
, на которое нужно вывести STDIN
.
Выход: первые x
числа, которые пересекаются с заданными входными последовательностями. Распечатать цифры наSTDOUT
с любым свободным пробелом или пунктуацией в качестве разделителя (пробелы, символы табуляции, новые строки, запятые, двоеточия, точки и т. Д.).
Примеры
1. Напечатайте первые 3
числа в каждой последовательности.
Входные данные: 15 3
Вывод: 10,23,40
2. Напечатайте первые 12
числа в порядковом номере1
и 4
.
Входные данные: 9 12
Вывод: 3,8,10,14,19,20,21,23,24,31,37,40
3. Распечатайте первый10
числа в последовательности 2
.
Входные данные: 2 10
Вывод: 0,3,4,5,10,11,12,13,14,21
4. Напечатайте первые 6
числа в последовательностях 3
и4
.
Входные данные: 12 6
Вывод: 2,4,5,6,9,10
подробности
- Вы можете распечатать вывод на ходу или все сразу в конце.
Огромное спасибо всем, кто помог с этим в чате! Этот вопрос получил большую выгоду от того, чтобы быть в песочнице .
источник
12 5
примере до одного и того же индекса, то10
действительно ли это будет раньше9
на пересечении ... например, как бы вы, просматривая последовательности, решили, пропустить ли вход9
№3 как возможное пересечение? Например, если бы в нем было № 3,7
вам нужно было бы пропустить его, так как этого нет в № 4x
?Ответы:
Хаскелл,
495442402Работает достаточно хорошо. Вот пара примеров OP:
источник
Python 3,
590639 символовЭто простое решение: используйте генераторы для определения каждой из бесконечных последовательностей, и, пока пересечение недостаточно велико, добавьте шаг к каждой последовательности.
Чтобы учесть немонотонно увеличивающуюся последовательность Хофштадтера: на каждом шаге я генерирую вдвое больше для этой последовательности, например, 1, затем 2, 4, 8, 16, 32 и т. Д. Я думаю, что удовлетворяет границе, указанной в вопросе и это все еще достаточно быстро для всех тестовых случаев, представленных там.
источник
from itertools import count as C
->from itertools import*
C=count
,def s(i):return D(i)==1
->s=lambda i:D(i)==1
(я даже не думаю, что эта функция делает его короче ...),"{0:04b}".format(int(L)))if U>'0'
->"{0:04b}".format(int(L)))if'0'<U
С # 1923
Это, вероятно, не самая короткая программа, но я нашел задачу интересной, так что вот мое решение.
Выполнение всех 4 с 35 номерами (15 35) занимает около 5 секунд.
Вы можете проверить это здесь , но обратите внимание, что если вы хотите OEIS4, количество цифр, которое вы хотите, должно быть маленьким, или netfiddle исчерпает память.
Golfed
Удобочитаемый
объяснение
Это использует ленивую оценку, что делает ее претенциозно быстрой, я верю. Также мне было лениво делать какие-либо «битлогические», используя метод Convert.ToString (число, 2). Это превращает любое число в его представление binray в виде строки.
Мне пришлось написать свой собственный метод для пересечения последовательностей, так как пересечение Linq-Method вычисляет пересечение полной последовательности, и это было буквально невозможно.
источник