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!
fonte
Respostas:
Python 3 , 177 bytes
c
é um dicionário dos pais de cada tipoa
eb
são as duas expressões a serem verificadas. Os tipos são representados por seqüências de caracteres, enquanto as interseções e uniões são representadas por listas com expressões, com o primeiro elemento definido como0
para interseção e1
uniãoRetorna
0
se eles não são atribuíveis um ao outro,1
sea
é atribuível ab
,2
seb
é atribuível aa
e3
se ambos são atribuíveis um ao outroExperimente online!
fonte
JavaScript (ES6), 138 bytes
p
é o mapa pai, que é um objeto JavaScript cujas chaves são os tipos com pais e cujos valores são matrizes de pai (s). Por exemplo, se houver dois tiposA
eB
eB
é o pai deA
,p
seria{A:['B']}
.Os tipos de interseção são representados em
a
eb
como um objeto JavaScript com uma chavei
cujo valor é uma matriz de tipos, enquanto os tipos de união possuem uma chaveu
. Por exemplo, a interseção de dois tiposA
eB
seria{i:['A','B']}
.O valor de retorno é
true
sea
é atribuível ab
,1
sea
não é atribuível a,b
masb
é atribuível aa
, ou0
se nenhum é atribuível um ao outro.fonte
C ++ 17, 595 bytes
Experimente online!
Um modelo de variável
f
que aceita como entrada alguns tipos e interseçãoi<...>
ou uniãou<...>
deles e retorna-1
seA
é atribuível aB
e1
seB
é atribuível aA
e de0
outra forma.Ungolfed:
Uso:
fonte