¿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!
fuente
Respuestas:
Python 3 , 177 bytes
c
es un diccionario de los padres de cada tipo,a
yb
son 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 establecido0
para intersección y1
uniónDevuelve
0
si no se pueden asignar entre sí,1
sia
se pueden asignarb
,2
sib
se pueden asignara
y3
si ambos se pueden asignar entre síPruébalo en línea!
fuente
JavaScript (ES6), 138 bytes
p
es 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 tiposA
yB
yB
es el padre de,A
entoncesp
sería{A:['B']}
.Los tipos de intersección se representan en
a
yb
como un objeto JavaScript con una clavei
cuyo valor es una matriz de tipos, mientras que los tipos de unión tienen una clave deu
. Por ejemplo, la intersección de dos tiposA
yB
sería{i:['A','B']}
.El valor de retorno es
true
sia
es asignable ab
,1
sia
no es asignable ab
perob
es asignable aa
, o0
si ninguno de los dos es asignable entre sí.fuente
C ++ 17, 595 bytes
Pruébalo en línea!
Una plantilla variable
f
que acepta como entrada algunos tipos e interseccióni<...>
o uniónu<...>
de ellos y devuelve-1
siA
es asignableB
y1
siB
es asignable aA
y de lo0
contrario.Sin golf:
Uso:
fuente