Чи може моя улюблена команда все-таки стати чемпіоном з футболу?


10

Як фанат найбільш успішної футбольної команди BE , наприкінці сезону я часто задаюся питанням, чи є у моєї улюбленої команди ще якийсь теоретичний шанс стати чемпіоном. Ваше завдання в цьому виклику - відповісти на це питання для мене.

Вхідні дані

Ви отримаєте три входи: поточну таблицю, список решти матчів та поточну позицію команди, яка нас цікавить.

Input 1: поточна таблиця , послідовність чисел , були я -й числом є точками , отриманої командою я до сих пір. Наприклад, вхід [93, 86, 78, 76, 75]кодує наступну таблицю (важливий лише останній стовпець):

таблиця вищої ліги


Введення 2 : Решта матчів , послідовність кортежів, де кожен кортеж ( i , j ) означає збіг між командою i та j . У наведеному вище прикладі другий вклад [(1,2), (4,3), (2,3), (3,2), (1,2)]означатиме, що решта збігів:

Chelsea vs Tottenham, Liverpool vs Man. City, Tottenham vs Man. City, Man. City vs Tottenham, Chelsea vs Tottenham

Input 3: поточний стан . Команди ми зацікавлені в тому, наприклад, введення 2для наведеного вище прикладу буде означати, що ми хотіли б знати , чи може Тоттенхем ще стати чемпіоном.

Вихідні дані

Для кожного решти збігів форми ( i , j ) є три можливі результати:

  • Команда i виграє: Команда i отримує 3 бали , команда j отримує 0 балів
  • Перемагає команда j : Команда i отримує 0 балів , команда j отримує 3 бали
  • Нічия: Команда i і j отримують 1 бал

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

Приклад : Розглянемо зразковий вхід із наведеного вище розділу:

Вхід 1 = [93, 86, 78, 76, 75], Вхід 2 = [(1,2), (4,3), (2,3), (3,2), (1,2)], Вхід 3 =2

Якщо команда 2виграє всі свої залишки (тобто (1,2), (2,3), (3,2), (1,2)), вона отримує 4 * 3 = 12 додаткових очок; жодна з інших команд не отримує балів з цих матчів. Скажімо, інший матч, що залишився (тобто (4,3)) - нічия. Тоді кінцевими балами будуть:

 Team 1: 93, Team 2: 86 + 12 = 98, Team 3: 78 + 1 = 79, Team 4: 76 + 1 = 77, Team 5: 75

Це означає, що ми вже знайшли певний результат для решти матчів, так що жодна інша команда не має більше очок, ніж команда 2, тому вихід для цього введення повинен бути правдивим.

Деталі

  • Ви можете вважати, що перший вхід є впорядкованою послідовністю, тобто для i < j , i -й запис дорівнює або більший, ніж j -й запис. Перший вхід може сприйматись як список, рядок тощо.
  • Ви можете взяти другий вхід як рядок, список кортежів тощо. Крім того, ви можете прийняти його як двовимірний масив, aде a[i][j]кількість записів форми (i,j)у списку решти збігів. Наприклад, a[1][2] = 2, a[2][3] = 1, a[3][2] = 1, a[4][3] = 1 відповідає [(1,2), (4,3), (2,3), (3,2), (1,2)].
  • Для другого та третього введення ви можете припустити 0-індексування замість 1-індексації.
  • Ви можете взяти три входи в будь-якому порядку.

Вкажіть, будь ласка, точний формат введення, який ви вибрали у своїй відповіді.

Бічний вузол : Проблема, що лежить в основі цього виклику, виявилася повною в NP у " Елімінації у футболі важко вирішити за правилом 3-х балів ". Цікаво, що якщо за перемогу присуджуються лише два бали, проблема стає вирішуваною в поліноміальний час.

Випробування

Всі тестові випадки в форматі Input1, Input2, Input3.

Truthy:

  • [93, 86, 78, 76, 75], [(1,2), (4,3), (2,3), (3,2), (1,2)],2
  • [50], [],1
  • [10, 10, 10], [],3
  • [15, 10, 8], [(2,3), (1,3), (1,3), (3,1), (2,1)],2

Фальсі:

  • [10, 9, 8], [],2
  • [10, 9, 9], [(2,3), (3,2)],1
  • [21, 12, 11], [(2,1), (1,2), (2,3), (1,3), (1,3), (3,1), (3,1)],2

Переможець

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


1
Справедливе попередження. У нас чисельне американське населення, тому додавання (футбол) до назви може допомогти уникнути плутанини
Крістофер

@Christopher це футбол. Американці помиляються
caird coinheringaahing

Також їдьте Челсі!
caird coinheringaahing

@cairdcoinheringaahing Американці НЕВР помиляються. Але моя думка все ще стоїть
Крістофер

1
Ніхто не пам’ятає австралійців та канадців.
Роберт Фрейзер

Відповіді:


4

Haskell (Lambdabot) , 84 байти

Дякую @bartavelle, що врятував мені байт.

Без Lambdabot додайте 20 байт import Control.Lensплюс новий рядок.

