Может ли моя любимая команда все еще стать чемпионом по футболу?


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, поэтому результаты этого ввода должны быть достоверными.

подробности

  • Можно считать , первый вход будет упорядоченная последовательность, т.е. для я < J , то я -й запись равна или больше , чем 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-полной в « Уничтожении футбола трудно решить в соответствии с правилом из трех пунктов ». Интересно, что если за победу присуждаются только два очка, проблема становится разрешимой за полиномиальное время.

Тестовые случаи

Все тестовые случаи в формате 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

Falsy:

  • [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
Честное предупреждение. У нас большое американское население, поэтому добавление (футбол) к названию может помочь избежать путаницы
Кристофер

@ Кристофер, это футбол. У американцев это неправильно
Caird Coneheringaahing

Иди в Челси!
caird coinheringaahing

@cairdcoinheringaahing Американцы никогда не ошибаются. Но моя точка зрения остается
Кристофер

1
Никто не помнит австралийцев и канадцев.
Роберт Фрейзер

Ответы:


4

Haskell (Lambdabot) , 84 байта

Спасибо @bartavelle за спасение мне байта.

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

Функция принимает свои аргументы в том же порядке, как описано в OP, с 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

Объяснение:

Первая строка определяет инфиксную функцию !трех переменных типа (!) :: 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 не поддерживает Lens, поэтому эта ссылка на самом деле не работает.


Плоский список индексов допускается в качестве входного формата :)
vauge

Кажется, что вы можете сохранить байт, не используя охрану: попробуйте онлайн!
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())

Принимает результаты счета в виде array ( [93,86,78,76,75]), предстоящие игры в виде массива массивов из 2 значений ( [[0,1],[3,2],[1,2],[2,1],[0,1]]), а индекс команды в виде целого числа ( 1). Все 0 проиндексировано.

Тестовый фрагмент

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.