Was ist was zuzuordnen?
In dieser Herausforderung werden Sie zwei Arten gegeben werden, Aund Bund bestimmen , ob Azu zuweisbaren ist B, Bist zuordenbar Aoder 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.
Xist zuweisbar,YwennYentweder 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. ).
tist zuweisbar,intersect<X1, X2... Xn>wenntes allen zuweisbar istX.intersect<X1, X2... Xn>ist zuweisbar,twenn eineXzuweisbar 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 .
tist zuweisbar,union<X1, X2... Xn>wenntes einer zuweisbar istX.union<X1, X2... Xn>ist zuweisbar,twenn alleXzuweisbar 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, Yund Z. Gegeben seien zwei Arten Aund der BAusgang , Xwenn Azu zuweisbaren ist B, ausgegeben , Ywenn Bist zuordenbar Aund Ausgang Zansonsten (Wenn Aist zuordenbar Bund Bist 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!