什么可以分配给什么?
在本次挑战中,您将获得两种类型,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解决方案的链接(它以与测试用例相同的方式接受输入)
这是代码高尔夫球,因此每种语言中最少的字节会赢得该语言!