Latar Belakang
Pertimbangkan turnamen round-robin, di mana setiap kontestan memainkan satu pertandingan melawan setiap kontestan lainnya. Tidak ada pengundian, sehingga setiap pertandingan memiliki pemenang dan pecundang. Seorang kontestan A adalah raja turnamen, jika untuk setiap lainnya kontestan B , baik A mengalahkan B , atau A mengalahkan lain kontestan C yang pada gilirannya beat B . Dapat ditunjukkan bahwa setiap turnamen memiliki setidaknya satu raja (walaupun mungkin ada beberapa). Dalam tantangan ini, tugas Anda adalah menemukan raja-raja dari turnamen yang diberikan.
Masukan dan keluaran
Input Anda adalah N × N
matriks boolean T
, dan opsional jumlah N ≥ 2
kontestan. Setiap entri T[i][j]
mewakili hasil pertandingan antara kontestan i
dan j
, dengan nilai 1 mewakili menang untuk i
dan 0 menang untuk j
. Perhatikan bahwa T[i][j] == 1-T[j][i]
jika i != j
. Diagonal T
terdiri dari 0s.
Output Anda akan menjadi daftar raja di turnamen yang T
mewakili, menggunakan pengindeksan berbasis 0 atau 1. Urutan raja tidak relevan, tetapi tidak boleh ada duplikat.
Baik input maupun output dapat diambil dalam format apa pun yang masuk akal.
Aturan dan penilaian
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Uji kasus
Kasing uji ini menggunakan pengindeksan berbasis 0. Untuk pengindeksan berbasis 1, tambahkan setiap nilai output.
2 [[0,0],[1,0]] -> [1]
3 [[0,1,0],[0,0,0],[1,1,0]] -> [2]
3 [[0,1,0],[0,0,1],[1,0,0]] -> [0,1,2]
4 [[0,1,1,1],[0,0,1,0],[0,0,0,0],[0,1,1,0]] -> [0]
4 [[0,1,1,0],[0,0,1,0],[0,0,0,1],[1,1,0,0]] -> [0,2,3]
5 [[0,1,0,0,1],[0,0,0,0,1],[1,1,0,0,0],[1,1,1,0,1],[0,0,1,0,0]] -> [3]
5 [[0,1,0,1,0],[0,0,1,1,1],[1,0,0,0,0],[0,0,1,0,1],[1,0,1,0,0]] -> [0,1,4]
5 [[0,0,0,0,0],[1,0,1,1,0],[1,0,0,0,1],[1,0,1,0,1],[1,1,0,0,0]] -> [1,3,4]
6 [[0,0,0,0,0,0],[1,0,1,1,0,0],[1,0,0,1,1,0],[1,0,0,0,1,1],[1,1,0,0,0,1],[1,1,1,0,0,0]] -> [1,2,3,4,5]
6 [[0,0,1,1,1,0],[1,0,0,1,1,1],[0,1,0,0,1,0],[0,0,1,0,0,1],[0,0,0,1,0,1],[1,0,1,0,0,0]] -> [0,1,2,3,5]
6 [[0,1,1,0,0,1],[0,0,0,1,0,1],[0,1,0,1,1,0],[1,0,0,0,1,1],[1,1,0,0,0,0],[0,0,1,0,1,0]] -> [0,1,2,3,4,5]
8 [[0,0,1,1,0,1,1,1],[1,0,1,0,1,1,0,0],[0,0,0,1,1,0,0,0],[0,1,0,0,0,1,0,0],[1,0,0,1,0,1,0,0],[0,0,1,0,0,0,1,0],[0,1,1,1,1,0,0,1],[0,1,1,1,1,1,0,0]] -> [0,1,4,6,7]
20 [[0,0,1,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,0,1],[1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1],[0,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,1],[0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,1],[1,0,1,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,0,1],[0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,1,0,1],[0,0,1,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,0],[1,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,1,0],[1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,1,1],[1,0,1,0,1,0,1,1,0,0,1,0,0,0,0,1,0,1,1,1],[1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0],[0,1,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,0,1,1],[0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1],[1,0,1,1,1,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1],[0,0,1,0,0,0,0,1,0,1,1,0,0,0,0,1,1,0,0,1],[0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,1],[0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,1,1],[0,0,1,0,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,1],[1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0]] -> [0,1,3,4,5,7,8,11,15,17,18]
Jawaban:
Matlab,
36 3529 byteMari kita cari tahu apakah
i
itu raja. Kemudian untuk setiapj
nilainyaT[i][j]==1 OR there is a k such that T[i][k] * T[k][l] == 1
. Tetapi kondisi kedua juga bisa digantikan olehsum_over_k(T[i][k] * T[k][l])>0
, tetapi ini hanyalah entri dari matriksT*T
(jika Anda anggapT
sebagai matriks). TheOR
kemudian dapat diputar dengan menambahkanT
untuk hasil itu, jadi kami hanya harus memeriksa apakahn-1
nilai-nilai dari barisi
dariT*T+T
yang lebih besar dari nol, untuk melihat apakahi
adalah raja. Inilah yang fungsi saya lakukan.(Ini MATLAB, jadi indeksnya berbasis 1).
Matriks MATLAB harus dikodekan dengan titik koma sebagai pembatas garis:
sumber
size(T,1)
Jelly,
131211 byteOutput berbasis 1. Cobalah online!
Atau, menggunakan operator bitwise alih-alih manipulasi array:
Sekali lagi, output berbasis 1. Cobalah online!
Latar Belakang
Untuk kontestan A , kita dapat menemukan semua B sehingga A mengalahkan C beat B dengan mengambil semua baris yang bersesuaian dengan C sehingga C mengalahkan A . IFR B th masuknya C th adalah 1 , kita mendapati bahwa C mengalahkan B .
Jika kita menghitung OR logis dari semua entri yang sesuai dari kolom yang dipilih, kita mendapatkan aa vektor tunggal yang menunjukkan apakah beat A dengan transitivity atau tidak. Akhirnya, ORing vektor yang dihasilkan dengan baris yang sesuai dari matriks input memberikan Boolean apakah A beat B , baik dengan transitivitas atau langsung.
Mengulangi ini untuk setiap baris, kita menghitung jumlah 1 's di setiap vektor, karena menghitung jumlah kontestan masing-masing A beat. Jumlah maksimal sesuai dengan raja-raja turnamen.
Bagaimana itu bekerja
sumber
Python menggunakan numpy, 54 byte
Dibawa dalam matriks numpy, menghasilkan matriks baris numpy dari indeks berbasis 0.
Cara lain untuk memikirkan seorang raja adalah sebagai kontestan yang semua kontestan berada dalam persatuan raja, orang-orang yang dikalahkan raja, dan orang-orang yang dikalahkan orang. Dengan kata lain, untuk setiap kontestan, ada jalur panjang maksimal 2 dari raja ke mereka di antara hubungan "beat".
Matriks
I + M + M*M
mengkodekan jumlah lintasan 0, 1, atau 2 langkah dari setiap sumber ke setiap target. Seorang pemain adalah raja jika baris mereka dari matriks ini hanya memiliki entri positif. Karena 0 adalah Falsey, beriall
tahu kami jika satu baris tidak nol. Kami menerapkan ini pada setiap baris dan menampilkan indeks hasil bukan nol.sumber
JavaScript (ES6), 83 byte
sumber
MATL ,
12109 byteInput adalah: pertama jumlah kontestan, dan pada baris terpisah sebuah matriks dengan baris yang dipisahkan oleh titik koma. Output berbasis 1.
Sebagai contoh, test case kelima memiliki input
dan test case terakhir memiliki input
Cobalah online!
Penjelasan
sumber
Javascript
136131121112 bytePanggilan menggunakan:
hati-hati karena output 1-diindeks (disimpan beberapa byte tidak mencoba untuk menyaring 0s vs kesalahan)
sumber