Що можна віднести до чого?
У цих проблемах ви отримаєте два типи, Aа Bй визначити, Aє присвоюється B, Bє присвоюється Aабо ні.
Система типу
(Я буду використовувати tдля представлення будь-якого типу)
Основні типи
Основні типи представлені однією великою літерою, наприклад X. Вони в основному є класами.
Xприсвоюється,YякщоYє або тим самим, або батьківський класX.
Типи перетину
Типи перетину представлені intersect<X, Y>і можуть мати будь-яку кількість типів між <'s (наприклад intersect<X, Y, Z, D, E>).
tприсвоюється,intersect<X1, X2... Xn>якщоtпризначається всімX.intersect<X1, X2... Xn>присвоюється,tякщо такі можутьXбути віднесеніt.
Типи союзів
Типи союзів представлені union<X, Y>і можуть мати будь-яку кількість типів між <'s (наприклад 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-рішення, яке не використовується для тестування, яке ви можете використовувати для тестування (воно вимагає введення так само, як і тестові випадки)
Це код-гольф, тому найменше байт у кожній мові виграє за цю мову!