¿Qué se puede asignar a qué?
En este desafío se le dará dos tipos, A
y B
y determinar si A
es asignable a B
, B
se puede asignar aA
o no.
El sistema de tipos
(Usaré t
para representar cualquier tipo)
Tipos basicos
Los tipos básicos están representados por una sola letra mayúscula, como X
. Son básicamente clases.
X
es asignable aY
siY
es lo mismo o una clase padre deX
.
Tipos de intersección
Los tipos de intersección están representados por intersect<X, Y>
, y pueden tener cualquier número de tipos entre los <
's (por ejemplo intersect<X, Y, Z, D, E>
).
t
es asignable aintersect<X1, X2... Xn>
sit
es asignable a todosX
.intersect<X1, X2... Xn>
es asignable at
si algunoX
es asignable at
.
Tipos de unión
Los tipos de unión están representados por union<X, Y>
y pueden tener cualquier número de tipos entre los <
's (por ejemplo union<X, Y, Z, D, E>
).
t
es asignable aunion<X1, X2... Xn>
sit
es asignable a cualquieraX
.union<X1, X2... Xn>
es asignable at
si todosX
son asignables at
.
Entrada
Recibirá como entrada:
- La jerarquía de clases. Puede elegir el método de entrada para la jerarquía de clases. Puede ingresar una representación de un árbol, o cada tipo con una lista de sus padres, o cualquier otra cosa que represente con precisión la jerarquía de clases.
- Dos tipos (la entrada es flexible, siempre y cuando la notación sea consistente, puede recibir estos tipos como desee).
Salida
Se quiere una salida de tres valores reales y claras, los llaman X
, Y
y Z
. Habida cuenta de dos tipos A
y B
, de salida X
, si A
es asignable a B
, la salida Y
si B
es asignable a A
y la salida Z
de otro modo (si A
es asignable a B
y B
es asignable a A
, que puede emitir X
, Y
, ambos, o un cuarto valor).
Casos de prueba
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
Aquí hay un enlace a una solución Java no protegida que puede usar para las pruebas (toma la entrada de la misma manera que los casos de prueba)
Este es el código de golf, ¡así que menos bytes en cada idioma ganan para ese idioma!