Qu'est-ce qui peut être attribué à quoi?
Dans ce défi , vous recevrez deux types, A
et B
et déterminer si A
est assignable B
, B
est assignable A
ou non plus .
Le système de type
(Je vais utiliser t
pour représenter tout type)
Types de base
Les types de base sont représentés par une seule majuscule, comme X
. Ce sont essentiellement des classes.
X
est affectable àY
siY
est soit identique à, soit à une classe parent deX
.
Types d'intersection
Les types d'intersection sont représentés par intersect<X, Y>
, et peuvent avoir n'importe quel nombre de types entre les <
(par exemple intersect<X, Y, Z, D, E>
).
t
est assignable àintersect<X1, X2... Xn>
ift
est assignable à tousX
.intersect<X1, X2... Xn>
est attribuable àt
s'il enX
estt
.
Types d'unions
Les types d'union sont représentés par union<X, Y>
et peuvent avoir n'importe quel nombre de types entre les <
(par exemple union<X, Y, Z, D, E>
).
t
est attribuable àunion<X1, X2... Xn>
ift
est attribuable à toutX
.union<X1, X2... Xn>
est assignable àt
si tousX
sont assignables àt
.
Contribution
Vous recevrez en entrée:
- La hiérarchie des classes. Vous pouvez choisir la méthode de saisie pour la hiérarchie des classes. Vous pouvez saisir une représentation d'un arbre, ou chaque type avec une liste de ses parents, ou tout autre élément qui représente avec précision la hiérarchie des classes.
- Deux types (l'entrée est flexible, tant que la notation est cohérente, vous pouvez recevoir ces types comme vous le souhaitez).
Production
Vous aurez une sortie de trois valeurs cohérentes et distinctes, les appeler X
, Y
et Z
. Compte tenu de deux types A
et B
, sortie X
si A
est assignable B
, sortie Y
si B
est assignable A
et sortie Z
autrement (Si A
est assignable B
et B
est assignable A
, vous pouvez sortir X
, Y
, les deux, ou une quatrième valeur).
Cas de test
Format:
# 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
Voici un lien vers une solution Java non golfée fonctionnelle que vous pouvez utiliser pour les tests (elle prend les données de la même manière que les cas de test)
Il s'agit de code-golf, donc le moins d'octets dans chaque langue gagne pour cette langue!