Что можно назначить на что?
В этом задании вам дадут два типа, 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
.
вход
Вы получите в качестве входных данных:
- Иерархия классов. Вы можете выбрать метод ввода для иерархии классов. Вы можете ввести представление дерева, или каждого типа со списком его родителей, или что-нибудь еще, что точно представляет иерархию классов.
- Два типа (ввод гибкий, при условии, что обозначения согласованы, вы можете получать эти типы, как вам нравится).
Вывод
Вы Выведете один из трех последовательных и различных значений, называют их 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, которое вы можете использовать для тестирования (оно принимает данные так же, как и тестовые случаи).
Это код-гольф, поэтому на этом языке выигрывает наименьшее количество байтов на каждом языке!