무엇에 할당 할 수 있습니까?


10

관련


무엇에 할당 할 수 있습니까?

이 문제에서 당신은 두 가지 유형 주어진 것이다 AB및 있는지 확인 A에 할당 할 것입니다 B, B에 할당 할 A, 또는 둘 다.

타입 시스템

( t모든 유형을 나타내는 데 사용 합니다)

기본 유형

기본 유형은과 같은 단일 대문자로 표시됩니다 X. 그들은 기본적으로 수업입니다.

  • XYif 가와 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있습니다.

입력

당신은 입력으로 받게됩니다 :

  • 클래스 계층. 클래스 계층에 대한 입력 방법을 선택할 수 있습니다. 트리의 표현 또는 각 유형을 부모 목록 또는 클래스 계층 구조를 정확하게 나타내는 다른 이름으로 입력 할 수 있습니다.
  • 두 가지 유형 (표기법이 일관된 한 입력은 유연하지만 원하는대로 이러한 유형을받을 수 있습니다).

산출

세 가지 일관되고 고유 값의 출력을 것입니다, 그들에게 전화 X, Y하고 Z. 두 가지 유형을 감안할 AB출력, X경우 A에 할당 할 B출력 Y하는 경우는 B에 할당 할 A및 출력 Z, 그렇지 않으면 (경우 A에 양도 할 BB에 할당 할 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 솔루션에 대한 링크입니다 (테스트 케이스와 동일한 방식으로 입력이 필요함 ).


이것은 코드 골프이므로 각 언어의 최소 바이트가 해당 언어에서 승리합니다!



@ovs 아니오, A에는 부모 B와 C가 있습니다.
Socratic Phoenix

@HalvardHummel 사과합니다; 게시물을 수정했습니다
Socratic Phoenix

원을 상속 받습니까?
tsh

A가 B에 할당 가능하고 B가 A에 할당 가능하면 어떻게 출력해야합니까?
tsh

답변:


3

파이썬 3 , 177 바이트

c각 유형의 부모의 사전입니다, a그리고 b확인하는 두 가지 표현이다. 유형은 문자열로 표시되고 교차 및 결합은 표현식이있는 목록으로 표시되며 첫 번째 요소 0는 교차 및 1결합으로 설정됩니다.

0서로 할당 할 수없는 1경우, a에 할당 가능한 경우 b, 할당 가능한 경우 및 둘 다 서로 할당 가능한 경우를 리턴 합니다.2ba3

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

자바 스크립트 (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 객체입니다. 예를 들어,이 두 가지 유형의 경우 ABB의 부모 인 A다음 p것은 {A:['B']}.

교차 유형은 값이 유형의 배열 인 키를 가진 JavaScript 객체로 표시되고 a, 결합 유형은 b키를 갖는 JavaScript 객체로 표시됩니다 . 예를 들어, 두 가지 유형의 교차 하고 있을 것이다 .iuAB{i:['A','B']}

반환 값은 trueif a에 할당 할 수있는 경우 b, 할당 할 수 없지만 할당 할 수있는 경우 또는 서로 할당 할 수없는 경우입니다.1abba0


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.