Тестування на допустимі послідовності


13

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

Що таке "допустима" послідовність?

З огляду на ціле число m ≥ 2, класи залишків за модулем m є лише можливими арифметичними прогресіями загальної різниці m. Наприклад, коли m = 4, 4 класи залишків за модулем 4 є

..., -8, -4, 0, 4, 8, 12, ...
..., -7, -3, 1, 5, 9, 13, ...
..., -6, -2, 2, 6, 10, 14, ...
..., -5, -1, 3, 7, 11, 15, ...

Клас залишку kth складається з усіх цілих чисел, залишок яких при діленні на m дорівнює k. (доки правильно визначається "залишок" для від'ємних цілих чисел)

Послідовність цілих чисел a1, a2, ..., ak допустима за модулем m, якщо вона не перетинає хоча б один із класів залишків. Наприклад, {0, 1, 2, 3} і {-4, 5, 14, 23} є НЕ допустимими по модулю 4, а {0, 1, 2, 4} і {0, 1, 5, 9} і {0, 1, 2, -3} є допустимими по модулю 4. Крім того , {0, 1, 2, 3, 4} є НЕ допустимим по модулю 4, а {0, 1, 2} є допустимим по модулю 4.

Нарешті, послідовність цілих чисел просто допустима, якщо допустима модуль m для кожного цілого числа m ≥ 2.

Змагання

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

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

Звичайне підрахунок : виграє найкоротша відповідь у байтах.

Зразок введення

Наступні вхідні послідовності повинні давати значення Truthy:

0 2
-1 1
-100 -200
0 2 6
0 2 6 8
0 2 6 8 12
0 4 6 10 12
-60 0 60 120 180
0 2 6 8 12 26
11 13 17 19 23 29 31
-11 -13 -17 -19 -23 -29 -31

Наступні вхідні послідовності повинні давати значення Falsy:

0 1
-1 4
-100 -201
0 2 4
0 2 6 10
0 2 6 8 14
7 11 13 17 19 23 29
-60 0 60 120 180 240 300

Поради

  • Зауважимо, що будь-яка послідовність із 3 чи менших цілих чисел автоматично допустима за модулем 4. Більш загально, послідовність довжини k автоматично допустима за модулем m, коли m> k. Звідси випливає, що перевірка допустимості дійсно вимагає лише перевірки кінцевої кількості m.
  • Зауважимо також, що 2 ділить 4, і що будь-яка послідовність, яка є допустимою за модулем 2 (тобто, парне або все непарне), є автоматично допустимим модулем 4. Більш загально, якщо m ділить n і послідовність є допустимою модулем m, то це автоматично допустимий модуль n. Щоб перевірити прийнятність, тому достатньо врахувати лише головне, якщо бажаєте.
  • Якщо a1, a2, ..., ak - допустима послідовність, тоді a1 + c, a2 + c, ..., ak + c також допустима для будь-якого цілого числа c (додатного або від'ємного).

Математична відповідність (необов'язкове читання)

Нехай a1, a2, ..., ak - послідовність цілих чисел. Припустимо, що існує нескінченно багато цілих чисел n таких, що n + a1, n + a2, ..., n + ak всі просто. Тоді легко показати, що a1, a2, ..., ak повинні бути допустимими. Справді, припустимо, що a1, a2, ..., ak неприпустимо, і нехай m є числом таким, що a1, a2, ..., ak неприпустимо за модулем m. Тоді незалежно від того, яке n ми обираємо, одне з чисел n + a1, n + a2, ..., n + ak повинно бути кратним m, отже, не може бути простим.

Прем'єр к-кортежі гіпотеза є зворотним твердженням, яке до сих пір широко відкритою проблема в теорії чисел: він стверджує , що якщо а1, а2, ..., ак допустимої послідовність (або до-кортеж ), тобто повинно бути нескінченно багато цілих чисел n таких, що n + a1, n + a2, ..., n + ak є простими. Наприклад, допустима послідовність 0, 2 дає твердження, що повинно бути нескінченно багато цілих чисел n таких, щоб і n, і n + 2 були простими, це гіпотеза про близнюки-блискавки (досі не підтверджені).


3
[_60:0:60:120:180]дарує мені правду; на самому ділі це не перетинаються принаймні один клас в кожному mз 2до 5включно; крім того, вона перетинає тільки один клас в кожному mз 2до 5включно.
Leaky Nun

1
У мене те саме для [-60, 0, 60, 120, 180], як і @LeakyNun, це має бути допустимим.
Карл Напф

-60 0 60 120 180 240 300перетинає кожен клас залишків за модулем 7, тому це недопустимо.
Грег Мартін

Чи могли б ми мати довші тест-шафи?
Leaky Nun

@LeakyNun: Для будь-якого m перші m простих чисел, більші за m, утворюють допустиму послідовність. (Другий за останнім тест Truthy є прикладом цього з m = 7.) Тестові випадки Falsy можна створити, починаючи з цілих чисел 1, ..., m, вибираючи k ≤ m і додаючи випадкові кратні k до будь-якого або всіх вихідних цілих чисел 1, ..., m.
Грег Мартін

Відповіді:



7

Брахілог , 25 24 19 байт

5 байт завдяки Карлу Напфу.

lybb '(eM-yA,?: [M] z:% aodA) 
l: 2' (eM-yA,?: [M] z:% aodA)
l: 2 '(eMg:? rz:% adlM)

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

Перевірте всі тести!

l:2'(eMg:?rz:%adlM)
l:2                  Temp = [2:length(input)]
   '(             )  true if the following cannot be proven:
     eM                  M is an element of the interval
                         indicated by Temp, i.e. from 2
                         to the length of input inclusive,
       g:?rz:%adlM       every element of input modulo M
                         de-duplicated has length M.

4

Пітон, 61 60 байт

q=lambda l,d=2:d>len(l)or q(l,d+1)&(len({v%d for v in l})<d)

Усі тестові справи на ideone

Редагувати: замінено логічним та бітовим & зберегти один байт


2

JavaScript (ES6), 59 байт

a=>a.every((_,i)=>!i++|new Set(a.map(e=>(e%i+i)%i)).size<i)

Використовує трюк набору залишків на використання @ KarlNapf.


1
Ну, це не фокус, просто математика ;-)
Карл Напф

2

Пітон, 67 64 байт

Як неназвана лямбда:

lambda N:all(len({i%m for i in N})<m for m in range(2,len(N)+1))
  • Edit1: замінено set()на{}
  • Edit2: не потрібні квадратні дужки навколо генератора в all(...)
  • Edit3: Як вказував Джонатан Аллан, rangeнеобхідно піднятисяlen(N)+1

Старий код як функція (96 байт):

def f(N):
 for m in range(2,len(N)+1):
    if len(set(i%m for i in N))==m:return False
 return True

1
Цим я надаю вам кредити за ваш підхід, який врятував мені 5 байт.
Leaky Nun

@LeakyNun Вітаємо вас!
Карл Напф


2

MATL , 11 байт

"X@QGy\un>v

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

Спробуйте в Інтернеті! Або перевірити всі тестові випадки: truthy , falsy (злегка змінений код, кожен випадок створює горизонтальний вектор для ясності).

Пояснення

"       % Take input array. For each; i.e. repeat n times, where n is arrray size
  X@Q   %   Push iteration index plus 1, say k. So k is 2 in the first iteration,
        %   3 in the second, ... n+1 in the last. Actually we only need 2, ..., n;
        %   but the final n+1 doesn't hurt
  G     %   Push input again
  y     %   Duplicate k onto the top of the stack
  \     %   Modulo. Gives vector of remainders of input when divided by k
  un    %   Number of distinct elements
  >     %   True if that number is smaller than k
  v     %   Vertically concatenate with previous results
        % End for each. Implicitly display 

Я все ще орієнтуюся на цьому веб-сайті, тому вибачте, якщо це питання, що задається добре, але: я думаю, що значення truthy / falesy мають бути фактичними константами, а не такими шаблонами, як "масив, що містить принаймні один нуль ". Чи не повинен один обробляти масив (використовуючи побітові І в цьому випадку), щоб у кінцевому підсумку отримати константи?
Грег Мартін

@GregMartin Це дуже гарне питання. Ми маємо досить міцний консенсус щодо його відповіді; дивіться тут
Луїс Мендо

1
Зрозумів, і тепер я бачу сенс вашого першого посилання. Дякую за пояснення!
Грег Мартін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.