Функція приймає свої аргументи в тому ж порядку, як описано в ОП, 0-індексовано. Другий його аргумент (список інших збігів) - це плоский список індексів (наприклад, [1,2,4,1]відповідає [(Team 1 vs Team 2), (Team 4 vs Team 1)]).

Правила трохи розпливчасті щодо того, дозволено це чи ні. Якщо це не дозволено, функція може приймати введення у форматі, передбаченому прикладами - списком кортежів. У такому випадку додайте до балу цього рішення 2 байти за рахунок заміни a:b:rна (a,b):r.

(!)=(+~).element
(t?(a:b:r))s=any(t?r)[a!3$s,b!3$s,b!1$a!1$s]
(t?_)s=s!!t==maximum s

Пояснення:

Перший рядок визначає функцію infix !з трьох змінних типу(!) :: Int -> Int -> [Int] -> [Int] , яка збільшує значення в заданому індексі списку. Оскільки часто код зрозумілий легше, ніж слова (а оскільки синтаксис Haskell може бути дивним), ось переклад Python:

def add(index, amount, items):
    items[index] += amount
    return items

Другий рядок визначає іншу функцію інфіксації ? , також з трьох змінних (вхідний виклик). Я перепишу його тут більш читально:

(t ? a:b:r) s = any (t ? r) [a ! 3 $ s, b ! 3 $ s, (b ! 1 $ a) ! 1 $ s]
(t ? _) s = (s !! t) == maximum s

Це рекурсивна реалізація вичерпного пошуку. Він повторюється за списком решти ігор, розгалужуючи на три можливі результати, а потім, як тільки список буде порожнім, перевіряючи, чи має наша команда максимальну кількість балів. Знову в (неідіоматичному) Python це:

def can_still_win(standings, games_left, our_team):
    if games_left == []:
        return standings[our_team] == max(standings)
    team1, team2, other_games = games_left[0], games_left[1], games_left[2:]
    team1Wins, team2Wins, tie = standings.copy(), standings.copy(), standings.copy()
    team1Wins[team1] += 3
    team2Wins[team2] += 3
    tie[team1] += 1
    tie[team2] += 1
    return (can_still_win(team1Wins, other_games, our_team)
            or can_still_win(team2Wins, other_games, our_team)
            or can_still_win(tie, other_games, our_team))

Спробуйте в Інтернеті!

* На жаль, TiO не підтримує об'єктив, тому це посилання насправді не працює.


Плоский список індексів дозволений як формат введення :)
оцінити

Здається, ви можете зберегти байт, не використовуючи охоронців: Спробуйте це в Інтернеті!
bartavelle

@bartavelle Гарний дзвінок! Дякую! Мені вдалося збрити ще один байт, змінюючи порядок визначення функцій , так що я міг би замінити []з _.
Тутлеман

3

Microsoft SQL Server, 792 байти

CREATE FUNCTION my.f(@s XML,@m XML,@ INT)RETURNS TABLE RETURN
WITH s AS(SELECT s.value('@p','INT')p FROM @s.nodes('S')s(s)),
m AS(SELECT m.value('@i','INT')i,m.value('@j','INT')j FROM @m.nodes('M')m(m)),
a AS(SELECT ROW_NUMBER()OVER(ORDER BY-p)t,p FROM s),
b AS(SELECT p+3*(SELECT COUNT(*)FROM m WHERE t IN(i,j))o FROM a WHERE t=@),
c AS(SELECT i,j,ROW_NUMBER()OVER(ORDER BY 1/0)k FROM m WHERE @ NOT IN(i,j)),
d AS(SELECT COUNT(*)u,POWER(3,COUNT(*))-1 v FROM c UNION ALL SELECT u,v-1 FROM d WHERE v>0),
e AS(SELECT v,u,v/3 q,v%3 r FROM d UNION ALL SELECT v,u-1,q/3,q%3 FROM e WHERE u>1),
f AS(SELECT v,p+SUM(IIF(t=i,r,(2-r))%3*3/2)s FROM a,c,e WHERE t IN(i,j)AND k=u GROUP BY v,t,p),
g AS(SELECT MAX(s)x FROM f GROUP BY v)SELECT SUM(IIF(o<ISNULL(x,p),0,1))f FROM a,(b OUTER APPLY g)WHERE t=1;

Функція повертає 0 за хибний результат і більше 0 для триєдного.

Весь фрагмент:

SET NOCOUNT ON;
--USE tempdb;
USE rextester;
GO
IF SCHEMA_ID('my') IS NULL EXEC('CREATE SCHEMA my');
ELSE BEGIN
  IF OBJECT_ID('my.f', 'IF') IS NOT NULL DROP FUNCTION my.f;
  IF OBJECT_ID('my.s', 'U') IS NOT NULL DROP TABLE my.s;
  IF OBJECT_ID('my.m', 'U') IS NOT NULL DROP TABLE my.m;
  IF OBJECT_ID('my.c', 'U') IS NOT NULL DROP TABLE my.c;
