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