Fakta kecil yang diketahui tentang vampir adalah bahwa mereka harus meminum darah korban yang memiliki golongan darah donor yang kompatibel. Matriks kompatibilitas untuk vampir sama dengan matriks donor / penerima sel darah merah biasa . Ini dapat diringkas oleh tabel Palang Merah Amerika berikut ini
Type You Can Give Blood To You Can Receive Blood From
A+ A+, AB+ A+, A-, O+, O-
O+ O+, A+, B+,AB+ O+, O-
B+ B+, AB+ B+, B-, O+, O-
AB+ AB+ everyone
A- A+, A-, AB+, AB- A-, O-
O- everyone O-
B- B+, B-, AB+, AB- B- O-
AB- AB+, AB- AB-, A-, B-, O-
Tantangan
Tulis fungsi atau program yang menggunakan golongan darah sebagai input dan menghasilkan dua daftar:
- daftar tipe yang tidak terurut yang dapat menerima donasi dari tipe input
- daftar tipe yang tidak berurutan yang dapat memberikan donasi pada tipe input
Jika Anda menulis suatu fungsi, maka tolong berikan juga program uji untuk memanggil fungsi itu dengan beberapa contoh, jadi saya dapat dengan mudah mengujinya. Dalam hal ini, program pengujian tidak akan menghitung skor Anda.
Memasukkan
Input harus berupa string yang mewakili tepat satu dari 8 jenis sel darah merah yang mungkin O−
O+
A−
A+
B−
B+
AB−
AB+
. Input dapat diberikan melalui metode normal (STDIN, arg baris perintah, argumen fungsi, dll).
Jika ada input lain yang diberikan maka program / fungsi harus mengembalikan output kosong atau melemparkan kesalahan. Biasanya pengecekan input yang ketat tidak bagus dalam pertanyaan kode-golf , tapi saya merasa diberi implikasi hidup-mati karena salah golongan darah sehingga saya harus menambahkan aturan ini.
Keluaran
Keluaran akan berupa dua daftar golongan darah yang dapat dibaca manusia dalam format apa pun yang sesuai untuk bahasa Anda. Dalam kasus khusus di mana salah satu daftar output berisi semua 8 jenis, daftar ini secara opsional dapat diganti dengan satu daftar item yang mengandung everyone
.
Output normal akan pergi ke salah satu tempat normal (STDOUT, pengembalian fungsi, dll).
Aturan lainnya
- Celah standar dilarang
- Anda dapat menggunakan pustaka pihak ke-3 apa pun yang sudah ada sebelumnya yang Anda butuhkan, asalkan tidak dirancang secara eksplisit untuk tujuan ini.
Contohnya
- Untuk input
AB-
, dua daftar keluaran adalah:{AB+, AB-}, {AB-, A-, B-, O-}
- Untuk input
AB+
, dua daftar keluaran adalah:{AB+}, {O−, O+, A−, A+, B−, B+, AB−, AB+}
atau{AB+}, {everyone}
Catatan pribadi: Silakan pertimbangkan untuk mendonorkan darah jika Anda mampu. Tanpa transfusi yang saya terima beberapa tahun yang lalu, saya mungkin tidak ada di sini hari ini, jadi saya merasa sangat berterima kasih kepada mereka yang mampu menyumbang!
sumber
Jawaban:
Klip , 69
Memasukkan:
AB-
Keluaran:
{{"AB+", "AB-"}, {"A-", "B-", "AB-", "O-"}}
Penjelasan
Golongan darah
x
dapat diberikany
jika semuax
antigen termasuk dalamy
. Program mendefinisikan fungsiF
sebagai apakahx
dapat memberiy
, danT
sebagai daftar jenis.sumber
Java 8, 373
Penjelasan
Jalankan di sini: http://repl.it/e98/1
Catatan yang
static
harus ditambahkan ke setiap metode untuk memanggil mereka dari metode utama.sumber
Pyth,
615950Jalankan di sini.
Penjelasan:
sumber
CJam, 64 byte
Bagian itu
m*:s
berasal dari jawaban CJam Martin . (Saya belum membaca bagian lain.)Masih akan ada beberapa masalah serius karena mereka tidak akan pernah yakin tentang urutan kedua daftar tersebut. Dan
Block ArrayList &
mungkin diimplementasikan dalam versi CJam nanti.Penjelasan
sumber
Javascript, 167
ungolfed:
fungsi pengujian:
Pengkodean golongan darah dalam biner memiliki keuntungan bahwa antigen lain (mis. Antigen Kell ) mudah dimasukkan ke dalam kode hanya dengan menambahkan bit lain.
Donasi darah di Zurich, CH: Blutspende Zürich
sumber
"O-O+B-B+A-A+AB-AB+".match(/\w+\W/g)
alih-alih"O- O+ B- B+ A- A+ AB- AB+".split(" ")
menyimpan 2 karakter."O-1O+1B-1B+1A-1A+1AB-1AB+".split(1)
dan menggunakan=>
fungsi juga harus menyimpan beberapa./\w+./g
n=2;while(n--)
=>for(n=2;n--;)
http://jsfiddle.net/j2hep8e8/2/
CJam, 94 byte
Wow, ini panjang ... sementara saya pikir saya mungkin bisa golf pendekatan ini di bawah 80, saya pikir saya mungkin telah melakukan lebih baik dengan pertama menghitung matriks dan kemudian hanya memilih baris dan kolom yang benar. Bagaimanapun, ini dia:
Uji di sini.
Saya akan menambahkan penjelasan ketika saya selesai bermain golf.
sumber
Groovy, 115
Idenya adalah untuk mengkodekan faktor A, B dan rhesus masing-masing satu bit. Kami kemudian dapat membalikkan bit untuk mendapatkan semua antigen pada sisi penerima dan menggunakannya untuk memeriksa bahwa tidak ada antibodi yang sesuai pada sisi pemberian. Ini kurang lebih sama dengan solusi JavaScript yang ada.
Eksekusi sampel
sumber
Prolog,
119110 byteKomentar :
Golongan darah memiliki sifat-sifat berikut: setiap kali Anda memiliki
-
(misalnyaa-
), Anda dapat memberikan kepada orang yang sama dengan orang yang memiliki setara positif dengan kelompok Anda (misalnyaa
), serta rekan negatif mereka (misalnyaa
memberiab
, jadia-
memberi kepadaab
danab-
). Berdasarkan pada properti ini, dan sedikit menyalahgunakan notasi untuk menggunakan operator minus dan plus, kami dapat memfaktorkan banyak kasus. Tolong beritahu saya jika Anda menemukannya dapat diterima . Jika Anda lebih suka memiliki sintaks (postfix) asli, berikut ini adalah versi non-golf:Ini adalah Prolog, sehingga lingkungan interaktif memungkinkan untuk menanyakan segala sesuatu seperti yang diminta (lihat contoh di bawah). Memang, kami tidak memiliki daftar ketat sebagai output, tetapi ini setara. Kami juga secara alami menangani kasus kesalahan sebagai konsekuensinya.
Contoh
Lalu, kita jalankan
test
:... yang, tanpa pemformatan yang tepat, adalah matriks yang sama dengan yang diberikan dalam pertanyaan.
Detail
Predikat
g/2
adalah memberi hubungan:g(X,Y)
berarti orang dari golongan darah X dapat memberikan darah kepada orang-orang dari golongan darah Y .Temukan penerima untuk grup
a
:Temukan penerima untuk
orange_juice
(harus gagal):Temukan donor untuk
O-
:Siapa yang bisa memberi apa? :
Kami tidak masuk ke loop rekursi tak terbatas (itu terjadi dalam tes pendahuluan).
sumber
Python, 187 byte
Pendekatan yang berbeda:
Mungkin bisa bermain golf lebih banyak.
Uji:
Keluaran:
sumber
Ruby,
237232223221210207 byteMemperbaiki beberapa garis miring terbalik di ekspresi reguler dan membuatnya jadi hanya mencetak daftar yang bertentangan dengan menyimpannya ke variabel dan kemudian mencetaknya. Terkadang Anda melewatkan hal-hal yang jelas ketika mencoba bermain golf!
Tidak Disatukan:
Pada dasarnya, saya membuat ekspresi reguler khusus untuk jenis darah yang dimasukkan untuk memeriksa apakah Anda dapat menyumbang ke jenis darah lain. Saya kemudian beralih melalui golongan darah dan menerapkan regex yang sama untuk mereka dan memeriksa apakah mereka dapat menyumbang ke yang ditentukan.
Ini mungkin bisa diturunkan lebih banyak lagi. Ini pertama kalinya saya mencoba kode golf, heh.
sumber
Python 2, 168 byte
Ini adalah metode yang sama dengan jawaban Blackhole. Keluar dengan kesalahan jika parameter tidak ditemukan dalam daftar tipe.
Kurang bermain golf:
Jalankan di sini: http://repl.it/eaB
Saya juga mencoba beberapa perubahan kecil lainnya, tetapi tidak bisa lebih pendek ...
sumber
PHP (287 bytes):
Ya, ini cukup panjang, tetapi berfungsi seperti yang diharapkan.
Dimungkinkan untuk mempersingkat banyak:
Ini tidak mudah dibaca dan tidak mudah untuk ditulis.
Ini berfungsi sebagaimana mestinya, menghasilkan yang dapat Anda berikan dan yang Anda dapat terima dari pada baris lain.
Ini membutuhkan parameter URL
T=
dengan jenisnya.sumber
CJam, 80 byte
Ini masih terlalu lama. Mungkin saya bisa mengurangi 4 hingga 5 byte lebih banyak.
Untuk input yang tidak valid, mencetak array kosong, atau melempar kesalahan.
Cobalah online di sini atau jalankan seluruh test suite
sumber
APL, 66
Coba di sini.
sumber
C, 224
De-golfed itu menunjukkan:
sumber
PHP -
215212206 byteIni adalah versi yang tidak dikoleksi:
Berkat manatwork karena telah menghemat 4 byte.
sumber
explode(1,'A+1O+1B+1AB+1A-1O-1B-1AB-')
. Dan karena kita tidak selalu mengikuti kebiasaan pengkodean yang bagus, kadang-kadang kita menggunakan fitur yang sudah usang, sepertisplit()
fungsinya.Perl, 107
112Akhirnya, pengkodean nama tipe dalam angka memberi kode yang lebih pendek.
Versi yang lebih lama
sumber
Pyth, 58
Sebagian sama dengan solusi orlp , tetapi agak berbeda dan sepenuhnya dirancang sendiri.
Penjelasan
sumber
J, 120 byte
Fungsi gagal pada input yang tidak valid. Angka desimal besar adalah penyandian dari matriks kompatibilitas penuh.
(Solusi yang sangat panjang karena berbagai alasan.)
Cobalah online di sini.
sumber
05AB1E , 29 byte
Cobalah online!
sumber