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!
la source
Réponses:
Python 3 , 177 octets
c
est un dictionnaire des parents de chaque type,a
etb
sont les deux expressions à vérifier. Les types sont représentés par des chaînes, tandis que les intersections et les unions sont représentées par des listes d'expressions, le premier élément étant défini sur0
pour intersection et1
pour unionRenvoie
0
s'ils ne peuvent pas être attribués les uns aux autres,1
sia
est attribuable àb
,2
sib
est attribuable àa
et3
si les deux sont assignables les uns aux autresEssayez-le en ligne!
la source
JavaScript (ES6), 138 octets
p
est la carte parent, qui est un objet JavaScript dont les clés sont les types avec parents et dont les valeurs sont des tableaux de parent (s). Par exemple, s'il existe deux typesA
etB
etB
est le parent deA
alors cep
serait{A:['B']}
.Les types d'intersection sont représentés dans
a
et enb
tant qu'objet JavaScript avec une cléi
dont la valeur est un tableau de types, tandis que les types d'union ont une clé deu
. Par exemple, l'intersection de deux typesA
etB
serait{i:['A','B']}
.La valeur de retour est
true
ifa
est assignable àb
,1
ifa
n'est pas assignable àb
maisb
est assignable àa
, ou0
si aucun n'est assignable à l'autre.la source
C ++ 17, 595 octets
Essayez-le en ligne!
Un modèle de variable
f
qui accepte en entrée certains types et intersectionsi<...>
ou l'unionu<...>
de ceux-ci et retourne-1
siA
est assignable àB
et1
siB
est assignable àA
et0
autrement.Non golfé:
Usage:
la source