Co można przypisać do czego?

10

związane z


Co można przypisać do czego?

W tym wyzwaniu otrzymasz dwa typy Ai określisz, Bczy Amożna je przypisać B, czy Bmożna przypisać A, czy nie.

System typów

(Użyję tdo reprezentowania dowolnego typu)

Podstawowe typy

Typy podstawowe są reprezentowane przez jedną wielką literę, na przykład X. Są to w zasadzie klasy.

  • Xmożna przypisać, Yjeśli Yjest to ta sama klasa lub klasa nadrzędna X.

Rodzaje skrzyżowań

Typy skrzyżowań są reprezentowane przez intersect<X, Y>i mogą mieć dowolną liczbę typów między <znakami (np intersect<X, Y, Z, D, E>.).

  • tmożna przypisać, intersect<X1, X2... Xn>jeśli tmożna przypisać wszystkim X.
  • intersect<X1, X2... Xn>można przypisać, tjeśli którykolwiek Xjest przypisany t.

Rodzaje Unii

Typy Unii są reprezentowane przez union<X, Y>i mogą mieć dowolną liczbę typów między <znakami (np union<X, Y, Z, D, E>.).

  • tmożna przypisać, union<X1, X2... Xn>jeśli tmożna przypisać do dowolnego X.
  • union<X1, X2... Xn>można przypisać, tjeśli wszyscy Xsą przypisani t.

Wejście

Otrzymasz jako dane wejściowe:

  • Hierarchia klas. Możesz wybrać metodę wprowadzania danych dla hierarchii klas. Możesz wprowadzić reprezentację drzewa lub każdego typu z listą jego rodziców lub cokolwiek innego, co dokładnie reprezentuje hierarchię klas.
  • Dwa typy (dane wejściowe są elastyczne, o ile notacja jest spójna, możesz otrzymywać te typy w dowolny sposób).

Wynik

Będziesz jedno wyjście z trzech spójnych i wyraźnych wartości, nazywamy je X, Yi Z. Biorąc pod uwagę dwa rodzaje Ai Bwyjście X, jeżeli Ajest przypisane do Bwyjście Y, jeżeli Bjest przypisane do Ai wyjście Zinaczej (jeżeli Ajest przypisane do Bi Bjest przypisane do A, możesz wyjścia X, Yzarówno, lub wartość czwarty).


Przypadki testowe

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

Oto link do działającego nieakolowanego rozwiązania Java, którego można użyć do testowania (pobiera dane wejściowe w taki sam sposób jak przypadki testowe)


To jest golf golfowy, więc najmniej bajtów w każdym języku wygrywa dla tego języka!

Socratic Phoenix
źródło
Piaskownica (usunięty)
Socratic Phoenix
@ovs no, A ma rodziców B i C.
Socratic Phoenix
@HalvardHummel przeprosiny; Zredagowałem post
Socratic Phoenix
Czy odziedziczy koło?
tsh
Co powinno wynikać, jeśli oba A można przypisać do B, a B można przypisać do A?
tsh

Odpowiedzi:

3

Python 3 , 177 bajtów

cto słownik rodziców każdego typu ai bsą to dwa wyrażenia do sprawdzenia. Typy są reprezentowane przez ciągi, podczas gdy przecięcia i związki są reprezentowane przez listy z wyrażeniami, z pierwszym elementem ustawionym 0na przecięcie i 1zjednoczenie

Zwraca, 0jeśli nie można ich przypisać, 1jeśli amożna przypisać b, 2jeśli bmożna przypisać ai 3jeśli oba są przypisane sobie wzajemnie

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

Wypróbuj online!

Halvard Hummel
źródło
3

JavaScript (ES6), 138 bajtów

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

pjest mapą nadrzędną, która jest obiektem JavaScript, którego klucze są typami z rodzicami i których wartości są tablicami rodziców. Na przykład, jeśli istnieją dwa typy Aa Bi Bjest rodzicem Awtedy pbędzie {A:['B']}.

Typy przecięć są reprezentowane w ai bjako obiekt JavaScript z kluczem, iktórego wartością jest tablica typów, podczas gdy typy unii mają klucz u. Na przykład przecięcie dwóch typów Ai Bbyłoby {i:['A','B']}.

Zwracana jest wartość, truejeśli amożna ją przypisać b, 1jeżeli anie można jej przypisać, bale bmożna ją przypisać a, lub 0jeżeli żadna z nich nie jest wzajemnie przypisywalna.

Neil
źródło
2

C ++ 17,595 bajtów

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

Wypróbuj online!

Zmienny szablon, fktóry przyjmuje jako dane wejściowe niektóre typy i ich przecięcie i<...>lub połączenie u<...>i zwraca, -1jeśli Amożna go przypisać B i 1jeśli Bmożna go przypisać Ai w 0inny sposób.

Nie golfowany:

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

Stosowanie:

#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
źródło