Введение
Предположим, у вас есть линейка с номерами от 0 до r-1 . Вы помещаете муравья между любыми двумя числами, и он начинает беспорядочно ползать по линейке. Правитель настолько узок, что муравей не может ходить из одной позиции в другую, не пройдя все промежуточные числа. Когда муравей ходит по числу впервые, вы записываете его, и это дает вам перестановку r чисел. Мы говорим, что перестановка является беспокойной, если она может быть сгенерирована муравьем таким образом. В качестве альтернативы, перестановка p является беспокойной, если каждая запись p [i], кроме первой, находится на расстоянии 1 от некоторой предыдущей записи.
Примеры
Длина-6 перестановок
4, 3, 5, 2, 1, 0
является беспокойным, потому что 3 находится на расстоянии 1 от 4 , 5 находится на расстоянии 1 от 4 , 2 находится на расстоянии 1 от 3 , 1 находится на расстоянии 1 от 2 , и 0 находится на расстоянии 1 от 1 . Перестановка
3, 2, 5, 4, 1, 0
не беспокойный, потому что 5 не находится на расстоянии 1 от 3 или 2 ; муравей должен пройти через 4, чтобы добраться до 5 .
Задание
Учитывая перестановку чисел от 0 до r-1 для некоторого 1 ≤ r ≤ 100 в любом приемлемом формате, выведите истинное значение, если перестановка является беспокойной, и ложное значение, если нет.
Контрольные примеры
[0] -> True
[0, 1] -> True
[1, 0] -> True
[0, 1, 2] -> True
[0, 2, 1] -> False
[2, 1, 3, 0] -> True
[3, 1, 0, 2] -> False
[1, 2, 0, 3] -> True
[2, 3, 1, 4, 0] -> True
[2, 3, 0, 4, 1] -> False
[0, 5, 1, 3, 2, 4] -> False
[6, 5, 4, 7, 3, 8, 9, 2, 1, 0] -> True
[4, 3, 5, 6, 7, 2, 9, 1, 0, 8] -> False
[5, 2, 7, 9, 6, 8, 0, 4, 1, 3] -> False
[20, 13, 7, 0, 14, 16, 10, 24, 21, 1, 8, 23, 17, 18, 11, 2, 6, 22, 4, 5, 9, 12, 3, 15, 19] -> False
[34, 36, 99, 94, 77, 93, 31, 90, 21, 88, 30, 66, 92, 83, 42, 5, 86, 11, 15, 78, 40, 48, 22, 29, 95, 64, 97, 43, 14, 33, 69, 49, 50, 35, 74, 46, 26, 51, 75, 87, 23, 85, 41, 98, 82, 79, 59, 56, 37, 96, 45, 17, 32, 91, 62, 20, 4, 9, 2, 18, 27, 60, 63, 25, 61, 76, 1, 55, 16, 8, 6, 38, 54, 47, 73, 67, 53, 57, 7, 72, 84, 39, 52, 58, 0, 89, 12, 68, 70, 24, 80, 3, 44, 13, 28, 10, 71, 65, 81, 19] -> False
[47, 48, 46, 45, 44, 49, 43, 42, 41, 50, 40, 39, 38, 51, 37, 36, 52, 35, 34, 33, 32, 53, 54, 31, 30, 55, 56, 29, 28, 57, 58, 59, 60, 27, 26, 61, 25, 62, 63, 64, 65, 66, 67, 24, 23, 22, 21, 68, 69, 20, 19, 18, 17, 70, 71, 16, 15, 72, 73, 74, 75, 76, 14, 13, 12, 77, 11, 10, 9, 8, 78, 7, 79, 80, 6, 81, 5, 4, 3, 82, 2, 83, 84, 1, 85, 86, 87, 0, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] -> True
Интересный факт: для r ≥ 1 существует ровно 2 r-1 перестановки antsy длины r .
Ответы:
Pyth, 7 байт
Попробуйте онлайн. (Из-за экспоненциального времени выполнения включены только небольшие тестовые случаи.) Выходы 2 для Truthy, 0 для Falsey.
Другими словами,
где
subseq
выводит, появляются ли элементы первого списка по порядку во втором списке, необязательно смежные. Этоsubseq
делается в Pyth путем взятия всех подмножеств второго списка, которые сохраняют порядок элементов, и подсчета количества вхождений первого списка. Это занимает экспоненциальное время.Почему это работает? Чтобы перестановка была сложной, переход от 0 к n-1 должен состоять в том, чтобы идти только влево, а затем идти только вправо. Это потому, что элементы больше первого элемента должны увеличиваться слева направо, а элементы меньше, чем должны уменьшаться слева направо.
Если мы зеркально отобразим список, поместив перевернутую копию слева от него, теперь этот обход идет только вправо.
И наоборот, любая правая часть этого зеркального списка соответствует обходу слева направо исходного списка. Это право как раз отсортированная подпоследовательность от 0 до n-1. В ограниченном списке эта отсортированная подпоследовательность является уникальной, за исключением произвольного выбора между двумя смежными копиями исходного первого элемента.
источник
Haskell, 46 байтов
Проверяет, равна ли разность векторов бегущих максимумов и бегущих минимумов [0,1,2,3 ...].
Згарб сохранил 2 байта с
(%)=scanl1
.источник
(#)=scanl1
?JavaScript (ES6), 45
Я думал, что это слишком просто, чтобы объяснять, но есть хитрость, и на всякий случай, вот моя первая версия, pre-golf
Примечание: в гольфе
a
используется код вместоk
, так как мне не нужна ссылка на исходный массив внутриevery
вызова. Поэтому я избегаю загрязнять глобальное пространство имен, повторно используя параметрТест
источник
f=([q,...a],x=[])=>x&&(x[q]=!(x+x)|x[q+1]|x[q-1])&&(a+a?f(a,x):1)
Python 2, 49 байт
Проверяет, содержит ли каждый префикс списка все числа между его min и max включительно. Это делается путем проверки, если разность max и min меньше его длины.
54 байта:
Проверяет, является ли последний элемент на единицу меньше, чем мин других элементов, или на единицу больше, чем их максимум. Затем удаляет последний элемент и рекурсивно. В одноэлементном списке выводит True.
Это также можно проверить с помощью забавного, но более длинного понимания списка.
Я хотел бы использовать неравенство
min(l)-2<l.pop()<max(l)+2
, ноpop
сначала должно произойти. Использование программы для вывода через код ошибки, скорее всего, будет короче.источник
Mathematica, 42 байта
Использует сопоставление с шаблоном, чтобы попытаться найти префикс
a
, максимальное отличие которого от следующего элементаb
больше1
(и сводит на нет результатMatchQ
).источник
Perl,
393835 байтВключает +1 для
-p
Приведите последовательность на STDIN:
antsy.pl
:источник
MATL , 11 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Это вычисляет матрицу всех попарных абсолютных разностей и сохраняет верхнюю треугольную часть. Результат верен, если во всех столбцах, кроме первого, есть хотя бы 1 значение.
источник
R,
726460 байтПерестановка является беспокойной тогда и только тогда, когда все ее левые подстановки являются непрерывными (т.е. имеют разность один при сортировке).
Если длина входных данных гарантированно превышает один, то мы можем заменить1:sum(1|v)
наseq(v)
, что экономит четыре байта.seq(v)
В состояние , если ведет себя по- другому , когда входной имеет длину один --- он генерирует последовательность1:v
вместоseq_along(v)
. Однако, к счастью,TRUE
в этом случае получается результат, который является желаемым поведением. То же самое происходит и для ввода нулевой длины.В R
T
заданная переменная равнаTRUE
(но R позволяет вам переопределить ее).TRUE
также считается равным1
.Спасибо @Billywob за некоторые полезные улучшения оригинального решения.
источник
scan
позволит вам сэкономить два байта. В этом случае это точно такое же количество байтов, что и вfor
циклическом подходе:v=scan();c=c();for(i in 1:sum(1|v))c=c(c,diff(sort(v[1:i])));all(c==1)
это будет на 2 байта короче, чем ваш векторизованный подход.T
. Буду редактировать.05AB1E , 7 байтов
Попробуйте онлайн! или как модифицированный набор тестов .
объяснение
Использует процесс, описанный xnor в его блестящем ответе Pyth .
Возвращает 2 для истинных случаев и 0 для ложных.
источник
Perl, 63 байта
Обратите внимание, что @Gabriel Banamy предложил более короткий (55 байт) ответ . Но я думаю, что это решение все еще интересно, поэтому я публикую его.
Количество байтов включает в себя 62 байта кода и
-n
флага.Чтобы запустить это:
Краткие пояснения : преобразует каждое число
k
в унарное представлениеk+1
(это+1
необходимо, чтобы0
s не игнорировалось). Затем для каждого числаk+1
(выраженного в унарном виде как1(1*)
) мы смотрим, присутствуют лиk
($1
содержитk
) илиk+2
(что тогда11$1
) в предыдущей строке (на которую ссылается$-backtick
). Если нет, то мы устанавливаем$.
на ноль. В конце мы печатаем,$.
что будет,1
если мы никогда не установим его на ноль или ноль в противном случае.источник
Brain-Flak
302 264256 BytesСпасибо Wheat Wizard за сохранение 46 байт
Вершина стека будет 1 для правды и 0 для фальши.
Правда: попробуйте онлайн!
Ложь: попробуйте онлайн!
Идея состоит в том, чтобы хранить минимальное и максимальное количество, которое муравей посетил в стеке выключения. Затем сравните каждое число с обоими и обновите соответствующее. Если следующее число не на 1 меньше минимального или на 1 больше максимального, вырвитесь из цикла и верните false.
Краткое объяснение:
источник
([]){({}[()]<({}<>)<>>)}{}
с ,([]){{}({}<>)<>([])}{}
чтобы сэкономить пару более байтЖеле ,
987 байтПопробуйте онлайн!
Jelly перевод ответа xnor.
Старые решения:
Попробуйте онлайн!
Работает очень похоже на мой ответ Pyth ниже:
источник
»\_«\⁼Ṣ
но гораздо более эффективноŒBŒPċṢ
и;\Ṣ€IỊȦ
должен сохранять один байт в каждом подходе.UŒBŒPċṢ
который не сохраняет байты.Ị
Приятно, хотя; Я неправильно прочитал этот атом, чтобы вывести логическое НЕ того, что он на самом деле сделал.U
(или@
сейчас, когда я об этом думаю). Если массив является устаревшим, то есть ли обратный массив?[2, 1, 3, 0]
это беспокойство, но[0, 3, 1, 2]
это не так.CJam (
2120 байт)Набор онлайн-тестов
рассечение
Это использует наблюдение xnor в его ответе на Haskell, что разница между максимумом и минимумом первых
n
элементов должна бытьn-1
.Альтернативный подход (также 20 байтов)
Набор онлайн-тестов
Это непосредственно проверяет, что каждый элемент после первого находится на расстоянии 1 от предыдущего элемента. Поскольку вход является перестановкой и, следовательно, не повторяет значения, это достаточный тест. Спасибо Мартину за 1-байтовую экономию.
рассечение
источник
{_{a+_)f-:z1&,*}*^!}
Ява,
100987975 байтРанее:
Сохранено 3 байта путем замены
true
иfalse
на1>0
и0>1
.Сохранено 23 байта благодаря отличным предложениям от Питера Тейлора!
Ungolfed:
Следите за самыми высокими и самыми низкими значениями, видимыми до
m
иn
; принимать новое значение только в том случае, если оно естьm + 1
илиn - 1
т. е. следующее большее или меньшее значение; инициализировать высокое значение,m
на единицу меньше, чем первый элемент, чтобы он «совпадал» с первым циклом. Примечание: это онлайн-алгоритм с линейным временем. Требуется только три слова памяти для текущих, самых высоких и самых низких значений, в отличие от многих других решений.Если следующее значение пропускает как верхний, так и нижний пределы диапазона, устанавливается самое низкое значение до сих пор,
-1
и тогда нижний предел никогда не сможет продолжиться и достигнет нуля. Затем мы обнаруживаем последовательность, проверяяn
, достигло ли минимальное значение нуля.(К сожалению, это менее эффективно, потому что мы всегда должны смотреть на всю последовательность, а не спасаться после первого неправильного числа, но трудно спорить с 23-байтовой экономией (!), Когда другие решения используют O (n ^ 2) ) и экспоненциальное время приближается.)
Использование:
Примечание: это также может быть написано без использования лямбд Java 8:
Java 7, 89 байт
источник
int m,n;m=n=a[0];--m;
может бытьint n=a[0],m=n-1;
, и дорогойreturn
иelse
может быть уменьшенi==m+1?m++:n=(i==n-1)?i:-1;return n==0;
(или что-то подобное - я не проверял это).m++
илиm+=1
там, так что мне все еще нужны иif
иelse
, и он теряет аспект короткого замыкания при первом плохом значении, но это большое улучшение. Спасибо!j
и присвоить ей результат, но подозревайте, что есть лучший способ сделать это.g
, и я не смог заставить ее работать. (Я использую Java 9-EA + 138, может быть, это разница между Java 8 и Java 9?) Я могу попробовать еще раз завтра.n-=i==m+1?m-m++:i==n-1?1:n+1;
Pyth ( вилка ), 13 байт
Нет Попробуйте онлайн Ссылка для этого форка Pyth. Вилка включает функцию deltas
.+
, которая не является частью стандартной библиотеки Pyth.Объяснение:
источник
Perl,
6654 +1 = 55 байт+1 байт за
-n
.Объяснение:
Печатает 0, если false, 1, если true.
-11 байт благодаря @Dada
источник
perl -nE 's/\d+/$.&=!@a||1~~[map{abs$_-$&}@a];push@a,$&/eg;say$.'
:-n
вместо того ,<>=~
что позволяет вам избавиться от/r
модификатора. используйте,\d+
а затем$&
вместо(\d+)
и$1
.!@a
вместо0>$#a
.$.&=
вместо$.&&=
.push@a,$&
вместо@a=(@a,$&)
Brainfuck, 60 байт
Перестановка дается в виде байтов без разделителей и завершающей строки. Поскольку
\x00
происходит во входных данных, это предназначено для реализаций сEOF = -1
. Выход\x00
для ложного и\x01
истинного.Если перестановка
\x01
до доchr(r)
разрешена, то мы можем заменить все экземпляры,+
с,
за счет 57 сEOF = 0
реализацией.Попробуйте онлайн (57-байтовая версия): входные данные могут быть представлены как перестановка любого непрерывного диапазона байтов, исключая
\x00
, и выходные данные будут\x00
для ложного и минимального диапазона для истинного.Мы отслеживаем минимальные и максимальные значения, видимые до сих пор, и для каждого символа после первого, проверяем, является ли это мин-1 или макс + 1 или ни того, ни другого. В случае ни того, ни другого, переместите указатель за пределы обычного рабочего пространства, чтобы локальные ячейки стали равными нулю.
Структура памяти нормального рабочего пространства в начале основного цикла
c a b 0 0
где
c
текущий символ,a
минимальное иb
максимальное. (Для 60-байтовой версии все обрабатывается со смещением 1 из-за,+
.)источник
Брахилог , 22 байта
Попробуйте онлайн!
объяснение
Я не нашел краткий способ проверить, содержит ли список последовательные целые числа или нет. Самое короткое, что я нашел, - это создать диапазон между первым и последним элементом этого списка и проверить, что этот диапазон является исходным списком.
источник
1
. Я не знаю, насколько это легко в брахилоге.Пакет, 133 байта
Принимает ввод в качестве аргументов командной строки. Выход с уровнем ошибки 0 для успеха, 1 для ошибки.
источник
J, 14 байт
Это основано на @ xnor's методе .
объяснение
источник
Java, 170 байт
Массив
x
имеет значения от 0 до максимального числа по порядку (Python будет намного лучше здесь ...). Цикл идет назад, пытаясь найти совпадение с самым низким (x[b]
) или самым высоким (x[e]
) числом, которое еще не встречалось; если это произойдет, это число может быть достигнуто на этом этапе.Тестовый код здесь .
источник
Mathematica, 47 байт
Немного дольше, чем решение Мартина Эндера (неожиданный сюрприз!). Но это одно из моих нечитаемых усилий, так что это хорошо: D
Объяснение:
источник
Java 7,
170169 байтUngolfed & тестовый код:
Попробуй это здесь.
Выход:
источник