¿Qué se puede asignar a qué?
En este desafío se le dará dos tipos, Ay By determinar si Aes asignable a B, Bse 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.
Xes asignable aYsiYes 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>).
tes asignable aintersect<X1, X2... Xn>sites asignable a todosX.intersect<X1, X2... Xn>es asignable atsi algunoXes 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>).
tes asignable aunion<X1, X2... Xn>sites asignable a cualquieraX.union<X1, X2... Xn>es asignable atsi todosXson 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, Yy Z. Habida cuenta de dos tipos Ay B, de salida X, si Aes asignable a B, la salida Ysi Bes asignable a Ay la salida Zde otro modo (si Aes asignable a By Bes 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!