Opis wyzwania
Zacznijmy od kilku definicji:
- relacja jest zbiorem uporządkowanych par elementów (w tym wyzwaniem, będziemy używać liczb całkowitych)
Na przykład [(1, 2), (5, 1), (-9, 12), (0, 0), (3, 2)]
jest relacją.
relacja jest nazywana przechodnią, jeśli dla dowolnych dwóch par elementów
(a, b)
iw(b, c)
tej relacji(a, c)
występuje również para ,[(1, 2), (2, 4), (6, 5), (1, 4)]
jest przechodnie, ponieważ zawiera(1, 2)
i(2, 4)
, ale(1, 4)
także[(7, 8), (9, 10), (15, -5)]
jest przechodnie, ponieważ nie ma żadnych dwóch par(a, b)
,(c, d)
obecnych tak, żeb
=c
.[(5, 9), (9, 54), (0, 0)]
nie jest przechodnie, ponieważ zawiera(5, 9)
i(9, 54)
, ale nie zawiera(5, 54)
Biorąc pod uwagę listę par liczb całkowitych, określ, czy relacja jest przechodnia, czy nie.
Wejście wyjście
Otrzymasz listę par liczb całkowitych w dowolnym rozsądnym formacie. Rozważ relację
[(1, 6), (9, 1), (6, 5), (0, 0)]
Następujące formaty są równoważne:
[(1, 6), (9, 1), (6, 5), (0, 0)] # list of pairs (2-tuples)
[1, 9, 6, 0], [6, 1, 5, 0] # two lists [x1, x2, ..., xn] [y1, y2, ..., yn]
[[1, 6], [9, 1], [6, 5], [0, 0] # two-dimentional int array
[4, 1, 6, 9, 1, 6, 5, 0, 0] # (n, x1, y1, ..., xn, yn)
[1+6i, 9+i, 6+5i, 0+0i] # list of complex numbers
... many others, whatever best suits golfing purposes
Wyjście: prawdziwa wartość dla relacji przechodniej, w przeciwnym razie fałsz. Możesz założyć, że dane wejściowe będą się składać z co najmniej jednej pary i że pary są unikalne.
źródło
(1,3) (2,1) (3,4) (1,4) (2,4)
. Jeśli pary nie zostaną zamówione, nie będzie to przechodnie, ponieważ(2,3)
brakuje.[(7, 8), (9, 10), (15, -5)]
) nie powinien być przechodni?Odpowiedzi:
Haskell, 42 bajty
Przykład użycia:
f [(1,2), (2,4), (6,5), (1,4)]
->True
.Pętla (zewnętrzna) nad wszystkimi parami
(a,b)
i (wewnętrzna) pętla nad tymi samymi parami, teraz wywoływanymi(c,d)
i za każdym razem, gdyb==c
sprawdzane(a,d)
jest, czy istnieje również para. Połącz wyniki z logikąand
.źródło
Prolog, 66 bajtów
Relacja nie jest przechodnia, jeśli możemy znaleźć (A, B) i (B, C) w taki sposób, że (A, C) nie zachowuje się.
źródło
MATL ,
2725 bajtówFormat wejściowy to macierz (używana
;
jako separator wierszy), w której każda para relacji jest kolumną. Na przykład przypadki testowesą odpowiednio wprowadzane jako
Wyjściowa prawda to macierz utworzona przez jedynki.Falsy to matryca zawierająca co najmniej jedno zero.
Wypróbuj online!
Wyjaśnienie
Kod najpierw redukuje wejściowe liczby całkowite do unikalnych wartości całkowitych opartych na 1. Z tych wartości generuje macierz przyległości; matryca mnoży ją sama; i konwertuje wartości niezerowe w macierzy wyników na te. Na koniec sprawdza, czy żaden wpis w drugiej macierzy nie przekracza wpisu w macierzy przylegania.
źródło
JavaScript (ES6),
6967 bajtówZaoszczędzono 2 bajty dzięki pomysłowi @Cyoce. Były cztery poprzednie 69-bajtowe formuły:
źródło
.every
[e]
, więc nawet jeśli przypisanie kosztuje 8 bajtówe
, nadal zapisujesz bajt. Jednak poszedłem o krok dalej, tworząc skróta.every
, co pozwoliło zaoszczędzić drugi bajt.Brachylog , 24 bajty
Wypróbuj online!
Wyjaśnienie:
Innymi słowy, jeśli dane wejściowe zawierają pary
[A:B]
i[B:C]
, możemy zezwolić, aby dane wejściowe wstawiały[A:B]
i[B:C]
na początku usuwały wszystkie inne elementy i tworzyły listę[A:B:B:C]
. Następnie zwracamy prawdę z wewnętrznego orzecznika (falsey z całego programu), jeśli go[A:C]
nie ma.źródło
CJam (22 bajty)
Zestaw testów online . Jest to anonimowy blok (funkcja), który przyjmuje elementy jako tablicę dwupoziomową, ale pakiet testowy dokonuje manipulacji ciągiem znaków, aby najpierw wprowadzić dane wejściowe do odpowiedniego formatu.
Sekcja
źródło
Pyth, 14 bajtów
Zestaw testowy
Format wejściowy ma być
[[0, 0], [0, 1], ... ]
źródło
Mathematica, 49 bajtów
Czysta funkcja, która pobiera listę par. Jeśli lista zawiera wejście
{a,b}
i{b,c}
ale nie{a,c}
dla niektórycha, b, c
, zastępuje go0
. Prawda jest listą wejściową, fałsz jest0
.źródło
C ++ 14, 140 bajtów
Jako nienazwana lambda powraca poprzez parametr referencyjny. Wymaga, aby jego dane wejściowe były pojemnikiem
pair<int,int>
. Przyjmując nudne podejście O (n ^ 3).Niegolfowane i użytkowanie:
źródło
Python 2 ,
916755 bajtówWypróbuj online!
-24 bajty dzięki Dziurawej Zakonnicy
-12 bajtów dzięki Bubblerowi
źródło
lambda x
nalambda s
.for
s.Axiom 103 bajty
bez golfa:
ćwiczenia
źródło
Pyth -
2221 bajtówPakiet testowy .
źródło
Clojure,
5653 bajtówAktualizacja: Zamiast używać
:when
po prostu sprawdzę, czy dla wszystkich par[a b]
[c d]
jednego z nichb != c
lub[a d]
znajduje się w zestawie wejściowym.Oryginalny:
Wow, Clojure dla pętli są fajne: D Sprawdza, czy
for
pętla nie generuje wartości fałszowania, która pojawia się, jeśli[a d]
nie zostanie znaleziona w zestawie wejściowym.Wejście to musi być zbiorem wektorów dwuelementowych:
Jeśli dane wejściowe muszą być podobne do list, to
(%[a d])
należy je zastąpić((set %)[a d])
dodatkowymi 6 bajtami.źródło
Oba te rozwiązania są nienazwanymi funkcjami przyjmującymi listę uporządkowanych par jako dane wejściowe i zwracające
True
lubFalse
.Mathematica, 65 bajtów
#~Permutations~{2}]
tworzy listę wszystkich uporządkowanych par uporządkowanych par z danych wejściowych iJoin@@@
konwertuje je na uporządkowane poczwórne. Są one następnie obsługiwane przez funkcjęIf[#2==#3,{#,#4},Nothing]&@@@
, która ma fajną właściwość: jeśli środkowe dwa elementy są równe, zwraca uporządkowaną parę składającą się z pierwszej i ostatniej liczby; w przeciwnym razie powróciNothing
specjalny token Mathematica, który automatycznie znika z list. Tak więc wynikiem jest zestaw uporządkowanych par, który musi znajdować się na wejściu, aby był przechodni;SubsetQ[#,...]
wykrywa tę właściwość.Mathematica, 70 bajtów
Table[...,{i,#},{j,#}]
tworzy tablicę 2D indeksowaną przezi
ij
, które są pobierane bezpośrednio z danych wejściowych (stąd obie pary uporządkowane). Funkcją tych dwóch indeksów jestLast@i!=#&@@j||#~MemberQ~{#&@@i,Last@j}
, co przekłada się na „albo drugi elementi
i pierwszy elementj
nie pasują, albo dane wejściowe zawierają uporządkowaną parę składającą się z pierwszego elementui
i ostatniego elementuj
”. Tworzy to tablicę 2D booleanów, któraAnd@@And@@@
spłaszcza się w jedną wartość logiczną.źródło
APL (NARS), 39 znaków, 78 bajtów
test:
jedna sekunda „rozwiązania” jest gotowa:
źródło
Common Lisp, 121 bajtów
Wypróbuj online!
źródło