END;
GO
CREATE TABLE my.c( -- Test cases
  c INT PRIMARY KEY CLUSTERED CHECK(c > 0), -- Test Case Id
  n INT CHECK(n > 0), -- Current position of the team of interest
);
CREATE TABLE my.s( -- Standings
  a INT FOREIGN KEY REFERENCES my.c(c) CHECK(a > 0), -- Test cAse Id
  p INT CHECK(p > 0) -- Team pts
);
CREATE TABLE my.m( -- Matches
  s INT FOREIGN KEY REFERENCES my.c(c) CHECK(s > 0), -- Test caSe Id
  i INT CHECK(i > 0), -- Team i
  j INT CHECK(j > 0), -- Team j
  CHECK(i != j)
);
GO
INSERT my.c(c, n) VALUES (1, 2), (2, 1), (3, 3), (4, 2), (5, 2), (6, 1), (7, 2);
INSERT my.s(a, p) VALUES (1, 93), (1, 86), (1, 78), (1, 76), (1, 75),
(2, 50), (3, 10), (3, 10), (3, 10), (4, 15), (4, 10), (4, 8),
(5, 10), (5, 9), (5, 8), (6, 10), (6, 9), (6, 9), (7, 21), (7, 12), (7, 11);
INSERT my.m(s, i, j) VALUES (1, 1, 2), (1, 4, 3), (1, 2, 3), (1, 3, 2), (1, 1, 2),
(4, 2, 3), (4, 1, 3), (4, 1, 3),(4, 3, 1), (4, 2, 1), (6, 2, 3), (6, 3, 2),
(7, 2, 1), (7, 1, 2), (7, 2, 3), (7, 1, 3), (7, 1, 3), (7, 3, 1), (7, 3, 1);
GO
CREATE FUNCTION my.f(@s XML,@m XML,@ INT)RETURNS TABLE RETURN
WITH s AS(SELECT s.value('@p','INT')p FROM @s.nodes('S')s(s)),
m AS(SELECT m.value('@i','INT')i,m.value('@j','INT')j FROM @m.nodes('M')m(m)),
a AS(SELECT ROW_NUMBER()OVER(ORDER BY-p)t,p FROM s),
b AS(SELECT p+3*(SELECT COUNT(*)FROM m WHERE t IN(i,j))o FROM a WHERE t=@),
c AS(SELECT i,j,ROW_NUMBER()OVER(ORDER BY 1/0)k FROM m WHERE @ NOT IN(i,j)),
d AS(SELECT COUNT(*)u,POWER(3,COUNT(*))-1 v FROM c UNION ALL SELECT u,v-1 FROM d WHERE v>0),
e AS(SELECT v,u,v/3 q,v%3 r FROM d UNION ALL SELECT v,u-1,q/3,q%3 FROM e WHERE u>1),
f AS(SELECT v,p+SUM(IIF(t=i,r,(2-r))%3*3/2)s FROM a,c,e WHERE t IN(i,j)AND k=u GROUP BY v,t,p),
g AS(SELECT MAX(s)x FROM f GROUP BY v)SELECT SUM(IIF(o<ISNULL(x,p),0,1))f FROM a,(b OUTER APPLY g)WHERE t=1;
GO
SELECT c, f
FROM my.c
OUTER APPLY(SELECT p FROM my.s S WHERE a = c FOR XML AUTO)S(s)
OUTER APPLY(SELECT i, j FROM my.m M WHERE s = c FOR XML AUTO)M(m)
OUTER APPLY my.f(s, m, n)
ORDER BY c
OPTION(MAXRECURSION 0);

Перевірте це в Інтернеті!


З усіх мов, чому це xD
Ной Крістіно

Для різноманітності :)
Андрій Одегов

Це, мабуть, було цікаво програмувати :)
Ной Крістіно

1

Python 2, 242 221 байт

from itertools import*
def u(S,M,t,O):
 for m,o in zip(M,O):
  if t in m:S[t]+=3
  else:S[m[0]]+=(1,3,0)[o];S[m[1]]+=(1,0,3)[o]
 return S[t]>=max(S)
f=lambda s,m,t:any(u(s[:],m,t,O)for O in product([0,1,2],repeat=len(m)))

Спробуйте в Інтернеті!

Після першого проходу з базовим мисленням про гольф. Приймає введення з індексуванням на основі 0 ; тестові випадки в TIO регулюють це за допомогою функції F.

product([0,1,2],repeat=len(m))Ітерація оцінює можливі результати над краваткою / виграш / програшем для кожної гри , якщо в команді представляє інтересу (TOI) є частиною матчу (в якому, то TOI завжди передбачаються виграти).


1

JavaScript (ES6), 145 байт

(s,d,t,o=[],g=(c=s,i=0)=>d[i]?[3,,0,3,1,1].map((a,j)=>(j%=2,r=j?r:[...c],r[d[i][j]]+=a,g(r,i+1))):o.push(c))=>o.some(r=>r[t]==Math.max(...r),g())

Вважає введення результатів як масив ( [93,86,78,76,75]), майбутні ігри як масив двозначних масивів ( [[0,1],[3,2],[1,2],[2,1],[0,1]]), а командний індекс - як ціле (1 ). Все 0-індексовано.

Тест-фрагмент

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