Co można przypisać do czego?
W tym wyzwaniu otrzymasz dwa typy A
i określisz, B
czy A
można je przypisać B
, czy B
można przypisać A
, czy nie.
System typów
(Użyję t
do reprezentowania dowolnego typu)
Podstawowe typy
Typy podstawowe są reprezentowane przez jedną wielką literę, na przykład X
. Są to w zasadzie klasy.
X
można przypisać,Y
jeśliY
jest to ta sama klasa lub klasa nadrzędnaX
.
Rodzaje skrzyżowań
Typy skrzyżowań są reprezentowane przez intersect<X, Y>
i mogą mieć dowolną liczbę typów między <
znakami (np intersect<X, Y, Z, D, E>
.).
t
można przypisać,intersect<X1, X2... Xn>
jeślit
można przypisać wszystkimX
.intersect<X1, X2... Xn>
można przypisać,t
jeśli którykolwiekX
jest przypisanyt
.
Rodzaje Unii
Typy Unii są reprezentowane przez union<X, Y>
i mogą mieć dowolną liczbę typów między <
znakami (np union<X, Y, Z, D, E>
.).
t
można przypisać,union<X1, X2... Xn>
jeślit
można przypisać do dowolnegoX
.union<X1, X2... Xn>
można przypisać,t
jeśli wszyscyX
są przypisanit
.
Wejście
Otrzymasz jako dane wejściowe:
- Hierarchia klas. Możesz wybrać metodę wprowadzania danych dla hierarchii klas. Możesz wprowadzić reprezentację drzewa lub każdego typu z listą jego rodziców lub cokolwiek innego, co dokładnie reprezentuje hierarchię klas.
- Dwa typy (dane wejściowe są elastyczne, o ile notacja jest spójna, możesz otrzymywać te typy w dowolny sposób).
Wynik
Będziesz jedno wyjście z trzech spójnych i wyraźnych wartości, nazywamy je X
, Y
i Z
. Biorąc pod uwagę dwa rodzaje A
i B
wyjście X
, jeżeli A
jest przypisane do B
wyjście Y
, jeżeli B
jest przypisane do A
i wyjście Z
inaczej (jeżeli A
jest przypisane do B
i B
jest przypisane do A
, możesz wyjścia X
, Y
zarówno, lub wartość czwarty).
Przypadki testowe
Format:
# of types
[type, parents...]
[type, parents...]
Type a
Type b
2
[A,B]
[B]
A
B
--
A is assignable to B
3
[A,B,C]
[B,C]
[C]
intersect<A,C>
A
--
A is assignable to intersect<A,C>
3
[A,B,C]
[B,C]
[C]
union<A,C>
A
--
A is assignable to union<A,C>
3
[A,B,C]
[B,C]
[C]
intersect<B,C>
A
--
A is assignable to intersect<B,C>
3
[A,B,C]
[X,Y,Z]
[T,U,V]
intersect<union<A,T,X>,intersect<A,B>,Y>
intersect<T,C,X>
--
intersect<T,C,X> and intersect<union<A,T,X>,intersect<A,B>,Y> are not assignable to each other
1
[A]
A
A
--
A is assignable to A
3
[A,B,C]
[X,Y,Z]
[T,U,V]
intersect<A,intersect<A,B>,Y>
intersect<T,C,X>
--
intersect<T,C,X> and intersect<A,intersect<A,B>,Y> are not assignable to each other
2
[A]
[B]
A
B
--
B and A are not assignable to each other
3
[A,B,C]
[X,Y,Z]
[T,U,V]
intersect<union<A,X>,intersect<A,B>,Y>
intersect<T,C,X>
--
intersect<T,C,X> and intersect<union<A,X>,intersect<A,B>,Y> are not assignable to each other
Oto link do działającego nieakolowanego rozwiązania Java, którego można użyć do testowania (pobiera dane wejściowe w taki sam sposób jak przypadki testowe)
To jest golf golfowy, więc najmniej bajtów w każdym języku wygrywa dla tego języka!
źródło
Odpowiedzi:
Python 3 , 177 bajtów
c
to słownik rodziców każdego typua
ib
są to dwa wyrażenia do sprawdzenia. Typy są reprezentowane przez ciągi, podczas gdy przecięcia i związki są reprezentowane przez listy z wyrażeniami, z pierwszym elementem ustawionym0
na przecięcie i1
zjednoczenieZwraca,
0
jeśli nie można ich przypisać,1
jeślia
można przypisaćb
,2
jeślib
można przypisaća
i3
jeśli oba są przypisane sobie wzajemnieWypróbuj online!
źródło
JavaScript (ES6), 138 bajtów
p
jest mapą nadrzędną, która jest obiektem JavaScript, którego klucze są typami z rodzicami i których wartości są tablicami rodziców. Na przykład, jeśli istnieją dwa typyA
aB
iB
jest rodzicemA
wtedyp
będzie{A:['B']}
.Typy przecięć są reprezentowane w
a
ib
jako obiekt JavaScript z kluczem,i
którego wartością jest tablica typów, podczas gdy typy unii mają kluczu
. Na przykład przecięcie dwóch typówA
iB
byłoby{i:['A','B']}
.Zwracana jest wartość,
true
jeślia
można ją przypisaćb
,1
jeżelia
nie można jej przypisać,b
aleb
można ją przypisaća
, lub0
jeżeli żadna z nich nie jest wzajemnie przypisywalna.źródło
C ++ 17,595 bajtów
Wypróbuj online!
Zmienny szablon,
f
który przyjmuje jako dane wejściowe niektóre typy i ich przecięciei<...>
lub połączenieu<...>
i zwraca,-1
jeśliA
można go przypisaćB
i1
jeśliB
można go przypisaćA
i w0
inny sposób.Nie golfowany:
Stosowanie:
źródło