¿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!
fuente

Respuestas:
Python 3 , 177 bytes
ces un diccionario de los padres de cada tipo,aybson las dos expresiones para verificar. Los tipos están representados por cadenas, mientras que las intersecciones y las uniones están representadas por listas con expresiones, con el primer elemento establecido0para intersección y1uniónDevuelve
0si no se pueden asignar entre sí,1siase pueden asignarb,2sibse pueden asignaray3si ambos se pueden asignar entre síPruébalo en línea!
fuente
JavaScript (ES6), 138 bytes
pes el mapa padre, que es un objeto JavaScript cuyas claves son los tipos con padres y cuyos valores son matrices de padres. Por ejemplo, si hay dos tiposAyByBes el padre de,Aentoncespsería{A:['B']}.Los tipos de intersección se representan en
aybcomo un objeto JavaScript con una claveicuyo valor es una matriz de tipos, mientras que los tipos de unión tienen una clave deu. Por ejemplo, la intersección de dos tiposAyBsería{i:['A','B']}.El valor de retorno es
truesiaes asignable ab,1siano es asignable abperobes asignable aa, o0si ninguno de los dos es asignable entre sí.fuente
C ++ 17, 595 bytes
Pruébalo en línea!
Una plantilla variable
fque acepta como entrada algunos tipos e interseccióni<...>o uniónu<...>de ellos y devuelve-1siAes asignableBy1siBes asignable aAy de lo0contrario.Sin golf:
Uso:
fuente