Что можно назначить на что?

10

связанные с


Что можно назначить на что?

В этом задании вам дадут два типа, 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, которое вы можете использовать для тестирования (оно принимает данные так же, как и тестовые случаи).


Это код-гольф, поэтому на этом языке выигрывает наименьшее количество байтов на каждом языке!

Сократовский феникс
источник
Песочница (удалено)
сократовский феникс
@ovs нет, у A есть родители B и C.
Сократик Феникс,
@HalvardHummel извинения; Я редактировал пост
Сократик Феникс
Унаследует ли форму круг?
TSH
Что должно выводиться, если A назначается как B, а B назначается A?
TSH

Ответы:

3

Python 3 , 177 байт

cэто словарь родителей каждого типа aи bдва выражения для проверки. Типы представлены строками, в то время как пересечения и объединения представлены списками с выражениями, причем первый элемент имеет значение 0для пересечения и 1для объединения

Возвращает, 0если они не присваиваются друг другу, 1если aприсваиваются b, 2если bприсваиваются, aи 3если оба назначаются друг другу

lambda c,a,b:y(a,b,c)+2*y(b,a,c)
y=lambda a,b,c:(b in c[a]or a==b if b[0]in c else[all,any][b[0]](y(a,x,c)for x in b[1:]))if a[0]in c else[any,all][a[0]](y(x,b,c)for x in a[1:])

Попробуйте онлайн!

Халвард Хаммель
источник
3

JavaScript (ES6), 138 байт

(p,a,b,g=(a,b)=>a==b||(p[a]||a.i||a.u||[])[a.u?'every':'some'](t=>g(t,b))||(b.i||b.u||[])[b.i?'every':'some'](t=>g(a,t)))=>g(a,b)||+g(b,a)

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если ни один не присваивается друг другу.

Нил
источник
2

C ++ 17, 595 байт

#include<type_traits>
#define p(x)template<class...T>class x;
#define d(a,b)disjunction<s<a,b>...>{};
#define c(a,b)conjunction<s<a,b>...>{};
#define u(x)u<x...>
#define i(x)i<x...>
#define k struct s
#define e ...A
#define t(a,b)template<class a,class b>
using namespace std;p(i)p(u)t(B,D)k:disjunction<is_base_of<B,D>,is_same<B,D>>{};t(a,e)k<a,u(A)>:d(a,A)t(a,e)k<a,i(A)>:c(a,A)t(a,e)k<u(A),a>:c(A,a)t(a,e)k<i(A),a>:d(A,a)t(e,...B)k<i(A),i(B)>:d(A,i(B))t(e,...B)k<u(A),u(B)>:c(A,u(B))t(e,...B)k<i(A),u(B)>:d(A,u(B))t(e,...B)k<u(A),i(B)>:c(A,u(B))t(A,B)int f=s<A,B>::value?-1:s<B,A>::value?1:0;

Попробуйте онлайн!

Шаблон переменной, fкоторый принимает в качестве входных данных некоторые типы и их пересечение i<...>или объединение u<...>и возвращает, -1если Aможно назначить, B и 1если Bможно назначить Aи 0другим образом.

Ungolfed:

#include <type_traits>
using namespace std;

template<class...T>class Intersect;
template<class...T>class Union;

template<class A,class B>
struct is_assignable_to:
    disjunction<is_base_of<A,B>,is_same<A,B>>{};

template<class a,class...A>
struct is_assignable_to<a,Union<A...>>:
    disjunction<is_assignable_to<a,A>...>{};

template<class a,class...A>
struct is_assignable_to<a,Intersect<A...>>:
    conjunction<is_assignable_to<a,A>...>{};

template<class a,class...A>
struct is_assignable_to<Union<A...>,a>:
    conjunction<is_assignable_to<A,a>...>{};

template<class a,class...A>
struct is_assignable_to<Intersect<A...>,a>:
    disjunction<is_assignable_to<A,a>...>{};

template<class...A,class...B>
struct is_assignable_to<Intersect<A...>,Intersect<B...>>:
    disjunction<is_assignable_to<A,Intersect<B...>>...>{};

template<class...A,class...B>
struct is_assignable_to<Union<A...>,Union<B...>>:
    conjunction<is_assignable_to<A,Union<B...>>...>{};

template<class...A,class...B>
struct is_assignable_to<Intersect<A...>,Union<B...>>:
    disjunction<is_assignable_to<A,Union<B...>>...>{};

template<class...A,class...B>
struct is_assignable_to<Union<A...>,Intersect<B...>>:
    conjunction<is_assignable_to<A,Intersect<B...>>...>{};

template <class A,class B>
int f = is_assignable_to<A,B>::value?-1:is_assignable_to<B,A>::value?1:0;

Применение:

#include <iostream>
int main(){
    struct B{};
    struct C{};
    struct Y{};
    struct Z{};
    struct U{};
    struct V{};
    struct A:B,C{};
    struct X:Y,Z{};
    struct T:U,V{};
    std::cout << f<Intersect<A,Intersect<A,B>,Y>,Union<T,C,X>>; 
}
rahnema1
источник