何に何を割り当てることができますか?


10

関連した


何に何を割り当てることができますか?

この課題では次の2つのタイプを与え、されるABしてかどうかを判断Aに割り当て可能であるBBに割り当て可能であるA、またはどちらも。

型システム

(私はtあらゆるタイプを表すために使用します)

基本的なタイプ

基本タイプは、などの単一の大文字で表されXます。彼らは基本的にクラスです。

  • X割り当て可能であるY場合Yと同じか、またはの親クラスですX

交差点タイプ

交差タイプはで表されintersect<X, Y>、の間に任意の数のタイプを含めることができます<(たとえばintersect<X, Y, Z, D, E>)。

  • tがすべてに割り当て可能なintersect<X1, X2... Xn>場合tに割り当て可能Xです。
  • intersect<X1, X2... Xn>に割り当て可能なものがtあれば、Xに割り当てられtます。

ユニオンタイプ

ユニオンタイプはで表されunion<X, Y>、の間に任意の数のタイプを含めることができます<(たとえばunion<X, Y, Z, D, E>)。

  • tがに割り当て可能なunion<X1, X2... Xn>場合tはに割り当て可能Xです。
  • union<X1, X2... Xn>割り当てているtすべての場合Xにアサインされていますt

入力

入力として受け取ります:

  • クラス階層。クラス階層の入力方法を選択できます。ツリーの表現、または親のリストを含む各タイプ、またはクラス階層を正確に表すその他のものを入力できます。
  • 2つのタイプ(表記に一貫性がある限り、入力は柔軟ですが、これらのタイプを自由に受け取ることができます)。

出力

次の3つの一貫性の異なる値の出力1を意志、それらを呼び出すXYZ。2種類を考えるAB、出力X場合Aに代入されB、出力Yの場合はBに割り当て可能でA、出力Zそうでない場合(IFがAに割り当て可能であるBBに割り当て可能であるA、あなたを出力してもよいXY両方、または4番目の値)。


テストケース

フォーマット:

# 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ソリューションへのリンクです(テストケースと同じ方法で入力を取ります)。


これはコードゴルフなので、各言語の最小バイトがその言語に勝ちます!



ノー@ovs、Aは両親BとCがある
ソクラテスのフェニックス

@HalvardHummel謝罪 私は投稿を編集しました
Socratic Phoenix

相続するのか?
tsh

Aの両方がBに割り当て可能で、BがAに割り当て可能である場合、何を出力する必要がありますか?
tsh

回答:


3

Python 3、177バイト

c各タイプの親の辞書で、aかつbチェックするには、2つの表現です。タイプは文字列で表され、交差とユニオンは式のリストで表されます。最初の要素0は交差と1ユニオンに

戻り値0彼らは、お互いに割り当てていない場合1場合aに割り当て可能でb2場合bに割り当て可能であるa3の両方の場合は、お互いにアサインされています

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オブジェクトです。たとえば、2つのタイプがAありB、かつBその親であるA場合p{A:['B']}

交差タイプは abiその値がタイプの配列であるキーを持つJavaScriptオブジェクトおよびJavaScriptオブジェクトとしてますが、ユニオンタイプはキーですu。例えば、2種類の交点AとはBなり{i:['A','B']}

戻り値は、あるtrue場合aに割り当て可能でb1場合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に割り当て可能であるB1の場合は、Bに割り当て可能であるA0そうでありません。

非ゴルフ:

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