Создать универсальную целочисленную последовательность


22

Определение

Будем называть (бесконечную) целочисленную последовательность универсальной, если она содержит каждую конечную целочисленную последовательность как непрерывную подпоследовательность.

Другими словами, целочисленная последовательность (a 1 , a 2 ,…) универсальна тогда и только тогда, когда для каждой конечной целочисленной последовательности (b 1 ,…, b n ) существует смещение k, такое что (a k + 1) ,…, A k + n ) = (b 1 ,…, b n ) .

Например, последовательность положительных простых чисел не является универсальной, в том числе по следующим причинам.

  • Он не содержит отрицательных целых чисел, 1 или составных чисел.

  • Хотя он содержит 3 , он не содержит смежную подпоследовательность (3, 3, 3) .

  • Хотя он содержит 2 и 5 , он не содержит смежную подпоследовательность (2, 5) .

  • Хотя он содержит смежную подпоследовательность (7, 11, 13) , он не содержит смежную подпоследовательность (13, 11, 7) .

задача

Выберите любую единственную универсальную целочисленную последовательность (a 1 , a 2 ,…) и реализуйте ее на языке программирования по вашему выбору, соблюдая следующие правила.

  • Вы можете отправить полную программу или функцию.

  • У вас есть три варианта ввода / вывода:

    1. Не вводите и распечатайте или верните всю последовательность.

    2. Возьмем индекс п в качестве входных данных и печати или вернуться к п .

    3. Возьмите индекс n в качестве ввода и напечатайте или верните (a 1 ,…, a n ) .

  • Для вариантов ввода-вывода 2 и 3 вы можете использовать индексацию на основе 0, если хотите.

  • Ваше представление должно быть детерминированным: если запускаться несколько раз с одним и тем же вводом, он должен давать одинаковый вывод.

Кроме того, если это не очевидно сразу, пожалуйста, докажите, что выбранная вами последовательность является универсальной. Ваше доказательство может не зависеть от недоказанных догадок.

Применяются стандартные правила . Пусть победит самый короткий код в байтах!


Ваше доказательство может не зависеть от недоказанных догадок. Я думал, что это подразумевается: р
Эрик Outgolfer

а как бы вы сохранили список чисел в номере?
РосЛюП

Ответы:


13

Шелуха , 5 байт

Это печатает бесконечный список

ΣṖ…ݱ

Попробуйте онлайн! или найдите первый индекс вашей последовательности . (Занимает много памяти для большинства последовательностей)

Объяснение:

   ݱ   Infinite list [1,-1,2,-2,3,-3,4,-4,5,-5...]
  …     Rangify       [1,0,-1,0,1,2,1,0,-1,-2,...]
 Ṗ      Powerset
Σ       Concatenate

В шелухе ведет себя красиво для бесконечных списков. Вы можете увидеть это поведение здесь


Возможно, вы захотите уточнить, как это Qработает. (Я думаю, что получил, но я не уверен.)
Деннис

@ Денис оказывается, что я хотел , неQ
H.PWiz

9

Python 2 , 49 46 43 байта

def f(n):d=len(`n`);return n/d**(n%d)%d-d/2

f(n)возвращает п только. Это использует наименьшую цифру в базе, чтобы извлечь одну из старших цифр.nd

Попробуйте онлайн! Этот сценарий (любезно предоставленный Деннисом) принимает любую конечную последовательность и дает вам место, nгде начинается эта последовательность.

объяснение

n/d**(n%d)%d-d/2
     (n%d)         least significant digit of n
n/d**(   )%d       get n%d-th digit of n
            -d/2   offset to get negative values

Например, для nв диапазоне 3141592650до 3141592659, d=10и последней цифре nвыбирает одну из других цифр. Затем мы добавляем, -d/2чтобы получить отрицательные значения.

n%d:       0  1  2  3  4  5  6  7  8  9
f(n)+d/2:  0  5  6  2  9  5  1  4  1  3
f(n):     -5  0  1 -3  4  0 -4 -1 -4 -2

Автономная альтернатива, также 43 байта:

n=input();d=len(`n`);print n/d**(n%d)%d-d/2

Вы можете использовать len(`n`)вместо len(str(n)).
Деннис

Спасибо @Dennis. Я могу добавить больше объяснений, если кому-то это нужно.
JAPH

Я написал функцию, которая, учитывая конечную последовательность, находит смещение в вашей последовательности. Попробуйте онлайн!
Деннис

Это очень круто.
гистократ

Ницца. Единственное, что оно будет разбито вверх, n=2**63-1так как представление Lдобавляется ( str(n)будет адресовано это для трех байтов, если это необходимо).
Джонатан Аллан

