Представьте, что у вас есть массив целых чисел, неотрицательные значения которых являются указателями на другие позиции в том же массиве, только эти значения представляют туннели, поэтому, если значение в позиции A положительно и указывает на позицию B, то значение в позиции B также должен быть положительным и указывать на положение A для представления обоих концов туннеля. Так:
Вызов
- Учитывая массив целых чисел, проверьте, соответствует ли массив ограничению для туннельного массива, и верните два различных, согласованных значения для истинности и ложности.
- Значения в массиве будут ниже нуля для не туннельных позиций и ноль или выше для туннельных позиций. Если ваш массив индексируется 1, то нулевое значение представляет собой не туннельную позицию. Нетуннельные значения проверять не нужно.
- Если положительное значение в ячейке указывает на себя, это фальшивка. Если A указывает на B, B на C и C на A, это фальшивка. Если положительное значение указывает за пределы массива, это фальшивка.
Примеры
Следующие примеры с 0 индексами:
[-1, -1, -1, 6, -1, -1, 3, -1, -1] Truthy (position 3 points to position 6 and vice versa)
[1, 0] Truthy (position 0 points to position 1 and vice versa)
[0, 1] Falsey (positions 0 and 1 point to themselves)
[4, 2, 1, -1, 0, -1] Truthy
[2, 3, 0, 1] Truthy
[1, 2, 0] Falsey (no circular tunnels allowed)
[-1, 2, -1] Falsey (tunnel without end)
[] Truthy (no tunnels, that's OK)
[-1, -2, -3] Truthy (no tunnels, that's OK)
[1, 0, 3] Falsey (tunnel goes beyond limits)
[1] Falsey (tunnel goes beyond limits)
[1, 0, 3, 7] Falsey (tunnel goes beyond limits)
Это код-гольф , поэтому победит самый короткий код для каждого языка!
[0]
?[0,1]
и[0,-1,2]
давали?[0,1]
в примерах. «Если положительное значение в ячейке указывает на себя, это фальшивка»[2,3,0,1]
Ответы:
R , 47 байт
Попробуйте онлайн!
Развернутый код и объяснение:
источник
Python 2 ,
666160 байтПопробуйте онлайн!
источник
APL (Dyalog Unicode) ,
1924 байтаПопробуйте онлайн!
Префикс анонимной лямбды, возвращающий 1 для правды и 0 для фальсификации. Ссылка TIO содержит «предварительно подтвержденную» версию выходных данных для тестовых случаев.
Приветствую @ngn и @ Adám за экономию около миллиарда байтов.
Дополнительный крик @ngn за помощь в исправлении ответа для некоторых тестовых случаев и в создании поезда.
В обновленном ответе используется
⎕IO←0
настройка I ndex O rigin на 0.Как:
источник
0<
→×
Я думаюJavaScript (ES6), 35 байт
Сохранено 1 байт благодаря @Shaggy
Попробуйте онлайн!
комментарии
источник
a=>a.every((v,i)=>v<0|v!=i&a[v]==i)
.Python 2 , 65 байт
Попробуйте онлайн!
источник
Желе , 16 байт
Попробуйте онлайн!
1-индексироваться.
источник
Perl 6 , 36 байт
Попробуйте онлайн!
Основная идея состоит в том, чтобы проверить,
{ i, a[i], a[a[i]] }
содержит ли набор ровно два отдельных элемента для каждого индексаi
сa[i] >= 0
. Если элемент указывает на себя, набор содержит только один отдельный элемент. Если другой конец не указывает на назадi
, набор содержит три различных элемента. Еслиa[i] < 0
, тоxx
множитель равен нуль или отрицательный, так что множество{ i, a[i] }
, а также с двумя различными элементами.источник
MATL ,
1918 байт-1 байт благодаря Луису
Попробуйте онлайн!Только для первого, потому что я не знаю, как все это сделать!
Дает,
0
если верно, ненулевое целое число, если фальси, например. для теста 6 дает4
.Помните, что, как и MATLAB, MATL индексируется 1, поэтому 1 необходимо добавить в тестовые случаи!
Никогда прежде не играл в гольф на Esolang, поэтому совет получен!
Разъяснение:
источник
05AB1E ,
161514 байтов-1 байт благодаря @Dorian .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
ε
сy
. Так что нет необходимости©
, и каждый®
заменен наy
Japt
-e
, 11 байтПопытайся
Оригинал (без флага),
1413 байтПопробуйте или запустите все тесты
источник
Python,
112979686 байтПопробуйте онлайн!
Возвращает
True
илиFalse
.-10 байт благодаря @Rod и @TFeld.
источник
К (нгн / к) , 33 байта
Попробуйте онлайн!
источник
Haskell , 48 байтов
Проверьте все тестовые случаи!
объяснение
Давайте сначала немного разгадать код. В
f =<< g
такой же , как\x -> f (g x) x
код эквивалентенчто немного понятнее.
Это решение основано на простом наблюдении: пусть
a
будет входной массив иu
список пар,(i, a[i])
гдеi
есть индекс. Тогдаa
это допустимый массив, если и только если для каждого(x, y)
вu
сy >= 0
, пара также(y, x)
принадлежитu
.источник
Java (JDK) , 89 байт
Попробуйте онлайн!
кредиты
источник
r
и прерывать цикл, аналогичный приведенному здесьДревесный уголь , 22 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Выходы
-
для правды и ничего для фальши. Примечание: ввод пустого массива, похоже, приводит к сбою Charcoal, но сейчас вы можете ввести вместо него пробел, которого достаточно. Объяснение:источник
Паскаль (FPC) ,
165155153 байтаПопробуйте онлайн!
На этот раз сделал функцию, потому что вход является массивом. Возвращается
1
за правду и0
за фалси.источник
Чисто , 60 байт
Попробуйте онлайн!
Чисто , 142 байта
Значительно сложная версия монстра:
Попробуйте онлайн!
Разъяснение:
источник
Рубин , 44 байта
Попробуйте онлайн!
источник
Pyth ,
1716 байтПопробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .
Редактировать: понял, что тянущийся k тоже не нужен
источник
Groovy , 52 байта
Попробуйте онлайн!
источник
Perl 5 , 54 байта
Попробуйте онлайн!
источник
C (gcc) , 95 байт
Попробуйте онлайн!
источник
Mathematica, 42 байта
Чистая функция. Принимает 1-индексированный список чисел как ввод и возвращает
True
илиFalse
как вывод. Просто следует за туннелями, обеспечивая0
соответствие0
1-циклам, и все циклы являются 2-циклами. (Я не совсем уверен, если это не удается в каких-либо крайних случаях, но это дает правильные результаты для примеров.)источник
Этот ответ не работает. Здесь только для иллюстрации.
Этот ответ проходит все (в настоящее время) опубликованные контрольные примеры. Однако, это терпит неудачу (вызывает ошибку) на другом допустимом вводе, таком как
[1, 2]
или[1, 0, 3, 7]
.Как это могло пройти
[1, 0, 3]
и потерпеть неудачу[1, 0, 3, 7]
? Ну, это происходит по списку, как и следовало ожидать. Когда он читает элементx
спискаa
, он сначала проверяет,x
меньше ли онlen(a)
, и сразу же возвращаетFalse
, если это так. Так что правильно возвращаетсяFalse
на[1, 0, 3]
, так как3
не менееlen(a)
.Но если предположить, что
x
эта проверка прошла, код продолжит выполнять некоторые другие проверки, и в определенный момент это произойдетa[a[x]]
. Мы уже гарантировали , что оценкаa[x]
будет хорошо ... но неa[a[x]]
, который решает ,a[7]
когдаx
это3
в[1, 0, 3, 7]
примере. В этот момент Python поднимаетIndexError
, а не возвращаетFalse
.Для полноты вот ответ.
Python 2 , 59 байт
Попробуйте онлайн!
Я хотел сделать
x<len(a)and-1<a[x]...
, но, конечноlen(a)
, всегда>-1
, поэтому вышесказанное эквивалентно. Эта проверка в общей сложности 5 прикованных отношений (<
,>
,<
,!=
, и==
), плюс отдельного чека-1<x
вif
состоянии.Python (удобно) замыкает цепочечные отношения, как это, например, если
x>=len(a)
тогда проверка вернетсяFalse
до того, как доберетсяa[x]
(что в противном случае вызвало быIndexError
).источник