Qu'est-ce qui peut être attribué à quoi?
Dans ce défi , vous recevrez deux types, Aet Bet déterminer si Aest assignable B, Best assignable Aou non plus .
Le système de type
(Je vais utiliser tpour 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.
Xest affectable àYsiYest 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>).
test assignable àintersect<X1, X2... Xn>iftest assignable à tousX.intersect<X1, X2... Xn>est attribuable àts'il enXestt.
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>).
test attribuable àunion<X1, X2... Xn>iftest attribuable à toutX.union<X1, X2... Xn>est assignable àtsi tousXsont 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, Yet Z. Compte tenu de deux types Aet B, sortie Xsi Aest assignable B, sortie Ysi Best assignable Aet sortie Zautrement (Si Aest assignable Bet Best 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!