Diberikan daftar kemenangan, kekalahan dan seri, hasil dari setiap pertandingan di turnamen olahraga

11

Pertanyaan ini terinspirasi oleh turnamen berkelanjutan "permainan hooligan yang dimainkan oleh tuan-tuan", Piala Dunia Rugby , yang baru saja menyelesaikan babak penyisihan. Ada 20 tim di turnamen, dan mereka dibagi menjadi 4 kelompok masing-masing 5 tim. Selama tahap pool, setiap tim bermain melawan semua tim lain di pool mereka (total 10 pertandingan per pool), dan 2 tim teratas dari masing-masing pool maju ke babak sistem gugur.

Di akhir tahapan pool ada tabel untuk setiap pool yang menunjukkan jumlah kemenangan, kekalahan dan draw untuk masing-masing tim. Tantangan untuk pertanyaan ini adalah menulis sebuah program yang memasukkan jumlah kemenangan, kerugian, dan hasil imbang untuk masing-masing tim dalam kumpulan, dan dari informasi itu dihasilkan hasil masing-masing dari masing-masing dari 10 pertandingan (siapa yang menang, kalah atau seri melawan siapa ) jika mungkin atau mengeluarkan pesan kesalahan jika tidak.

Sebagai contoh, berikut adalah tabel untuk Pool D turnamen tahun ini:

            Win    Loss    Draw
Canada        0       4       0
France        3       1       0
Ireland       4       0       0
Italy         2       2       0
Romania       1       3       0

Dari informasi ini, kita dapat menyimpulkan bahwa Irlandia menang melawan Kanada, Prancis, Italia dan Rumania, karena mereka memenangkan semua pertandingan mereka. Prancis pasti menang melawan Kanada, Italia, dan Rumania tetapi kalah dari Irlandia, karena mereka hanya kalah satu dan itu pasti ke Irlandia yang tak terkalahkan. Kami baru mengetahui bahwa Italia kalah dari Irlandia dan Prancis, jadi mereka pasti menang melawan Kanada dan Rumania. Kanada kehilangan semua pertandingan mereka, dan kemenangan Rumania pastilah melawan Kanada.

         Canada  France Ireland   Italy Romania
Canada        -       L       L       L       L
France        W       -       L       W       W
Ireland       W       W       -       W       W
Italy         W       L       L       -       W
Romania       W       L       L       L       -

Berikut ini contoh (fiksi) yang lebih rumit:

            Win    Loss    Draw
Canada        3       1       0
France        1       2       1
Ireland       0       3       1
Italy         0       2       2
Romania       4       0       0

Dalam hal ini, kita dapat menyimpulkan bahwa Rumania menang melawan Kanada, Prancis, Italia dan Irlandia, karena mereka memenangkan semua pertandingan mereka. Kanada pasti menang melawan Irlandia, Italia, dan Prancis tetapi kalah dari Rumania. Kami baru saja mengetahui bahwa Italia kalah dari Rumania dan Kanada, jadi mereka pasti imbang melawan Prancis dan Irlandia. Itu berarti Irlandia bermain imbang dengan Italia dan kalah dari yang lain, dan karena itu Prancis harus mengalahkan Irlandia, imbang dengan Italia dan kalah dari Kanada dan Rumania.

         Canada  France Ireland   Italy Romania
Canada        -       W       W       W       L
France        L       -       W       D       L
Ireland       L       L       -       D       L
Italy         L       D       D       -       L
Romania       W       W       W       W       -

Beberapa tabel tidak dapat dipecahkan, misalnya Pool B tahun ini, di mana 3 tim mendapatkan total W / L / D yang sama:

            Win    Loss    Draw
Japan         3       1       0
Samoa         1       3       0
Scotland      3       1       0
South Africa  3       1       0
United States 0       4       0

Namun beberapa tabel dengan duplikat baris dapat dipecahkan, seperti yang ini (fiksi):

            Win    Loss    Draw
Japan         4       0       0
Samoa         0       3       1
Scotland      2       2       0
South Africa  0       3       1
United States 3       1       0

Memasukkan

Program atau fungsi Anda harus menerima 15 angka yang menetapkan total kemenangan, kekalahan, dan hasil imbang untuk masing-masing dari 5 tim. Anda dapat menggunakan pembatas yang Anda inginkan, memasukkan angka dalam urutan utama baris atau kolom, dan menerima angka baik melalui stdin atau diteruskan melalui array ke fungsi.

Karena menang + kalah + undian = 4, Anda dapat menghilangkan salah satu nilai dan menyelesaikannya dari yang lain jika diinginkan, artinya Anda hanya perlu memasukkan 10 angka.

Anda tidak perlu memasukkan nama tim apa pun.

Input sampel:

3 1 0
1 2 1
0 3 1
0 2 2
4 0 0

