Was ist was zuzuordnen?
In dieser Herausforderung werden Sie zwei Arten gegeben werden, A
und B
und bestimmen , ob A
zu zuweisbaren ist B
, B
ist zuordenbar A
oder keines von beiden.
Das Typsystem
(Ich werde verwenden t
, um jeden Typ darzustellen)
Grundtypen
Grundtypen werden durch einen einzelnen Großbuchstaben dargestellt, z X
. Sie sind im Grunde Klassen.
X
ist zuweisbar,Y
wennY
entweder die gleiche oder eine übergeordnete Klasse von istX
.
Schnittpunkttypen
Schnittpunkttypen werden durch dargestellt intersect<X, Y>
und können eine beliebige Anzahl von Typen zwischen den <
's haben (z intersect<X, Y, Z, D, E>
. B. ).
t
ist zuweisbar,intersect<X1, X2... Xn>
wennt
es allen zuweisbar istX
.intersect<X1, X2... Xn>
ist zuweisbar,t
wenn eineX
zuweisbar istt
.
Unionstypen
Unionstypen werden durch union<X, Y>
eine beliebige Anzahl von Typen zwischen den <
's (z union<X, Y, Z, D, E>
. B. ) dargestellt und können diese haben .
t
ist zuweisbar,union<X1, X2... Xn>
wennt
es einer zuweisbar istX
.union<X1, X2... Xn>
ist zuweisbar,t
wenn alleX
zuweisbar sindt
.
Eingang
Sie erhalten als Eingabe:
- Die Klassenhierarchie. Sie können die Eingabemethode für die Klassenhierarchie auswählen. Sie können eine Darstellung eines Baums oder jedes Typs mit einer Liste seiner übergeordneten Elemente oder alles andere eingeben, das die Klassenhierarchie genau darstellt.
- Zwei Typen (Eingabe ist flexibel, solange die Notation konsistent ist, können Sie diese Typen erhalten, wie Sie möchten).
Ausgabe
Sie werden Ausgang einer von drei konsistenten und eindeutigen Werten, rufen sie X
, Y
und Z
. Gegeben seien zwei Arten A
und der B
Ausgang , X
wenn A
zu zuweisbaren ist B
, ausgegeben , Y
wenn B
ist zuordenbar A
und Ausgang Z
ansonsten (Wenn A
ist zuordenbar B
und B
ist zuordenbar A
, Sie ausgeben X
, Y
, beide oder ein vierter Wert).
Testfälle
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
Hier ist ein Link zu einer funktionierenden Java-Lösung, die Sie zum Testen verwenden können (die Eingabe erfolgt auf die gleiche Weise wie in den Testfällen).
Dies ist Code-Golf, also gewinnen die wenigsten Bytes in jeder Sprache für diese Sprache!