Neye atanabilir?


10

ilişkili


Neye atanabilir?

Bu meydan size iki tür verilen edilecek Ave Bve olmadığını belirlemek Aiçin atanabilir olan B, Batanabilir olan Aveya hiçbiri.

Tip Sistemi

( tHerhangi bir türü temsil etmek için kullanacağım )

Temel tipler

Temel türler, tek bir büyük harfle gösterilir X. Temelde sınıflardır.

  • Xatanabilir olup Yolmadığını Yya da aynı ya da bir ebeveyn sınıfıdır X.

Kavşak Çeşitleri

Kavşak tipleri 'ile temsil edilir intersect<X, Y>ve <' ler (örneğin intersect<X, Y, Z, D, E>) arasında herhangi bir sayıda tipe sahip olabilir .

  • tatanabilir olup intersect<X1, X2... Xn>olmadığını therkese atanabilir olduğunu X.
  • intersect<X1, X2... Xn>atanabilir tise X, olarak atanabilir t.

Birlik Türleri

Birlik türleri 'ile temsil edilir union<X, Y>ve <' s (örneğin union<X, Y, Z, D, E>) arasında herhangi bir sayıda türe sahip olabilir .

  • tatanabilir olup union<X1, X2... Xn>olmadığını therhangi birine atanabilir olduğunu X.
  • union<X1, X2... Xn>atanabilir olan ttüm eğer Xgöre atanabilir t.

Giriş

Giriş olarak alacaksınız:

  • Sınıf hiyerarşisi. Sınıf hiyerarşisi için giriş yöntemini seçebilirsiniz. Bir ağacın temsilini veya her bir türü üst öğe listesiyle veya sınıf hiyerarşisini doğru bir şekilde temsil eden başka bir şeyle girebilirsiniz.
  • İki tür (giriş esnektir, gösterim tutarlı olduğu sürece bu türleri istediğiniz gibi alabilirsiniz).

Çıktı

Üç tutarlı ve farklı değerlerin çıkış birini olacak, onları aramak X, Yve Z. İki tip göz önüne alındığında Ave Bçıkış, Xeğer Aatanabilir olduğunu B, çıkış Yise Batanabilir olduğunu Ave çıkış Zaksi (varsa Aatanabilir olduğunu Bve Batanabilir olan A, olabilirsiniz çıktı X, Yveya her ikisine birden dördüncü değer).


Test Durumları

Biçim:

# 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

İşte test için kullanabileceğiniz çalışmamış bir Java çözümünün bağlantısı (girişi test senaryolarıyla aynı şekilde alır)


Bu kod golf, bu yüzden her dilde en az bayt o dil için kazanır!



hayır @ovs A veliler B sahiptir ve C.
Sokrates Phoenix

@HalvardHummel özür;
Gönderiyi

Devralma bir çember oluşturur mu?
tsh

Her iki A da B'ye ve B de A'ya atanabilirse ne yapmalıdır?
tsh

Yanıtlar:


3

Python 3 , 177 bayt

cher tür velilerin bir sözlük olduğunu ave bkontrol için iki ifadesidir. Türler dizelerle, kesişimler ve birlikler ifadelerle birlikte listelerle temsil edilir; ilk öğe 0kesişme ve 1birleşim için ayarlanır

İade 0onlar, birbirlerine atanabilir değilse 1eğer aatanabilir olduğunu b, 2eğer batanabilir olduğunu ave 3her ikisi de eğer birbirlerine atanabilir

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

Çevrimiçi deneyin!


3

JavaScript (ES6), 138 bayt

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

panahtarları üst öğelere sahip olan ve değerleri üst öğe dizisi olan bir JavaScript nesnesi olan üst haritadır. Örneğin, iki türü varsa Ave Bve Bebeveyni ise Ao pzaman olur {A:['B']}.

Kavşak türleri , değeri bir türler dizisi olan bir anahtarla bir JavaScript nesnesinde ave bbir JavaScript nesnesi olarak temsil iedilirken, birleşim türlerinde bir anahtar bulunur u. Örneğin, iki türün kesiştiği Ave Bolacağı gibi {i:['A','B']}.

Dönüş değeri trueise aatanabilir olduğunu b, 1eğer ahiç atanamama bama batanabilir olduğunu aveya 0eğer ne birbirlerine atanabilir olduğunu.


2

C ++ 17, 595 bayt

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

Çevrimiçi deneyin!

Bir değişken şablon fgiriş bazı türleri ve kavşak olarak kabul i<...>veya birlik u<...>bunlardan ve getiri -1eğer Aatanabilir olduğunu B ve 1eğer Batanabilir olduğunu Ave 0aksi.

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;

Kullanımı:

#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>>; 
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.