什么可以分配给什么?
在本次挑战中,您将获得两种类型,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>
ift
可以分配给allX
。intersect<X1, X2... Xn>
是分配给t
如有X
可分配给t
。
联合类型
联合类型由表示,union<X, Y>
并且之间可以有任意多种类型<
(例如union<X, Y, Z, D, E>
)。
t
可分配给union<X1, X2... Xn>
ift
,可分配给anyX
。union<X1, X2... Xn>
t
如果所有X
都可分配给,则可分配给t
。
输入值
您将收到以下输入:
- 类层次结构。您可以为类层次结构选择输入方法。您可以输入树的表示形式,或者输入每种类型的树及其父级列表,或者输入任何其他能准确表示类层次结构的形式。
- 两种类型(输入是灵活的,只要符号一致,您就可以随意接收这些类型)。
输出量
您将在三个一致和不同值的输出之一,给他们打电话X
,Y
和Z
。鉴于两种类型A
和B
输出X
,如果A
是分配给B
输出Y
,如果B
是分配给A
和输出Z
,否则(如果A
是分配给B
和B
可分配给A
,你可以输出X
,Y
,这两者或第四值)。
测试用例
格式:
# 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解决方案的链接(它以与测试用例相同的方式接受输入)
这是代码高尔夫球,因此每种语言中最少的字节会赢得该语言!