Що можна віднести до чого?


10

пов'язані


Що можна віднести до чого?

У цих проблемах ви отримаєте два типи, 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-рішення, яке не використовується для тестування, яке ви можете використовувати для тестування (воно вимагає введення так само, як і тестові випадки)


Це код-гольф, тому найменше байт у кожній мові виграє за цю мову!



@ovs ні, у A є батьки B і C.
Сократ Фенікс

@HalvardHummel вибачення; Я відредагував пост
Сократичний Фенікс

Чи успадковуватиме форму кола?
tsh

Що має бути результатом, якщо обидва A присвоюються B, а B - A?
tsh

Відповіді:


3

Пітон 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 іншим чином.

Безголівки:

#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>>; 
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.