क्या करने योग्य है?


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>) के बीच किसी भी प्रकार की संख्या हो सकती है ।

  • tunion<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

यहाँ एक काम कर रहे ungolfed जावा समाधान का एक लिंक है जिसे आप परीक्षण के लिए उपयोग कर सकते हैं (यह परीक्षण मामलों की तरह ही इनपुट लेता है)


यह कोड-गोल्फ है, प्रत्येक भाषा में कम से कम बाइट्स उस भाषा के लिए जीतता है!



@ नोव्स, ए में माता-पिता बी और सी हैं
सुकराती फीनिक्स

@ हवलदार हमेल माफी; मैंने पोस्ट को संपादित किया है
सुकराती फीनिक्स

क्या वंशानुक्रम एक चक्र होगा?
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

जावास्क्रिप्ट (ईएस 6), 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माता-पिता का नक्शा है, जो एक जावास्क्रिप्ट ऑब्जेक्ट है जिसकी कुंजी माता-पिता के प्रकार हैं और जिनके मूल्य माता-पिता के सरणियाँ हैं। उदाहरण के लिए, अगर वहाँ दो प्रकार के होते Aहैं और Bऔर Bकी मूल है Aतो pहो सकता है {A:['B']}

अंतःक्रिया प्रकार का प्रतिनिधित्व किया जाता है aऔर bजावास्क्रिप्ट ऑब्जेक्ट के रूप में iजिसकी कुंजी एक प्रकार की होती है, जबकि यूनियन प्रकार की कुंजी होती है u। उदाहरण के लिए, दो प्रकार के प्रतिच्छेदन Aऔर Bहोंगे {i:['A','B']}

रिटर्न वैल्यू trueयदि aअसाइन करने योग्य है b, 1अगर aअसाइन करने योग्य नहीं है , bलेकिन bअसाइन करने योग्य है a, या 0यदि एक दूसरे के लिए असाइन करने योग्य नहीं है।


2

सी ++ 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>>; 
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.