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!
quelle
Antworten:
Python 3 , 177 Bytes
c
ist ein Wörterbuch der Eltern jedes Typsa
undb
sind die beiden zu überprüfenden Ausdrücke. Typen werden durch Zeichenfolgen dargestellt, während Schnittpunkte und Vereinigungen durch Listen mit Ausdrücken dargestellt werden, wobei das erste Element0
für Schnittpunkt und1
Vereinigung festgelegt istGibt zurück,
0
wenn sie nicht einander zuweisbar sind,1
wenn siea
zuweisbar sindb
,2
wenn sieb
zuweisbar sinda
und3
wenn beide einander zuweisbar sindProbieren Sie es online aus!
quelle
JavaScript (ES6), 138 Byte
p
ist die übergeordnete Zuordnung, bei der es sich um ein JavaScript-Objekt handelt, dessen Schlüssel die Typen mit übergeordneten Elementen sind und dessen Werte Arrays von übergeordneten Elementen sind. Zum Beispiel, wenn es zwei Typen gibtA
undB
undB
das Elternteil vonA
dannp
wäre{A:['B']}
.Schnittpunkttypen werden in
a
undb
als JavaScript-Objekt dargestellt,i
dessen Schlüssel ein Array von Typen ist, während Vereinigungstypen einen Schlüssel von habenu
. Zum Beispiel wäre der Schnittpunkt zweier TypenA
undB
wäre{i:['A','B']}
.Der Rückgabewert ist,
true
ob era
zuweisbar istb
,1
ob era
nicht zuweisbar ist,b
aberb
zuweisbara
ist oder0
ob keiner von beiden einander zuweisbar ist.quelle
C ++ 17, 595 Bytes
Probieren Sie es online aus!
Eine Variablenvorlage
f
, die einige Typen und Schnittpunktei<...>
oder Vereinigungen als Eingabe akzeptiertu<...>
und zurückgibt,-1
ob sieA
zugewiesen werden kannB
und1
ob sieB
zugewiesen werden kannA
und auf0
andere Weise.Ungolfed:
Verwendungszweck:
quelle