5

Brachylog 2, 11 байт

≜~×-₂ᵐ~ȧᵐ≜∋

Попробуйте онлайн!

Я также попробовал алгоритм с использованием аддитивных разделов в списке, но он был не короче. Это генератор, который выдает бесконечный поток целых чисел в качестве выходных данных; ссылка TIO имеет заголовок для печати первых десяти тысяч из них.

объяснение

Программа запускается, пробуя все возможные целые числа в последовательности (пробуя все оставшиеся возможности, для целых чисел по умолчанию). Это 0, 1, -1, 2, -2 и т. Д. (Хотя отрицательные целые числа не достигают конца программы). Это единственный «бесконечный» шаг программы; все остальные конечны.

затем генерирует все возможные факторизации целого числа, рассматривая разные порядки как разные и используя только значения от 2 и выше (таким образом, существует только конечное число); обратите внимание, что составные числа допускаются при факторизации, а не только простые числа. Это означает, что все возможные последовательности целых чисел ≥ 2 будут сгенерированы этим шагом в некоторый момент выполнения функции (поскольку такая последовательность обязательно имеет некоторый продукт, и этот продукт будет сгенерирован в некоторой точке исходным кодом ).

Затем нам нужно отобразить набор этих последовательностей на набор всех целочисленных последовательностей, что делается в два этапа: вычитая 2 ( -₂) из каждого элемента ( ), давая нам набор всех неотрицательных целочисленных последовательностей, затем принимая плюс или минус ( т. е. «значение, абсолютное значение которого равно») каждый элемент (). Последний шаг явно недетерминирован, поэтому Brachylog рассматривает его как генератор, генерирующий все возможные списки, элементы которых плюс или минус соответствующий элемент входного списка. Это означает, что у нас теперь есть генератор для всех возможных целочисленных последовательностей, и он генерирует их в порядке, означающем, что они все сгенерированы (в частности, порядок, который вы получите, если вы берете абсолютное значение каждого элемента, добавьте 2 к каждому элемент, а затем упорядочить по произведению полученных элементов).

К сожалению, вопрос требует единственной последовательности, а не последовательности последовательностей, поэтому нам нужны еще две команды. Во-первых, просит Brachylog строго сгенерировать последовательность последовательностей в явном виде (в отличие от создания структуры данных, описывающей концепцию последовательности, сгенерированной с помощью этого метода, а не фактической генерации последовательностей до тех пор, пока это не потребуется); в обоих случаях это ускоряет работу программы и гарантирует, что вывод будет произведен в запрошенном порядке. Наконец, заставляет генератор выводить элементы отдельных последовательностей по одному (переходя к следующей последовательности, как только он выводит все элементы предыдущей).

Конечный результат: каждая возможная целочисленная последовательность генерируется и выводится по одному элементу за раз, и все объединяются в одну универсальную последовательность.


ais523… это ты?
Роковая

Если это не они, это чертовское совпадение, учитывая, что сообщения из их удаленного аккаунта показывают один и тот же номер аккаунта.
полностью человек


4

Python 2 , 100 99 байт

  • Сохранено один байт благодаря ovs ; перебирая itertoolsвстроенный в бесконечный цикл.
from itertools import*
for n in count():
 for P in permutations(range(-n,n)*n):
	for p in P:print p

Попробуйте онлайн!

Неограниченно печатает все перестановки nмногократного целочисленного диапазона [-n; n)для всех неотрицательных целых чисел n.
Вы можете искать первое смещение kдля любой подпоследовательности, используя эту модифицированную версию .


while~0:, Хе-хе ...
Час Браун

99 байт , используяitertools.count
овс

@ovs Спасибо; не знал о том, встроенный.
Джонатан Фрех

2

Perl 6 , 91 байт

loop (my$i=1;;$i++){my@n=(-$i..$i);my@m=@n;loop (my$k=1;$k <$i;$k++){@m=@m X@n;};print @m;}

Попробуйте онлайн!

Это использует метод, аналогичный другим ответам. Он использует декартовы произведения для печати элементов (-1,0,1), затем всех упорядоченных пар элементов (-2,-1,0,1,2), затем всех упорядоченных триплетов элементов в (-3,-2,-1,0,1,2,3)и т. Д.

Я новичок в Perl, так что, возможно, будет больше игры в гольф.

Более читаемая версия:

loop (my $i = 1; ; $i++) {
  my @n = (-$i..$i);
  my @m = @n;
  loop (my $k=1; $k <$i; $k++) {
    @m = @m X @n;
  }
  print @m;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.