Keluaran

Output program atau fungsi Anda harus dalam bentuk grid 5 x 5 yang dicetak ke stdout, atau array yang dikembalikan dari suatu fungsi. Setiap elemen harus menentukan apakah tim yang diberikan di posisi baris menang, kalah atau seri melawan tim di posisi kolom. Urutan baris untuk output harus sesuai dengan input. Anda dapat menentukan apa yang menunjukkan menang, kalah atau seri, sehingga huruf W, L, D atau digit 0 1 2 atau apa pun yang Anda inginkan dapat digunakan selama keduanya didefinisikan dengan jelas dan dapat dibedakan satu sama lain. Elemen diagonal tidak terdefinisi, Anda dapat menampilkan apa saja, tetapi harus sama dalam setiap kasus. Nilai dapat dipisahkan dengan koma, spasi atau karakter apa pun yang Anda suka, atau bukan karakter. Baik input maupun output dapat diformat dengan semua nilai pada satu baris jika diinginkan.

Jika sebuah tabel tidak memiliki solusi unik maka Anda harus menampilkan pesan kesalahan sederhana pilihan Anda.

Output sampel:

- W W W L
L - W D L
L L - D L
L D D - L
W W W W -

Contoh output untuk tabel yang tidak dapat diselesaikan:

dunno mate

Ini adalah kode golf sehingga program terpendek dalam byte menang.

Pic terkait (Jepang versus Afrika Selatan):

masukkan deskripsi gambar di sini

samgak
sumber

Jawaban:

4

CJam, 57 49 47 45 byte

{JZb:af{.*e_1+e!}:m*:e_5f/{_z2\ff-=},_,(0@?~}

Ini adalah fungsi anonim yang muncul array dua dimensi dari tumpukan dan meninggalkan satu sebagai balasannya. Berisi 2untuk menang, 1untuk seri dan 0untuk kekalahan. Ini juga mengandung 1elemen diagonal, di mana Anda dapat menampilkan apa pun . Jika masalah tidak dapat dipecahkan, fungsi kembali -1.

Kode akan berfungsi online, tetapi akan butuh waktu. Cobalah di penerjemah CJam .

Uji coba

$ cat input
3 1 0
1 2 1
0 3 1
0 2 2
4 0 0
$ time cjam results.cjam < input
[1 2 2 2 0]
[0 1 2 1 0]
[0 0 1 1 0]
[0 1 1 1 0]
[2 2 2 2 1]

real    0m1.584s
user    0m4.020s
sys     0m0.146s

Bagaimana itu bekerja

JZb:a e# Push 19 in base 3; wrap each digit in an array. Pushes [[2] [0] [1]].
f{    e# For each row of the input, push it and [[2] [0] [1]]; then:
  .*  e# Repeat 2, 0 and 1 (win, loss, draw) the specified number of times.
  e_  e# Flatten the resulting array.
  1+  e# Append a 1 for the diagonal.
  e!  e# Push all possible permutations.
}     e#
:m*   e# Cartesian product; push all possible combinations of permutations.
:e_   e# Flatten the results.
5f/   e# Split into rows of length 5.
{     e# Filter:
  _z  e#   Push a transposed copy of the array.
  2\  e#   Swap the result with 2.
  ff- e#   Subtract all elements from 2.
  =   e#   Check for equality.
},    e# Keep the element if `=' pushed 1.
_,(   e# Get the length of the array of solutions and subtract 1.
0@?   e# Keep the array for length 1, push 0 otherwise.
~     e# Either dump the singleton array or turn 0 into -1.
Dennis
sumber
4

Haskell, 180 177 bytes

import Data.List
z=zipWith
m=map
a#b|(c,d)<-splitAt a b=c++[0]++d
f t=take 1[x|x<-m(z(#)[0..])$sequence$m(permutations.concat.z(flip replicate)[1,-1,0])t,transpose x==m(m(0-))x]

Kemenangan ditampilkan sebagai 1, kekalahan -1dan imbang sebagai 0. Elemen diagonal juga 0. Tabel yang tidak dapat diselesaikan adalah daftar kosong, yaitu [].

Contoh penggunaan: f [[3,1,0],[1,2,1],[0,3,1],[0,2,2],[4,0,0]]-> [[[0,1,1,1,-1],[-1,0,1,0,-1],[-1,-1,0,0,-1],[-1,0,0,0,-1],[1,1,1,1,0]]].

Cara kerjanya: brute force! Buat daftar menang / kalah / seri sesuai dengan input, mis. [3,1,0]-> [1,1,1,-1], permute, bangun semua kombinasi, masukkan diagonal dan simpan semua tabel yang sama dengan transposisi mereka dengan semua elemen dinegasikan. Ambil yang pertama.

nimi
sumber