Apa yang ditugaskan untuk apa?
Dalam tantangan ini Anda akan diberikan dua jenis, A
dan B
dan menentukan apakah A
dapat ditugaskan B
, B
dapat ditugaskan A
, atau tidak.
Sistem Jenis
(Saya akan gunakan t
untuk mewakili jenis apa pun)
Tipe Dasar
Jenis dasar diwakili oleh satu huruf kapital, seperti X
. Mereka pada dasarnya adalah kelas.
X
ditugaskan untukY
apakahY
sama dengan, atau kelas induk dariX
.
Jenis persimpangan
Tipe titik-temu diwakili oleh intersect<X, Y>
, dan dapat memiliki sejumlah tipe di antara titik-titik <
(misalnya intersect<X, Y, Z, D, E>
).
t
ditugaskan untukintersect<X1, X2... Xn>
jikat
ditugaskan untuk semuaX
.intersect<X1, X2... Xn>
ditugaskant
jika adaX
yang ditugaskant
.
Jenis Serikat
Jenis-jenis serikat diwakili oleh union<X, Y>
dan dapat memiliki sejumlah jenis antara <
(misalnya union<X, Y, Z, D, E>
).
t
ditugaskan untukunion<X1, X2... Xn>
jikat
ditugaskan untukX
.union<X1, X2... Xn>
ditugaskant
jika semuaX
ditugaskan untukt
.
Memasukkan
Anda akan menerima sebagai masukan:
- Hirarki kelas. Anda dapat memilih metode input untuk hirarki kelas. Anda bisa memasukkan representasi pohon, atau setiap jenis dengan daftar orang tuanya, atau apa pun yang secara akurat mewakili hierarki kelas.
- Dua jenis (input fleksibel, selama notasi konsisten, Anda dapat menerima jenis ini sesuka Anda).
Keluaran
Anda akan menampilkan salah satu dari tiga nilai yang konsisten dan berbeda, memanggil mereka X
, Y
dan Z
. Mengingat dua jenis A
dan B
, keluaran X
jika A
ini dialihkan ke B
, keluaran Y
jika B
ini dialihkan ke A
dan output Z
sebaliknya (Jika A
adalah dialihkan ke B
dan B
merupakan dialihkan untuk A
, Anda mungkin keluaran X
, Y
, baik, atau nilai keempat).
Uji Kasus
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
Berikut ini tautan ke solusi Java yang tidak dikenali dan berfungsi yang dapat Anda gunakan untuk pengujian (dibutuhkan input dengan cara yang sama dengan kasus pengujian)
Ini adalah kode-golf, jadi paling tidak byte dalam setiap bahasa menang untuk bahasa itu!
sumber
Jawaban:
Python 3 , 177 byte
c
adalah kamus orang tua dari masing-masing jenis,a
danb
merupakan dua ekspresi yang harus diperiksa. Jenis diwakili oleh string, sedangkan persimpangan dan serikat diwakili oleh daftar dengan ekspresi, dengan elemen pertama diatur untuk0
untuk memotong dan1
untuk persatuanMengembalikan
0
jika mereka tidak dapat ditugaskan satu sama lain,1
jikaa
ditugaskan untukb
,2
jikab
ditugaskan kea
dan3
jika keduanya ditugaskan satu sama lainCobalah online!
sumber
JavaScript (ES6), 138 byte
p
adalah peta induk, yang merupakan objek JavaScript yang kuncinya adalah tipe dengan orang tua dan yang nilainya adalah array dari induk. Misalnya, jika ada dua jenisA
danB
danB
merupakan indukA
makap
akan menjadi{A:['B']}
.Tipe titik-temu direpresentasikan dalam
a
danb
sebagai objek JavaScript dengan kuncii
yang nilainya adalah array tipe, sedangkan tipe union memiliki kunciu
. Misalnya, persimpangan dua jenisA
danB
akan menjadi{i:['A','B']}
.Nilai kembali adalah
true
jikaa
ditugaskan untukb
,1
jikaa
tidak ditugaskanb
tetapib
dapat ditugaskan kea
, atau0
jika tidak ada yang ditugaskan satu sama lain.sumber
C ++ 17, 595 byte
Cobalah online!
Templat variabel
f
yang menerima sebagai input beberapa jenis dan persimpangani<...>
atau gabunganu<...>
dari mereka dan mengembalikan-1
jikaA
ditugaskanB
dan1
jikaB
ditugaskanA
dan0
sebaliknya.Tidak Disatukan:
Pemakaian:
sumber