Странам принадлежит ряд территорий в одномерном мире. Каждая страна уникально идентифицируется номером. Право собственности на территории может быть представлено в виде списка:
1 1 2 2 1 3 3 2 4
Мы определяем самые крайние территории страны как две территории, самые близкие к любому краю. Если приведенный выше список был проиндексирован с нуля, 1
крайние территории страны находятся в позиции 0
и 4
.
Страна окружает другую, если подсписок между ее двумя крайними территориями содержит все территории другой страны. В приведенном выше примере подсписок между 2
крайними территориями страны:
2 2 1 3 3 2
И мы видим, что все территории страны 3
находятся между крайними территориями страны 2
, поэтому страна 2
окружает страну 3
.
Страна с одним элементом никогда не будет окружать другой.
Вызов
Возьмите список целых чисел в качестве входных данных (в любом формате) и выведите истинное значение, если какая-либо страна окружена другой, и ложное значение в противном случае.
Вы можете предположить, что входной список не пуст, содержит только положительные целые числа и не пропускает никакие числа: например, 1 2 1 5
будет неправильный ввод.
Тестовые случаи
+----------------------+--------+
| Input | Output |
+----------------------+--------+
| 1 | False |
| 2 1 3 2 | True |
| 2 1 2 1 2 | True |
| 1 2 3 1 2 3 | False |
| 1 3 1 2 2 3 2 3 | True |
| 1 2 2 1 3 2 3 3 4 | False |
| 1 2 3 4 5 6 7 8 9 10 | False |
+----------------------+--------+
Ответы:
Pyth, 7 байт
Запустите код в тестовых случаях.
Единственный способ избежать окружения - сортировка крайних левых территорий в том же порядке, что и крайние правые территории. Если две страны поменялись местами в этом порядке, одна из них имеет территорию как влево, так и дальше вправо, чем в другой, и поэтому окружает ее.
Чтобы получить уникальные страны в порядке крайней левой территории, мы просто дедуплицируем, что сохраняет этот порядок. То же самое делается для самой правой территории путем реверсирования, дедупликации, а затем реверса снова. Если они дают разные результаты, тогда страна окружена.
источник
Сетчатка ,
6160 байтНамного дольше, чем хотелось бы ...
Печать числа стран, которые окружают хотя бы одну другую страну.
Попробуйте онлайн.
Это очень простая реализация спецификации: мы ищем такой шаблон
A...B...A
, который неB
появляется ни до, ни после матча.источник
Python, 64 байта
Единственный способ избежать окружения - сортировка крайних левых территорий в том же порядке, что и крайние правые территории. Если две страны поменялись местами в этом порядке, одна из них имеет территорию как влево, так и дальше вправо, чем в другой, и поэтому окружает ее.
Функция проверяет, что сортировка территорий по левому и правому краям дает одинаковые результаты. К сожалению, списки Python не имеют
rindex
аналогаrfind
, поэтому мы переворачиваем список, а затем переворачиваем отсортированный вывод.Та же длина (64) со вспомогательной функцией:
источник
C #, 113 байт
Ungolfed:
Используя краткий
LINQ
подход.источник
int
если вы не говорите иначе». +1 за алгоритм и реализацию..ToArray()
.using System.Linq;
+n=>!n.Distinct().SequenceEqual(n.Reverse().Distinct().Reverse())
(импорт Linq, к сожалению, обязателен). Попробуйте онлайн. Хороший ответ, +1 от меня!CJam (
1413 байт)Онлайн демо
Спасибо Мартину Бюттнеру за спасение одного знака
источник
Japt, 12 байт
Попробуйте онлайн!
Спасибо @xnor за выяснение алгоритма. Входной массив автоматически сохраняется
U
,â
является уникальным,w
обратным и¦
имеет значение!=
.¬
объединяется с пустой строкой ([1,2,3] => "123"
); это необходимо, потому что при сравнении JavaScript два массива считаются не равными, если они не являются одним и тем же объектом. Например (код JS, а не Japt):Если бы это было не так, мы могли бы удалить два байта, просто не объединяя каждый массив:
источник
ES6,
76756564 байтаПрямой порт ответов @ xnor.
Редактировать: 1 байт сохранен путем замены
a.lastIndexOf(x)==i
наa.indexOf(x,i+1)<0
.Редактировать: 10 байтов сохранено благодаря @ user81655.
Редактировать: 1 байт сохранен путем замены
r||i
наr|i
.источник
a=>(f=r=>a.filter((x,i)=>a.indexOf(x,r&&i+1)==(r||i))+a)()!=f(-1)
~
так же, как>=0
.05AB1E , 4 байта
Попробуйте онлайн или проверьте все контрольные примеры .
Порт @xnor 's Pyth answer .
Объяснение:
источник
Java, 281 символов
источник
Python 3, 90 байт
Эта функция принимает входные данные в виде списка Python. К сожалению, списки Python напрямую не поддерживают поиск с конца, как это делают строки
rindex()
, ну да ладно.источник