อะไรที่กำหนดให้กับอะไร


10

ที่เกี่ยวข้อง


อะไรที่กำหนดให้กับอะไร

ในความท้าทายนี้คุณจะได้รับสองประเภทAและBและตรวจสอบว่าAเป็นไปมอบหมายB, Bย่อมโอนไปAหรือไม่

ระบบประเภท

(ฉันจะใช้tเพื่อเป็นตัวแทนประเภทใด ๆ )

ประเภทพื้นฐาน

Xประเภทพื้นฐานจะถูกแทนด้วยอักษรตัวใหญ่เดียวเช่น พวกเขาเป็นชั้นเรียนโดยทั่วไป

  • Xย่อมโอนไปYถ้าเป็นอย่างใดอย่างหนึ่งเช่นเดียวกับหรือระดับผู้ปกครองของYX

ประเภทแยก

ประเภทการแยกจะถูกแทนด้วยintersect<X, Y>และสามารถมีประเภทจำนวนเท่าใดก็ได้ระหว่าง<'s (เช่นintersect<X, Y, Z, D, E>)

  • tสามารถมอบหมายได้intersect<X1, X2... Xn>หากtสามารถมอบหมายให้กับทุกคนXได้
  • intersect<X1, X2... Xn>ย่อมโอนไปtถ้าเป็นไปมอบหมายXt

ประเภทสหภาพ

ประเภทสหภาพถูกแสดงโดยunion<X, Y>และสามารถมีจำนวนประเภทใดก็ได้ระหว่าง<'s (เช่นunion<X, Y, Z, D, E>)

  • tย่อมโอนไปunion<X1, X2... Xn>ถ้าเป็นมอบหมายใด ๆtX
  • 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 ที่ไม่ได้ทำงานซึ่งคุณสามารถใช้สำหรับการทดสอบ (ใช้อินพุตในแบบเดียวกับกรณีทดสอบ)


นี่คือโค้ดกอล์ฟอย่างน้อยไบต์ในแต่ละภาษาชนะสำหรับภาษานั้น!


Sandbox (ลบแล้ว)
Socratic Phoenix

@ovs no, A มีผู้ปกครอง B และ C
Socratic Phoenix

@ HalvardHummel ขอโทษ; ฉันได้แก้ไขโพสต์
Socratic Phoenix

จะสืบทอดเป็นวงกลมหรือไม่
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>>; 
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.