Wyobraź sobie, że masz tablicę liczb całkowitych, których nieujemne wartości są wskaźnikami do innych pozycji w tej samej tablicy, tyle że te wartości reprezentują tunele, więc jeśli wartość w pozycji A jest dodatnia i wskazuje na pozycję B, to wartość na pozycji B musi być również dodatnie i wskazywać na pozycję A, aby reprezentować oba końce tunelu. Więc:
Wyzwanie
- Biorąc pod uwagę tablicę liczb całkowitych, sprawdź, czy tablica jest zgodna z ograniczeniem bycia tablicą tunelującą i zwróć dwie różne, spójne wartości dla wartości true i falsey.
- Wartości w tablicy będą poniżej zera dla pozycji nie tunelowych i zero lub powyżej dla pozycji tunelowych. Jeśli tablica ma indeks 1, wówczas wartość zerowa reprezentuje pozycję nie tunelowaną. Wartości inne niż tunelowe nie muszą być sprawdzane.
- Jeśli dodatnia wartość w komórce wskazuje na siebie, to falsey. Jeśli A wskazuje na B, B na C i C na A, to falsey. Jeśli dodatnia wartość wskazuje poza granice tablicy, to falsey.
Przykłady
Poniższe przykłady są indeksowane według 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)
To jest kod-golf , więc może wygrać najkrótszy kod dla każdego języka!
[0]
?[0,1]
i jakie[0,-1,2]
?[0,1]
jest w przykładach. „Jeśli dodatnia wartość w komórce wskazuje na siebie, to jest falsey”[2,3,0,1]
Odpowiedzi:
R , 47 bajtów
Wypróbuj online!
Kod i objaśnienie:
źródło
Python 2 ,
666160 bajtówWypróbuj online!
źródło
APL (Dyalog Unicode) ,
1924 bajtówWypróbuj online!
Prefiks anonimowy lambda, zwracający 1 za prawda i 0 za fałsz. Łącze TIO zawiera „wstępnie potwierdzoną” wersję danych wyjściowych dla przypadków testowych.
Krzyczy do @ngn i @ Adám za zapisanie około bajtów bazillionów.
Dodatkowy krzyk do @ngn za pomoc w ustaleniu odpowiedzi dla niektórych przypadków testowych i uczynieniu go pociągiem.
Zaktualizowana odpowiedź wykorzystuje
⎕IO←0
, ustawiając I ndex O rigin na 0.W jaki sposób:
źródło
0<
→×
Myślę, żeJavaScript (ES6), 35 bajtów
Zaoszczędzono 1 bajt dzięki @Shaggy
Wypróbuj online!
Skomentował
źródło
a=>a.every((v,i)=>v<0|v!=i&a[v]==i)
.Python 2 , 65 bajtów
Wypróbuj online!
źródło
Galaretka , 16 bajtów
Wypróbuj online!
1-indeksowany.
źródło
Perl 6 , 36 bajtów
Wypróbuj online!
Podstawową ideą jest sprawdzenie, czy zestaw
{ i, a[i], a[a[i]] }
zawiera dokładnie dwa różne elementy dla każdego indeksu zai
pomocąa[i] >= 0
. Jeśli element wskazuje na siebie, zestaw zawiera tylko jeden odrębny element. Jeśli drugi koniec nie wskazujei
, zestaw zawiera trzy odrębne elementy. Jeślia[i] < 0
Thexx
czynnikiem jest zerowy lub ujemny, a więc zespół jest{ i, a[i] }
także z dwóch oddzielnych elementów.źródło
MATL ,
1918 bajtów-1 bajtów dzięki Luisowi
Wypróbuj online! , tylko dla pierwszego, ponieważ nie wiem, jak to zrobić!
Podaje,
0
jeśli to prawda, niezerową liczbę całkowitą, jeśli falsey, np. dla przypadku testowego 6 daje4
.Pamiętaj, że podobnie jak MATLAB, MATL ma indeks 1, więc należy dodać 1 do przypadków testowych!
Nigdy wcześniej nie grałem w Esolang, więc bardzo otrzymałem porady!
Wyjaśniono:
źródło
05AB1E ,
161514 bajtów-1 bajt dzięki @Dorian .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
ε
pomocąy
. Więc nie ma potrzeby©
, a każdy®
zastąpiony przezy
Japt
-e
, 11 bajtówSpróbuj
Oryginał (bez flagi),
1413 bajtówWypróbuj lub uruchom wszystkie przypadki testowe
źródło
Python,
112979686 bajtówWypróbuj online!
Zwraca
True
lubFalse
.-10 bajtów dzięki @Rod i @TFeld.
źródło
K (ngn / k) , 33 bajty
Wypróbuj online!
źródło
Haskell , 48 bajtów
Zweryfikuj wszystkie przypadki testowe!
Wyjaśnienie
Najpierw trochę poprawmy kod. Podobnie
f =<< g
jak\x -> f (g x) x
kod jest równoważnyco jest nieco jaśniejsze.
To rozwiązanie opiera się na prostej obserwacji: niech
a
będzie tablicą wejściową iu
listą par,(i, a[i])
gdziei
jest indeks. Potema
jest ważna tablica wtedy i tylko wtedy, gdy dla każdego(x, y)
wu
zy >= 0
, para(y, x)
należy dou
tak dobrze.źródło
Java (JDK) , 89 bajtów
Wypróbuj online!
Kredyty
źródło
r
i wyjdź z pętli analogicznie jak tutajWęgiel drzewny , 22 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjścia
-
dla prawdy i nic dla fałszu. Uwaga: wprowadzenie pustej tablicy wydaje się powodować awarię węgla drzewnego, ale na razie możesz zamiast tego wprowadzić spację, która jest wystarczająco blisko. Wyjaśnienie:źródło
Pascal (FPC) ,
165155153 bajtówWypróbuj online!
Tym razem wykonano funkcję, ponieważ dane wejściowe to tablica. Zwraca
1
za prawdę i0
falsey.źródło
Czysty , 60 bajtów
Wypróbuj online!
Czysty , 142 bajty
Ogromnie skomplikowana wersja potworów:
Wypróbuj online!
Wyjaśniono:
źródło
Rubinowy , 44 bajty
Wypróbuj online!
źródło
Pyth ,
1716 bajtówSpróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .
Edycja: zdałem sobie sprawę, że końcowe k również było niepotrzebne
źródło
Groovy , 52 bajty
Wypróbuj online!
źródło
Perl 5 , 54 bajtów
Wypróbuj online!
źródło
C (gcc) , 95 bajtów
Wypróbuj online!
źródło
Mathematica, 42 bajty
Czysta funkcja. Pobiera 1-indeksowaną listę liczb jako dane wejściowe i zwracane
True
lubFalse
dane wyjściowe. Po prostu podąża tunelami, upewniając się, że0
mapy do0
, nie ma 1-cykli, a wszystkie cykle są 2-cykli. (Nie jestem do końca pewien, czy to się nie powiedzie na żadnym przypadku krawędzi, ale daje prawidłowe wyniki dla przykładów).źródło
Ta odpowiedź nie działa. Tutaj tylko w celach ilustracyjnych.
Ta odpowiedź przechodzi przez wszystkie (obecnie) opublikowane przypadki testowe. Jednak nie powiedzie się (wywołuje błąd) na innych prawidłowych danych wejściowych, takich jak
[1, 2]
lub[1, 0, 3, 7]
.Jak to mogło przejść
[1, 0, 3]
i zawieść[1, 0, 3, 7]
? Cóż, przechodzi przez listę, tak jak można się spodziewać. Kiedy czyta elementx
listya
, najpierw sprawdza, czyx
jest mniejsza niżlen(a)
, i natychmiast zwracaFalse
, jeśli tak jest. Więc to poprawnie powracaFalse
na[1, 0, 3]
, ponieważ3
nie jest mniejsza niżlen(a)
.Ale zakładając, że
x
pozytywny wynik testu się powiedzie, kod przejdzie do wykonania innych kontroli i w pewnym momencie zdarzy się, że się ocenia[a[x]]
. Mamy już gwarancję, że ocenaa[x]
będzie w porządku ... ale niea[a[x]]
, co rozwiązuje się,a[7]
gdyx
jest3
w[1, 0, 3, 7]
przykładzie. W tym momencie Python podnosiIndexError
, a nie zwracaFalse
.Dla kompletności, oto odpowiedź.
Python 2 , 59 bajtów
Wypróbuj online!
Chciałem to zrobić
x<len(a)and-1<a[x]...
, ale oczywiścielen(a)
zawsze>-1
, więc powyższe jest równoważne. Kontrola ta jest w sumie 5 przykuty relations (<
,>
,<
,!=
, i==
) oraz oddzielny check-1<x
wif
stanie.Python (dogodnie) zwiera takie łańcuchowe relacje, więc na przykład, jeśli
x>=len(a)
wtedy czek wracaFalse
zanim do niego dojdziea[x]
(co w innym przypadku spowodowałoby anIndexError
).źródło