何に何を割り当てることができますか?
この課題では次の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ソリューションへのリンクです(テストケースと同じ方法で入力を取ります)。
これはコードゴルフなので、各言語の最小バイトがその言語に勝ちます!