何に何を割り当てることができますか?
この課題では次の2つのタイプを与え、されるA
とB
してかどうかを判断A
に割り当て可能であるB
、B
に割り当て可能であるA
、またはどちらも。
型システム
(私はt
あらゆるタイプを表すために使用します)
基本的なタイプ
基本タイプは、などの単一の大文字で表されX
ます。彼らは基本的にクラスです。
X
割り当て可能であるY
場合Y
と同じか、またはの親クラスですX
。
交差点タイプ
交差タイプはで表されintersect<X, Y>
、の間に任意の数のタイプを含めることができます<
(たとえばintersect<X, Y, Z, D, E>
)。
t
がすべてに割り当て可能なintersect<X1, X2... Xn>
場合t
に割り当て可能X
です。intersect<X1, X2... Xn>
に割り当て可能なものがt
あれば、X
に割り当てられt
ます。
ユニオンタイプ
ユニオンタイプはで表されunion<X, Y>
、の間に任意の数のタイプを含めることができます<
(たとえばunion<X, Y, Z, D, E>
)。
t
がに割り当て可能なunion<X1, X2... Xn>
場合t
はに割り当て可能X
です。union<X1, X2... Xn>
割り当てているt
すべての場合X
にアサインされていますt
。
入力
入力として受け取ります:
- クラス階層。クラス階層の入力方法を選択できます。ツリーの表現、または親のリストを含む各タイプ、またはクラス階層を正確に表すその他のものを入力できます。
- 2つのタイプ(表記に一貫性がある限り、入力は柔軟ですが、これらのタイプを自由に受け取ることができます)。
出力
次の3つの一貫性の異なる値の出力1を意志、それらを呼び出すX
、Y
とZ
。2種類を考えるA
とB
、出力X
場合A
に代入されB
、出力Y
の場合はB
に割り当て可能でA
、出力Z
そうでない場合(IFがA
に割り当て可能であるB
とB
に割り当て可能であるA
、あなたを出力してもよいX
、Y
両方、または4番目の値)。
テストケース
フォーマット:
# 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
以下は、テストに使用できる実用的なJavaソリューションへのリンクです(テストケースと同じ方法で入力を取ります)。
これはコードゴルフなので、各言語の最小バイトがその言語に勝ちます!