O que é atribuível a quê?
Neste desafio, você receberá dois tipos A
e , B
e determinará se A
é atribuível a B
, B
é atribuído aA
, ou nenhum.
O sistema de tipos
(Usarei t
para representar qualquer tipo)
Tipos básicos
Os tipos básicos são representados por uma única letra maiúscula, como X
. Eles são basicamente classes.
X
é atribuível aY
ifY
é o mesmo que ou uma classe pai deX
.
Tipos de interseção
Os tipos de interseção são representados por intersect<X, Y>
e podem ter qualquer número de tipos entre os <
's (por exemplo intersect<X, Y, Z, D, E>
).
t
é atribuível aintersect<X1, X2... Xn>
set
for atribuível a todosX
.intersect<X1, X2... Xn>
é atribuível at
se algumX
for atribuível at
.
Tipos de união
Os tipos de união são representados por union<X, Y>
e podem ter qualquer número de tipos entre os <
's (por exemplo union<X, Y, Z, D, E>
).
t
é atribuível aunion<X1, X2... Xn>
set
for atribuível a qualquerX
.union<X1, X2... Xn>
é atribuível at
se todosX
forem atribuíveis at
.
Entrada
Você receberá como entrada:
- A hierarquia de classes. Você pode escolher o método de entrada para a hierarquia de classes. Você pode inserir uma representação de uma árvore, ou cada tipo com uma lista de seus pais, ou qualquer outra coisa que represente com precisão a hierarquia de classes.
- Dois tipos (a entrada é flexível, desde que a notação seja consistente, você poderá receber esses tipos da maneira que desejar).
Resultado
Você será um dos três valores consistentes e distintas saída, chamá-los X
, Y
e Z
. Dado dois tipos A
e B
, de saída X
, se A
é atribuído a B
, de saída Y
, se B
é atribuído a A
e saída Z
de outra forma (Se A
é atribuído para B
e B
é atribuído a A
, você pode saída X
, Y
, ambos, ou uma quarta valor).
Casos de teste
Formato:
# 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
Aqui está um link para uma solução Java não utilizada que você pode usar para teste (ela recebe entrada da mesma maneira que os casos de teste)
Isso é código-golfe, portanto, menos bytes em cada idioma vencem para esse idioma!