Có thể gán cái gì?


10

liên quan


Có thể gán cái gì?

Trong thử thách này, bạn sẽ được cung cấp hai loại, ABvà xác định xem Alà chuyển nhượng tới B, Blà có thể chuyển nhượng cho A, hay không.

Hệ thống loại

(Tôi sẽ sử dụng tđể đại diện cho bất kỳ loại nào)

Các loại cơ bản

Các loại cơ bản được thể hiện bằng một chữ cái viết hoa duy nhất, chẳng hạn như X. Chúng cơ bản là các lớp học.

  • Xđược gán cho Ynếu Ylà giống như hoặc một lớp cha của X.

Các loại giao lộ

Các loại giao nhau được đại diện bởi intersect<X, Y>và có thể có bất kỳ số loại nào giữa các <(ví dụ intersect<X, Y, Z, D, E>).

  • tđược gán cho intersect<X1, X2... Xn>nếu tđược gán cho tất cả X.
  • intersect<X1, X2... Xn>được gán cho tnếu Xcó thể gán cho t.

Các loại liên minh

Các loại liên minh được đại diện bởi union<X, Y>và có thể có bất kỳ số loại giữa các <(ví dụ union<X, Y, Z, D, E>).

  • tđược gán cho union<X1, X2... Xn>nếu tđược gán cho bất kỳ X.
  • union<X1, X2... Xn>được gán cho tnếu tất cả Xđược gán cho t.

Đầu vào

Bạn sẽ nhận được như là đầu vào:

  • Hệ thống phân cấp lớp. Bạn có thể chọn phương thức nhập liệu cho hệ thống phân cấp lớp. Bạn có thể nhập một đại diện của một cây, hoặc mỗi loại với một danh sách cha mẹ của nó hoặc bất cứ thứ gì khác thể hiện chính xác hệ thống phân cấp lớp.
  • Hai loại (đầu vào là linh hoạt, miễn là ký hiệu phù hợp, bạn có thể nhận được các loại này theo cách bạn muốn).

Đầu ra

Bạn sẽ một đầu ra trong ba giá trị nhất quán và rõ ràng, gọi cho họ X, YZ. Với hai loại AB, sản lượng Xnếu Alà chuyển nhượng tới B, sản lượng Ynếu Blà chuyển nhượng tới Avà đầu ra Zkhác (Nếu Alà chuyển nhượng tới BBlà chuyển nhượng để A, bạn có thể đầu ra X, Ycả hai, hoặc một giá trị thứ tư).


Các trường hợp thử nghiệm

Định dạng:

# 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

Đây là một liên kết đến một giải pháp Java không được làm việc mà bạn có thể sử dụng để thử nghiệm (nó nhận đầu vào giống như các trường hợp thử nghiệm)


Đây là môn đánh gôn, do đó, ít byte nhất trong mỗi ngôn ngữ sẽ giành chiến thắng cho ngôn ngữ đó!



@ovs không, A có bố mẹ B và C.
Socratic Phoenix

@HalvardHummel xin lỗi; Tôi đã chỉnh sửa bài đăng
Socratic Phoenix

Kế thừa sẽ tạo thành một vòng tròn?
tsh

Điều gì sẽ xuất ra nếu cả A được gán cho B và B được gán cho A?
tsh

Câu trả lời:


3

Python 3 , 177 byte

clà một từ điển của cha mẹ của từng loại, ablà hai biểu thức để kiểm tra. Các loại được biểu diễn bằng các chuỗi, trong khi các giao điểm và liên hiệp được thể hiện bằng các danh sách với các biểu thức, với phần tử đầu tiên được đặt thành 0giao nhau và 1cho liên kết

Trả về 0nếu chúng không thể gán cho nhau, 1nếu ađược gán cho b, 2nếu bđược gán cho a3nếu cả hai đều có thể gán cho nhau

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:])

Hãy thử trực tuyến!


3

JavaScript (ES6), 138 byte

(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)

plà bản đồ mẹ, là một đối tượng JavaScript có các khóa là các kiểu có cha mẹ và có các giá trị là các mảng của cha mẹ. Ví dụ, nếu có hai loại ABBlà mẹ của Asau đó psẽ là {A:['B']}.

Các loại giao nhau được biểu diễn trong abdưới dạng đối tượng JavaScript với khóa icó giá trị là một mảng các loại, trong khi các loại kết hợp có khóa là u. Ví dụ, giao điểm của hai loại ABsẽ là {i:['A','B']}.

Giá trị trả về là truenếu ađược gán cho b, 1nếu akhông thể gán cho bnhưng bđược gán cho ahoặc 0nếu không được gán cho nhau.


2

C ++ 17, 595 byte

#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;

Hãy thử trực tuyến!

Một mẫu biến fchấp nhận làm đầu vào một số loại và giao i<...>hoặc liên kết u<...>của chúng và trả về -1nếu Ađược gán cho B1nếu Bđược gán cho A0nếu không.

Ung dung:

#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;

Sử dụng:

#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>>; 
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.