Створіть універсальну цілу послідовність


22

Визначення

Назвемо (нескінченну) цілу послідовність універсальною, якщо вона містить кожну кінцеву цілу послідовність у вигляді суміжного підряд.

Іншими словами, ціла послідовність (a 1 , 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 , 2 ,…) та реалізуйте її на мові програмування на ваш вибір, дотримуючись наступних правил.

  • Ви можете подати повну програму або функцію.

  • У вас є три варіанти вводу / виводу:

    1. Не приймайте жодних даних і не друкуйте та не повертайте всю послідовність.

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

    3. Візьміть індекс n як вхід і надрукуйте або поверніть (a 1 ,…, a n ) .

  • Для варіантів 2 і 3 вводу / виводу , ви можете використовувати індексацію на основі 0, якщо хочете.

  • Подання має бути детермінованим: якщо запускати кілька разів з одним і тим же входом, воно повинно створювати один і той же результат.

До того ж, якщо це не очевидно відразу, доведіть, що вибрана вами послідовність є універсальною. Ваш доказ може не залежати від недоведених домислів.

Діють стандартні правила . Нехай виграє найкоротший код у байтах!


Ваш доказ може не залежати від недоведених домислів. Я подумав, що це мається на увазі: p
Ерік Вихідник

і як би ви зберегли список номерів у числі?
RosLuP

Відповіді:


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працює. (Я думаю, що я це отримав, але не впевнений.)
Денніс

@Dennis виявляється, що я хотів , ні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)повертає лише n . Для вилучення однієї з вищих цифр використовується найменша цифра nбази d.

Спробуйте в Інтернеті! Цей сценарій (люб’язно Денніс) приймає будь-яку обмежену послідовність і дає тобі місце, 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

Брахілог 2, 11 байт

≜~×-₂ᵐ~ȧᵐ≜∋

Спробуйте в Інтернеті!

Я також спробував алгоритм, використовуючи додаткові розділи у списку, але він не був коротшим. Це генератор, який видає нескінченний потік цілих чисел як вихід; посилання TIO має заголовок, щоб надрукувати перші десять тисяч з них.

Пояснення

Програма запускається шляхом випробування всіх можливих цілих чисел послідовно намагається всі інші можливості, для цілих чисел за замовчуванням). Це 0, 1, -1, 2, -2 тощо (хоча від'ємні цілі числа не доходять до кінця програми). Це єдиний "нескінченний" крок програми; всі інші - кінцеві.

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

Потім нам потрібно зіставити набір цих послідовностей на множину всіх цілих послідовностей, що робиться в два етапи: віднімання 2 ( -₂) від кожного елемента ( ), надання нам набору всіх негативних цілих послідовностей, а потім взяття плюс або мінус ( тобто "значення, абсолютне значення якого") кожного елемента (). Останній крок, очевидно, недетермінований, тому Брахілог розглядає його як генератор, генеруючи всі можливі списки, елементи яких є плюс-мінус відповідний елемент вхідного списку. Це означає, що зараз у нас є генератор для всіх можливих цілих послідовностей, і він генерує їх у порядку, що означає, що вони всі генеруються (зокрема, порядок, який ви отримуєте, якщо взяти абсолютне значення кожного елемента, додайте 2 до кожного елемент, а потім упорядкуйте по добутку отриманих елементів).

На жаль, питання хоче однієї послідовності, а не послідовності послідовностей, тому нам потрібні ще дві команди. По-перше, просить Брахілог чітко генерувати послідовність послідовностей строго (на відміну від створення структури даних, що описує концепцію послідовності, згенерованої за допомогою цього методу, а не фактично генерувати послідовності до необхідності); це одночасно робить програму швидшою у цьому випадку та забезпечує отримання результатів у запитуваному порядку. Нарешті, змушує генератор виводити елементи окремих послідовностей одна за одною (переходить до наступної послідовності, як тільки виводить усі елементи попередньої).

Кінцевий результат: кожна можлива ціла послідовність отримує генерування та вихід, по одному елементу, і всі об'єднуються разом у одну універсальну послідовність.


ais523 ... це ти!
Фаталізувати

Якщо це не вони, це пекло збіг обставин, якщо публікації зі видаленого облікового запису показують однаковий номер облікового запису.
повністюлюдський


4

Python 2 , 100 99 байт

  • Збережено один байт завдяки овам ; ітерація над 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.