Đội bóng yêu thích của tôi vẫn có thể trở thành Nhà vô địch bóng đá?


10

Là một fan hâm mộ của một đội bóng BE thành công vừa phải , đến cuối mùa giải, tôi thường tự hỏi liệu đội bóng yêu thích của tôi có còn cơ hội lý thuyết nào để trở thành nhà vô địch hay không. Nhiệm vụ của bạn trong thử thách này là trả lời câu hỏi đó cho tôi.

Đầu vào

Bạn sẽ nhận được ba đầu vào: bảng hiện tại, danh sách các trận đấu còn lại và vị trí hiện tại của đội mà chúng tôi quan tâm.

Đầu vào 1: Bảng hiện tại , một dãy số là số thứ i là số điểm mà nhóm i đạt được cho đến nay. Ví dụ: đầu vào [93, 86, 78, 76, 75]mã hóa bảng sau (chỉ cột cuối cùng có tầm quan trọng):

bảng giải đấu hàng đầu


Đầu vào 2 : Các trận đấu còn lại , một chuỗi các bộ dữ liệu trong đó mỗi bộ dữ liệu ( i , j ) là viết tắt của một trận đấu còn lại giữa đội ij . Trong ví dụ trên, đầu vào thứ hai [(1,2), (4,3), (2,3), (3,2), (1,2)]có nghĩa là các kết quả khớp còn lại là:

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

Đầu vào 3: Vị trí hiện tại của đội bóng mà chúng tôi quan tâm. Ví dụ: đầu vào của 2ví dụ trên có nghĩa là chúng tôi muốn biết liệu Tottenham có còn trở thành nhà vô địch hay không.

Đầu ra

Đối với mỗi trận đấu còn lại của biểu mẫu ( i , j ), có ba kết quả có thể xảy ra:

  • Đội i thắng: Đội i được 3 điểm , đội j được 0 điểm
  • Đội j thắng: Đội i được 0 điểm , đội j được 3 điểm
  • Bốc thăm: Đội ij đều được 1 điểm

Bạn phải xuất ra một giá trị trung thực nếu có một số kết quả cho tất cả các trò chơi còn lại sao cho cuối cùng, không có đội nào khác có nhiều điểm hơn nhóm được chỉ định trong đầu vào thứ 3. Nếu không, xuất ra một giá trị giả.

Ví dụ : Xem xét đầu vào mẫu mực từ phần trên:

Đầu vào 1 = [93, 86, 78, 76, 75], Đầu vào 2 = [(1,2), (4,3), (2,3), (3,2), (1,2)], Đầu vào 3 =2

Nếu đội 2thắng tất cả các trận đấu còn lại (nghĩa là (1,2), (2,3), (3,2), (1,2)), nó được 4 * 3 = 12 điểm bổ sung; không đội nào khác nhận được điểm nào từ những trận đấu này. Giả sử trận đấu còn lại (nghĩa là (4,3)) là một trận hòa. Sau đó, điểm số cuối cùng sẽ là:

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

Điều này có nghĩa là chúng tôi đã tìm thấy một số kết quả cho các trận đấu còn lại sao cho không có đội nào khác có nhiều điểm hơn đội 2, vì vậy đầu ra cho đầu vào này phải là sự thật.

Chi tiết

  • Bạn có thể giả sử đầu vào đầu tiên là một chuỗi theo thứ tự, tức là đối với i < j , mục nhập thứ i bằng hoặc lớn hơn mục nhập thứ j . Đầu vào đầu tiên có thể được lấy dưới dạng danh sách, chuỗi hoặc tương tự.
  • Bạn có thể lấy đầu vào thứ hai dưới dạng một chuỗi, một danh sách các bộ dữ liệu hoặc tương tự. Ngoài ra, bạn có thể coi nó là một mảng hai chiều atrong đó a[i][j]số lượng mục nhập của biểu mẫu (i,j)trong danh sách các kết quả khớp còn lại. Ví dụ, a[1][2] = 2, a[2][3] = 1, a[3][2] = 1, a[4][3] = 1 tương ứng với [(1,2), (4,3), (2,3), (3,2), (1,2)].
  • Đối với đầu vào thứ hai và thứ ba, bạn có thể giả sử lập chỉ mục 0 thay vì lập chỉ mục 1.
  • Bạn có thể lấy ba đầu vào theo thứ tự bất kỳ.

Vui lòng xác định định dạng đầu vào chính xác mà bạn đã chọn trong câu trả lời của mình.

Nút phụ : Vấn đề tiềm ẩn trong thử thách này đã được thể hiện là hoàn thành NP trong " Loại bỏ bóng đá khó quyết định theo Quy tắc 3 điểm ". Thật thú vị, nếu chỉ có hai điểm được trao cho một chiến thắng, vấn đề sẽ trở nên có thể giải quyết trong thời gian đa thức.

Các trường hợp thử nghiệm

Tất cả các trường hợp thử nghiệm là ở định dạng Input1, Input2, Input3.

