Cosa è assegnabile a cosa?
In questa sfida vi sarà dato due tipi, A
e B
e determinare se A
è assegnabile a B
, B
è assegnabile a A
, o nessuno dei due.
Il sistema di tipi
(Userò t
per rappresentare qualsiasi tipo)
Tipi di base
I tipi di base sono rappresentati da una singola lettera maiuscola, ad esempio X
. Sono sostanzialmente delle classi.
X
è assegnabile aY
ifY
è uguale o di una classe padre diX
.
Tipi di intersezione
I tipi di intersezione sono rappresentati da intersect<X, Y>
e possono avere un numero qualsiasi di tipi tra quelli <
(ad es intersect<X, Y, Z, D, E>
.).
t
è assegnabile aintersect<X1, X2... Xn>
ift
è assegnabile a tuttiX
.intersect<X1, X2... Xn>
è assegnabile at
se neX
è assegnabile unat
.
Tipi di unione
I tipi di unione sono rappresentati da union<X, Y>
e possono avere un numero qualsiasi di tipi tra <
i (ad es union<X, Y, Z, D, E>
.).
t
è assegnabile aunion<X1, X2... Xn>
set
è assegnabile a nessunoX
.union<X1, X2... Xn>
è assegnabile at
se tuttiX
sono assegnabili at
.
Ingresso
Riceverai come input:
- La gerarchia di classi. È possibile scegliere il metodo di input per la gerarchia di classi. Puoi inserire una rappresentazione di un albero, o ogni tipo con un elenco dei suoi genitori, o qualsiasi altra cosa che rappresenti accuratamente la gerarchia di classi.
- Due tipi (l'input è flessibile, purché la notazione sia coerente, potresti ricevere questi tipi come preferisci).
Produzione
Si sarà in uscita uno dei tre valori costanti ed evidenti, li chiamano X
, Y
e Z
. Dati due tipi A
e B
, in uscita X
, se A
è assegnabile a B
, uscita Y
se B
è assegnabile ad A
e l'uscita Z
in caso contrario (se A
è assegnabile a B
ed B
è assegnabile a A
, si può in uscita X
, Y
sia, o un quarto valore).
Casi test
Formato:
# 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
Ecco un link a una soluzione Java non golf funzionante che puoi utilizzare per i test (accetta input nello stesso modo dei casi di test)
Questo è code-golf, quindi vince meno byte in ogni lingua per quella lingua!