Cosa è assegnabile a cosa?
In questa sfida vi sarà dato due tipi, Ae Be determinare se Aè assegnabile a B, Bè assegnabile a A, o nessuno dei due.
Il sistema di tipi
(Userò tper 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 aYifYè 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 atse 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 atse tuttiXsono 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, Ye Z. Dati due tipi Ae B, in uscita X, se Aè assegnabile a B, uscita Yse Bè assegnabile ad Ae l'uscita Zin caso contrario (se Aè assegnabile a Bed Bè assegnabile a A, si può in uscita X, Ysia, 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!