Sự thật:

  • [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

Giả mạo:

  • [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

Người chiến thắng

Đây là , vì vậy câu trả lời đúng nhất (tính bằng byte) sẽ thắng. Người chiến thắng sẽ được chọn một tuần sau khi câu trả lời đúng đầu tiên được đăng.


1
Cảnh báo đúng. Chúng tôi có một dân số người Mỹ lớn nên việc thêm (bóng đá) vào tiêu đề có thể giúp tránh nhầm lẫn
Christopher

@Christopher đó là bóng đá. Người Mỹ đã nhầm
caird coinheringaahing

Cũng đi Chelsea!
caird coinheringaahing

@cairdcoinheringaahing Người Mỹ là NEVR sai. Nhưng quan điểm của tôi vẫn đứng vững
Christopher

1
Không ai nhớ người Úc và người Canada.
Robert Fraser

Câu trả lời:


4

Haskell (Lambdabot) , 84 byte

Cảm ơn @bartavelle đã tiết kiệm cho tôi một byte.

Nếu không có Lambdabot, hãy thêm 20 byte để import Control.Lenscộng với một dòng mới.

Hàm lấy các đối số của nó theo cùng thứ tự như được mô tả trong OP, được lập chỉ mục 0. Đối số thứ hai của nó (danh sách các kết quả khớp còn lại) là một danh sách phẳng các chỉ mục (ví dụ [1,2,4,1]tương ứng với [(Team 1 vs Team 2), (Team 4 vs Team 1)]).

Các quy tắc hơi mơ hồ về việc liệu điều này có được phép hay không. Nếu nó không được phép, hàm có thể lấy đầu vào ở định dạng được cung cấp bởi các ví dụ - một danh sách các bộ dữ liệu. Trong trường hợp đó, thêm 2 byte vào điểm số của giải pháp này, do thay thế a:b:rbằng (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

Giải trình:

Dòng đầu tiên xác định hàm infix !gồm ba biến, loại (!) :: Int -> Int -> [Int] -> [Int], làm tăng giá trị tại một chỉ mục nhất định trong danh sách. Vì, thông thường, mã dễ hiểu hơn các từ (và vì cú pháp Haskell có thể lạ), đây là bản dịch Python:

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

Dòng thứ hai định nghĩa một hàm infix khác ?, cũng gồm ba biến (đầu vào thử thách). Tôi sẽ viết lại nó dễ đọc hơn ở đây:

(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

Đây là một thực hiện đệ quy của tìm kiếm toàn diện. Nó lặp lại danh sách các trò chơi còn lại, phân nhánh theo ba kết quả có thể xảy ra, và sau đó, khi danh sách trống, kiểm tra xem đội của chúng tôi có số điểm tối đa hay không. Một lần nữa trong Python (không phải thành ngữ), đây là:

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))

Hãy thử trực tuyến!

* Đáng buồn thay, TiO không hỗ trợ Lens, vì vậy liên kết này sẽ không thực sự chạy.


Danh sách phẳng các chỉ số được phép ở định dạng đầu vào :)
vauge

Dường như bạn có thể tiết kiệm một byte bằng cách không sử dụng bộ bảo vệ: Hãy thử trực tuyến!
bartavelle

@bartavelle Gọi tốt! Cảm ơn! Tôi đã quản lý để loại bỏ một byte khác bằng cách hoán đổi thứ tự của các định nghĩa hàm để tôi có thể thay thế []bằng _.
Người hướng dẫn

3

Máy chủ Microsoft SQL, 792 byte

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;

Hàm trả về 0 cho kết quả sai và hơn 0 cho kết quả trung thực.

Toàn bộ đoạn trích:

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);

Kiểm tra trực tuyến!


Trong số tất cả các ngôn ngữ tại sao điều này xD
Noah Cristino

Vì sự đa dạng :)
Andrei Odegov

Điều đó hẳn rất thú vị khi lập trình :)
Noah Cristino

1

Python 2, 242 221 byte

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)))

Hãy thử trực tuyến!

Sau khi vượt qua đầu tiên với suy nghĩ golf cơ bản. Đưa đầu vào với lập chỉ mục dựa trên 0 ; trường hợp thử nghiệm trong TIO điều chỉnh cho điều này thông qua chức năng F.

Các product([0,1,2],repeat=len(m))lặp đánh giá những kết quả tốt hơn tie / thắng / lỗ cho mỗi trận đấu trừ khi đồng đội của lãi suất (TOI) là một phần của trận đấu (trong đó, các TOI luôn giả định để giành chiến thắng).


1

JavaScript (ES6), 145 byte

(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())

Lấy điểm đầu vào dưới dạng một mảng ( [93,86,78,76,75]), các trò chơi sắp tới dưới dạng một mảng gồm 2 mảng giá trị ( [[0,1],[3,2],[1,2],[2,1],[0,1]]) và chỉ mục nhóm dưới dạng một số nguyên ( 1). Tất cả mọi thứ là 0 chỉ mục.

Kiểm tra đoạn trích

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.