Что можно назначить на что?
В этом задании вам дадут два типа, 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, которое вы можете использовать для тестирования (оно принимает данные так же, как и тестовые случаи).
Это код-гольф, поэтому на этом языке выигрывает наименьшее количество байтов на каждом языке!
источник
Ответы:
Python 3 , 177 байт
c
это словарь родителей каждого типаa
иb
два выражения для проверки. Типы представлены строками, в то время как пересечения и объединения представлены списками с выражениями, причем первый элемент имеет значение0
для пересечения и1
для объединенияВозвращает,
0
если они не присваиваются друг другу,1
еслиa
присваиваютсяb
,2
еслиb
присваиваются,a
и3
если оба назначаются друг другуПопробуйте онлайн!
источник
JavaScript (ES6), 138 байт
p
является родительской картой, которая является объектом JavaScript, ключи которого являются типами с родителями, а значения - это массивы родителя (ей). Например, если есть два типаA
иB
иB
является родителем ,A
тоp
будет{A:['B']}
.Типы пересечений представлены в
a
иb
как объект JavaScript, ключомi
которого является массив типов, в то время как типы объединения имеют ключu
. Например, пересечение двух типовA
иB
будет{i:['A','B']}
.Возвращаемое значение - это
true
еслиa
присваиваетсяb
,1
еслиa
не присваивается,b
ноb
присваиваетсяa
, или0
если ни один не присваивается друг другу.источник
C ++ 17, 595 байт
Попробуйте онлайн!
Шаблон переменной,
f
который принимает в качестве входных данных некоторые типы и их пересечениеi<...>
или объединениеu<...>
и возвращает,-1
еслиA
можно назначить,B
и1
еслиB
можно назначитьA
и0
другим образом.Ungolfed:
Применение:
источник