Тестирование на допустимые последовательности


13

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

Что такое «допустимая» последовательность?

Для целого числа m ≥ 2 классы вычетов по модулю m являются просто 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, ...

Класс k-го остатка состоит из всех целых чисел, остаток которых при делении на 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).

Обычный выигрыш: самый короткий ответ, в байтах, выигрывает.

Пример ввода

Следующие входные последовательности должны давать значение Истина:

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. Поэтому для проверки допустимости достаточно рассмотреть только простое число m, если хотите.
  • Если 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, следовательно, не может быть простым.

Гипотеза простых k-кортежей является противоположностью этого утверждения, которое до сих пор остается широко открытой проблемой в теории чисел: оно утверждает, что если a1, a2, ..., ak - допустимая последовательность (или k-кортеж ), то должно быть бесконечно много целых чисел 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включительно.
Утренняя монахиня

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

-60 0 60 120 180 240 300пересекает каждый класс вычетов по модулю 7, поэтому это не допустимо.
Грег Мартин

Можем ли мы иметь более длинные тесты?
Утренняя монахиня

@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)
л: 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

Python, 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

Python, 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 байт.
Утренняя монахиня

@ LeakyNun Не за что!
Карл Напф


2

MATL , 11 байт

"X@QGy\un>v

Истина - это массив (вектор-столбец), содержащий все единицы. Ложь - это массив, содержащий хотя бы один ноль. Вы можете проверить эти определения, используя эту ссылку .

Попробуйте онлайн! Или проверьте все тестовые случаи: правдивый , ложный (слегка измененный код, каждый случай выдает горизонтальный вектор для ясности).

объяснение

"       % 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 

Я все еще ориентируюсь на этот сайт, поэтому извиняюсь, если это хорошо заданный тип вопроса, но: я бы подумал, что значения «истина / ложь» должны быть фактическими константами, а не шаблонами, такими как «массив, содержащий в хотя бы один ноль ". Не следует ли обрабатывать массив (используя в этом случае побитовое И) для получения констант в конце?
Грег Мартин

@GregMartin Это очень хороший вопрос. У нас довольно солидный консенсус относительно его ответа; смотрите здесь
Луис Мендо

1
Понял, и теперь я вижу смысл вашей первой ссылки. Спасибо за объяснение!
Грег Мартин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.