Враховуючи таблицю перемог, втрат та нічиїх, виведіть результат кожного матчу у спортивному турнірі


11

Це питання натхненний триваючим турніром "хуліганська гра, яку грають панове", чемпіонат світу з регбі , який щойно завершив етап басейну. На турнірі 20 команд, і вони розділені на 4 пули по 5 команд. Під час етапу в басейні кожна команда грає проти всіх інших команд у своєму пулі (всього 10 матчів на пул), а 2 найкращі команди кожного пулу просуваються до етапу вибивання.

В кінці етапу пулу є таблиця для кожного пулу, яка показує кількість виграшів, програшів та розіграшів для кожної команди. Завдання цього питання полягає в тому, щоб написати програму, яка вводить кількість виграшів, програшів та нічиїх для кожної команди в пулі, і з цієї інформації виводяться індивідуальні результати кожного з 10 матчів (хто виграв, програв чи нічия проти кого ) по можливості або виводить повідомлення про помилку, якщо ні.

Наприклад, ось таблиця для пулу D цьогорічного турніру:

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

З цієї інформації можна зробити висновок, що Ірландія виграла проти Канади, Франції, Італії та Румунії, оскільки вони виграли всі свої ігри. Франція, мабуть, перемогла проти Канади, Італії та Румунії, але програла Ірландії, бо вона програла лише одну, і це, мабуть, було непереможеною Ірландією. Ми тільки що з’ясували, що Італія програла Ірландії та Франції, тому вони, мабуть, перемогли проти Канади та Румунії. Канада програла всі свої ігри, і тому перемога Румунії, мабуть, була проти Канади.

         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       -

Ось більш складний (вигаданий) приклад:

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

У цьому випадку можна зробити висновок, що Румунія перемогла проти Канади, Франції, Італії та Ірландії, оскільки виграла всі свої ігри. Канада, мабуть, перемогла проти Ірландії, Італії та Франції, але програла Румунії. Ми тільки що з’ясували, що Італія програла Румунії та Канаді, тому вони, мабуть, поступилися проти Франції та Ірландії. Це означає, що Ірландія виїжджала з Італією і програвала всім іншим, а тому Франція, мабуть, перемогла Ірландію, виграла з Італією і програла Канаді та Румунії.

         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       -

Деякі таблиці є нерозв’язними, наприклад, цьогорічний пул B, в якому 3 команди отримали стільки ж W / L / D підсумків:

            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

Однак деякі таблиці з повторюваними рядками вирішувані, як ця (вигадана):

            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

Вхідні дані

Ваша програма чи функція повинні приймати 15 чисел із зазначенням виграшу, програшу та підсумкових підсумків для кожної з 5 команд. Ви можете використовувати будь-який роздільник, який ви хочете, вводити числа в основному порядку рядків або стовпців і приймати цифри або через stdin, або передаватися через масив до функції.

Оскільки виграш + програш + нічия = 4, ви можете опустити одне із значень і, якщо хочете, опрацювати його з інших, це означає, що вам потрібно лише ввести 10 чисел.

Вам не потрібно вводити імена команд.

Зразок введення:

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

Вихідні дані

Вихід програми або функції має бути у вигляді сітки 5 x 5, надрукованої в stdout, або масиву, повернутого з функції. Кожен елемент повинен вказати, чи виграла, програла чи нічия проти команди в позиції стовпця команда, що була надана у рядковій позиції. Упорядкування рядків для виводу має відповідати вхідному. Ви можете визначити, що позначає виграш, програш або нічию, тому букви W, L, D або цифри 0 1 2 або що завгодно можна використовувати, якщо вони чітко визначені і їх можна відрізнити одна від одної. Діагональні елементи не визначені, ви можете вивести що завгодно, але це має бути однаково у кожному випадку. Значення можна розділити комами, пробілами або будь-яким символом, який вам подобається, або не символом. Як бажання, так і вихідні дані можуть бути відформатовані з усіма значеннями в одному рядку.

Якщо таблиця не має унікального рішення, ви повинні вивести просте повідомлення про помилку на ваш вибір.

Вибірка зразка:

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

Вибірка зразка для нерозв'язної таблиці:

dunno mate

Це кодовий гольф, тому найкоротша програма в байтах виграє.

Піктограма (Японія проти Південної Африки):

введіть тут опис зображення

Відповіді:


4

CJam, 57 49 47 45 байт

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

Це анонімна функція, яка вискакує двовимірний масив зі стека і залишає один натомість. Він містить 2виграші, 1розіграші та 0програші. Він також містить 1елементи діагоналі, для яких можна вивести що завгодно . Якщо проблема не вирішена, функція повертається -1.

Код буде працювати в Інтернеті, але це займе певний час. Спробуйте це в інтерпретаторі CJam .

Тестовий запуск

$ 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

Як це працює

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.

4

Haskell, 180 177 байт

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]

Виграш відображається як 1, втрата як -1і нічия як 0. Діагональні елементи також є 0. Нерозв’язні таблиці - це порожні списки, тобто [].

Приклад використання: 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]]].

Як це працює: груба сила! Створіть список виграшів / програшів / розіграшів відповідно до введених даних, наприклад [3,1,0]-> [1,1,1,-1], перестановка, побудова всіх комбінацій, вставлення діагоналей і збереження запереченням усіх таблиць, рівних їх переміщенню, з усіма елементами. Візьміть перший.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.