Apa yang ditugaskan untuk apa?

10

terkait


Apa yang ditugaskan untuk apa?

Dalam tantangan ini Anda akan diberikan dua jenis, Adan Bdan menentukan apakah Adapat ditugaskan B, Bdapat ditugaskan A, atau tidak.

Sistem Jenis

(Saya akan gunakan tuntuk mewakili jenis apa pun)

Tipe Dasar

Jenis dasar diwakili oleh satu huruf kapital, seperti X. Mereka pada dasarnya adalah kelas.

  • Xditugaskan untuk Yapakah Ysama dengan, atau kelas induk dari X.

Jenis persimpangan

Tipe titik-temu diwakili oleh intersect<X, Y>, dan dapat memiliki sejumlah tipe di antara titik-titik <(misalnya intersect<X, Y, Z, D, E>).

  • tditugaskan untuk intersect<X1, X2... Xn>jika tditugaskan untuk semua X.
  • intersect<X1, X2... Xn>ditugaskan tjika ada Xyang ditugaskan t.

Jenis Serikat

Jenis-jenis serikat diwakili oleh union<X, Y>dan dapat memiliki sejumlah jenis antara <(misalnya union<X, Y, Z, D, E>).

  • tditugaskan untuk union<X1, X2... Xn>jika tditugaskan untuk X.
  • union<X1, X2... Xn>ditugaskan tjika semua Xditugaskan untuk t.

Memasukkan

Anda akan menerima sebagai masukan:

  • Hirarki kelas. Anda dapat memilih metode input untuk hirarki kelas. Anda bisa memasukkan representasi pohon, atau setiap jenis dengan daftar orang tuanya, atau apa pun yang secara akurat mewakili hierarki kelas.
  • Dua jenis (input fleksibel, selama notasi konsisten, Anda dapat menerima jenis ini sesuka Anda).

Keluaran

Anda akan menampilkan salah satu dari tiga nilai yang konsisten dan berbeda, memanggil mereka X, Ydan Z. Mengingat dua jenis Adan B, keluaran Xjika Aini dialihkan ke B, keluaran Yjika Bini dialihkan ke Adan output Zsebaliknya (Jika Aadalah dialihkan ke Bdan Bmerupakan dialihkan untuk A, Anda mungkin keluaran X, Y, baik, atau nilai keempat).


Uji Kasus

Format:

# 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

Berikut ini tautan ke solusi Java yang tidak dikenali dan berfungsi yang dapat Anda gunakan untuk pengujian (dibutuhkan input dengan cara yang sama dengan kasus pengujian)


Ini adalah kode-golf, jadi paling tidak byte dalam setiap bahasa menang untuk bahasa itu!

Phoenix Sokrates
sumber
Kotak Pasir (dihapus)
Socratic Phoenix
@ovs tidak, A punya orang tua B dan C.
Socratic Phoenix
@HalvardHummel permintaan maaf; Saya telah mengedit pos
Socratic Phoenix
Akankah mewarisi bentuk lingkaran?
tsh
Apa yang harus dihasilkan jika kedua A dapat dialihkan ke B dan B dapat dialihkan ke A?
tsh

Jawaban:

3

Python 3 , 177 byte

cadalah kamus orang tua dari masing-masing jenis, adan bmerupakan dua ekspresi yang harus diperiksa. Jenis diwakili oleh string, sedangkan persimpangan dan serikat diwakili oleh daftar dengan ekspresi, dengan elemen pertama diatur untuk 0untuk memotong dan 1untuk persatuan

Mengembalikan 0jika mereka tidak dapat ditugaskan satu sama lain, 1jika aditugaskan untuk b, 2jika bditugaskan ke adan 3jika keduanya ditugaskan satu sama lain

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

Cobalah online!

Halvard Hummel
sumber
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)

padalah peta induk, yang merupakan objek JavaScript yang kuncinya adalah tipe dengan orang tua dan yang nilainya adalah array dari induk. Misalnya, jika ada dua jenis Adan Bdan Bmerupakan induk Amaka pakan menjadi {A:['B']}.

Tipe titik-temu direpresentasikan dalam adan bsebagai objek JavaScript dengan kunci iyang nilainya adalah array tipe, sedangkan tipe union memiliki kunci u. Misalnya, persimpangan dua jenis Adan Bakan menjadi {i:['A','B']}.

Nilai kembali adalah truejika aditugaskan untuk b, 1jika atidak ditugaskan btetapi bdapat ditugaskan ke a, atau 0jika tidak ada yang ditugaskan satu sama lain.

Neil
sumber
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;

Cobalah online!

Templat variabel fyang menerima sebagai input beberapa jenis dan persimpangan i<...>atau gabungan u<...>dari mereka dan mengembalikan -1jika Aditugaskan B dan 1jika Bditugaskan Adan 0sebaliknya.

Tidak Disatukan:

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

Pemakaian:

#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>>; 
}
rahnema1
sumber