Напишите программу, чтобы определить, обладает ли периодическая последовательность натуральных чисел тем свойством, что для каждого целого числа, n
встречающегося в последовательности, n
между двумя последовательными вхождениями всегда больше, чем другие целые числа n
.
Например, 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...
имеет это свойство: каждая пара последовательных вхождений 2
имеет не более двух целых чисел между ними (таких как 2, 3, 5, 2
и 2, 3, 6, 2
; каждая пара последовательных вхождений 3
имеет не более трех целых чисел между ними; и то же самое для 5
и 6
.
Однако 2, 3, 5, 2, 3, 4, 2, 3, 5, 2, 3, 4, ...
не имеет этого свойства: два последовательных вхождения 4
, а именно 4, 2, 3, 5, 2, 3, 4
, имеют более четырех целых чисел между ними.
Входные данные : разумное представление периодической последовательности натуральных чисел. Например, конечный список, такой как, {2, 3, 5, 2, 3, 6}
может представлять первую бесконечную последовательность 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...
выше. (В этом отношении, проблема могла быть заявлена для конечных списков, которые оборачиваются вместо бесконечных периодических списков.)
Вывод : истинное / ложное значение.
Правдивые примеры:
{1}
{8, 9}
{2, 3, 4}
{5, 5, 3, 3, 6}
{2, 3, 5, 2, 3, 6}
{6, 7, 3, 5, 3, 7}
{9, 4, 6, 7, 4, 5}
{1, 1, 1, 1, 1, 100, 1}
{1, 9, 1, 8, 1, 7, 1, 11}
Ложные примеры:
{1, 2, 3}
{2, 3, 9, 5}
{3, 5, 4, 4, 6}
{2, 3, 5, 2, 3, 4}
{3, 5, 7, 5, 9, 3, 7}
{5, 6, 7, 8, 9, 10, 11}
{1, 9, 1, 8, 1, 6, 1, 11}
Это Codegolf , поэтому выигрывает самый короткий код. Ответы на всех языках приветствуются.
источник
Ответы:
Haskell,
60575655 байтовПредполагается, что входной список содержит хотя бы один элемент.
Пример использования:
g [1]
->True
. Попробуйте онлайн!Позвольте
a
быть главой списка иb
хвостом. Результатом является,True
еслиb
пусто или число элементов в началеb
, которые не равны,a
не больше, чемa
и рекурсивный вызовf b
такжеTrue
, в противном случаеFalse
. Начните с двойного списка ввода.Редактировать: @Leo сохранил 3 байта. Благодарность!
Редактировать 2: @Laikoni сохранил 1 байт. Благодарность!
источник
span
короче, чем использованиеtakeWhile
, поэтому я не смотрел на это вообще.takeWhile
может быть почти всегда сокращен доfst$span
илиfst.span
, что сохраняет другой байт.Python ,
5756 байт-1 байт благодаря Деннису (заменить
i+1:i+v+2
наi:i-~v
соi
смещением 1 отenumerate
)Попробуйте онлайн!
Без имени функция принимает список,
a
и тестирование условия , что каждое значение,v
, появляетсяin
соответствующий фрагмент в свое право на конкатенацииa
с самими собой,(a+a)[i:i-~v]
где 1 на основе индексv
вa
,i
, обеспечиваютсяenumerate(a,1)
.источник
JavaScript (ES6),
67 65 55 54 5149 байтСохранено 3B благодаря @ETHproductions и 2B благодаря @Arnauld
объяснение
Это определяет функцию, которая принимает массив в
a
качестве входных данных. Затем.some
метод выполняет итерацию по этому массиву, выполняя другую функцию для каждого элемента.Эта внутренняя функция принимает два аргумента,
b
иc
, текущее значение и его индекс. Функция находит индекс текущего значения, начиная с индексаc + 1
. Затем он проверяет, больше ли этот индекс, чем текущее значение плюс текущий индекс (разница между двумя вхождениями одного и того же значения больше, чемb
). Обратите внимание, что это возвращает полную противоположность того, что мы хотим.Если одно из этих возвращаемых значений равно
true
,.some
функция также возвращаетсяtrue
. Если ни одна из проверок не вернетсяtrue
,.some
функция вернетсяfalse
. Еще раз противоположное значение, которое мы хотим вернуть, поэтому этот результат отменяется, а затем возвращается.Попробуй это
Попробуйте все тестовые случаи здесь:
источник
.shift()
для сохранения на срезе:a=>!a.some(b=>z.indexOf(z.shift())>b,z=a.concat(a))
a=>!a.some((n,i)=>a.concat(a).indexOf(n,++i)>n+i)
работать?Желе , 11 байт
Попробуйте онлайн!
Как это работает
источник
Желе , 8 байт
Вдохновленный ответом Python @ JonathanAllan .
Попробуйте онлайн!
Как это работает
источник
SWI-Пролог, 83 байта
Список следует вводить дважды:
Если это не считается приемлемым, вы можете добавить предикат
который добавляет дополнительные 14 байтов.
Попробуйте онлайн
nb: вы можете проверять различные ложные случаи сразу, разделяя ваши запросы ';' (или) и проверить для различных истинных случаев, разделяя с помощью ',' (и)
то есть, используя примеры OP:
а также
источник
PHP, 52 байта
принимает последовательность из аргументов командной строки; выходит с кодом
1
для фальши,0
для правды.Беги с
-nr
.$n
аргументы:то ничего не делайте, иначе выйдите с кодом
1
$$n
( переменные переменные )0
(неявный)источник
Сетчатка , 50 байт
Ввод в виде списка запятых унарных чисел.
Попробуйте онлайн!
объяснение
Дублируйте ввод, чтобы мы могли проверить шаги, которые обертывают вокруг конца.
Сопоставьте и верните каждый (самый короткий) раздел между двумя одинаковыми значениями, например
11,111,1,11
.Неоднократно удаляйте цифру из первого числа вместе с целым числом после него. Если зазор достаточно мал, это полностью удалит первый номер. В противном случае останется хотя бы одна цифра.
Посчитайте, как часто
1,
появляется во всех строках. Если он появляется где-то, один из шагов был слишком широким.Попробуйте сопоставить число, начинающееся с
0
(т.е. только с0
себя). Это фактически логическое отрицание результата.источник
JavaScript (ES6), 47 байт
Как это работает
Мы повторно используем входной массив
a
для хранения позиции последнего встреченного вхождения каждого целого числа вa
. Мы используем ключ-n
для хранения этой позиции, чтобы она не мешала исходным индексамa
.Когда
a[-n]
существует, фактический тест происходит. Когдаa[-n]
не существует, выражениеa[-n] - (a[-n] = i)
равноundefined - i == NaN
и сравнение с~n
всегда ложным, что является ожидаемым результатом.Контрольные примеры
Показать фрагмент кода
источник
Сетчатка ,
4139 байт2 байта в гольфе благодаря Мартину Эндеру, который, кстати, познакомил меня с балансировкой групп со своим фантастическим гидом по SO
Ввод - это разделенный запятыми список унарных чисел. Выход
0
для ложного и1
истинного.Попробуйте онлайн! (Набор тестов, который автоматически преобразует из десятичного числа)
Недавно я узнал о балансировке групп, поэтому я хотел попробовать их. Они не являются одними из самых простых инструментов для использования, но уверены, что они мощные.
объяснение
Как и во многих других материалах, мы дублируем список, чтобы справиться с переносом. Мы также добавляем запятую в конце, так что после каждого числа следует запятая (позже это будет немного проще)
Здесь вещи становятся интересными. Это этап замены, мы заменяем все совпадающие по первой строке второй строкой, в этом случае мы стремимся удалить все числа,
n
за которыми не следуютn+1
другие разные числа.Чтобы сделать это, мы сначала сопоставляем номер, захватывая каждый
1
в группе (захват группы № 2 в этом случае). Затем с положительным прогнозом, чтобы получить утверждение нулевой ширины, мы неоднократно пытаемся найти соответствие в балансирующей группе-2
, которая будет успешной не более, чем число захватов, сделанных группой2
, число, за которым следует запятая. После этой последовательности чисел мы удовлетворены, достигнем ли мы либо первого числа снова, либо конца строки.Примечание: это выражение может соответствовать только последней части числа, если ему не удается найти совпадение с полным номером. Это не проблема, потому что тогда первая часть числа останется в строке, и мы будем знать, что замена не прошла полностью.
Наконец, результат должен быть правдивым, если мы полностью удалили все числа из списка. Мы пытаемся сопоставить пустую строку и возвращаем количество найденных совпадений.
источник
\b
. Удаление его приведет к случайным совпадениям, но они не смогут удалить все число, так что в любом случае вы не получите пустую строку.Желе , 11 байт
Попробуйте онлайн!
источник
Python 3 , 101 байт
Попробуйте онлайн!
источник
Röda , 50 байтов
Попробуйте онлайн!
В заключение! Я ждал на этот вызов ...
Это функция, которая возвращает истинное или ложное значение. Требуется один аргумент, массив.
Он перебирает поток индексов и проверяет для каждого индекса,
_1
что расстояние от текущего индекса до следующего индексаa[_1]
не больше, чемa[_1]
.источник
_1
работает?_
, но относится к первому извлеченному значению. Если бы я использовал несколько_
s, каждый получил бы отдельное значение. Например,[1, 2, 3] | print(_, _, _)
печатает123
, но[1,2,3] | print(_, _1, _1)
печатает111 222 333
(на отдельных строках).05AB1E , 13 байтов
Попробуйте онлайн! или как тестовый набор
объяснение
источник