ทีมโปรดของฉันยังสามารถเป็นแชมป์ฟุตบอลได้หรือไม่?


10

ในฐานะแฟนของทีมฟุตบอลBE ที่ประสบความสำเร็จมากที่สุดในช่วงท้ายฤดูกาลฉันมักจะสงสัยว่าทีมโปรดของฉันยังมีโอกาสทางทฤษฎีที่เหลือจากการเป็นแชมป์ งานของคุณในการท้าทายนี้คือการตอบคำถามนั้นให้ฉัน

อินพุต

คุณจะได้รับสามอินพุต: ตารางปัจจุบันรายการการแข่งขันที่เหลือและตำแหน่งปัจจุบันของทีมที่เราสนใจ

การป้อนข้อมูลที่ 1: ตารางปัจจุบันลำดับของตัวเลขเป็นฉันจำนวน -th เป็นจุดที่ได้โดยทีมงานผมเพื่อให้ห่างไกล ตัวอย่างเช่นอินพุต [93, 86, 78, 76, 75]เข้ารหัสตารางต่อไปนี้ (เฉพาะคอลัมน์สุดท้ายเท่านั้นที่มีความสำคัญ):

ตารางพรีเมียร์ลีก


อินพุต 2 : ผู้ที่เหลือการแข่งขันลำดับ tuples ที่แต่ละ tuple (เป็นฉัน , 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

อินพุต 3: ตำแหน่งปัจจุบัน . ของทีมเรามีความสนใจในตัวอย่างเช่นใส่ของ2สำหรับตัวอย่างข้างต้นจะหมายความว่าเราต้องการที่จะทราบว่าท็อตแนมยังสามารถกลายเป็นแชมป์

เอาท์พุต

สำหรับการจับคู่แต่ละรูปแบบที่เหลืออยู่ ( i , j ) มีสามผลลัพธ์ที่เป็นไปได้:

  • ทีมiชนะ: ทีมiได้3 คะแนนทีมjได้0 คะแนน
  • ทีมjชนะ: ทีมiได้รับ0 คะแนนทีมjได้3 คะแนน
  • เสมอ: ทีมiและjทั้งคู่ได้1 คะแนน

คุณต้องส่งออกค่าความจริงหากมีผลบางอย่างสำหรับเกมที่เหลือทั้งหมดเช่นว่าในตอนท้ายไม่มีทีมอื่น ๆ ที่มีคะแนนมากกว่าทีมที่ระบุไว้ในการป้อนข้อมูลที่ 3 มิฉะนั้นส่งออกค่าเท็จ

ตัวอย่าง : พิจารณาอินพุตที่เป็นแบบอย่างจากส่วนด้านบน:

อินพุต 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 -th จะเท่ากับหรือมากกว่ารายการj -th อินพุตแรกอาจถูกใช้เป็นรายการสตริงหรือสิ่งที่คล้ายกัน
  • คุณอาจรับอินพุตที่สองเป็นสตริงรายการของ tuples หรือสิ่งที่คล้ายกัน หรือคุณอาจใช้มันเป็นอาร์เรย์สองมิติ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
  • คุณสามารถรับอินพุตทั้งสามในลำดับใดก็ได้

โปรดระบุรูปแบบการป้อนข้อมูลที่แน่นอนที่คุณเลือกในคำตอบของคุณ

โหนดด้านข้าง : ปัญหาพื้นฐานของความท้าทายนี้แสดงให้เห็นว่าเป็นปัญหาที่สมบูรณ์ใน "การกำจัดฟุตบอลยากต่อการตัดสินใจภายใต้กฎ 3 จุด " ที่น่าสนใจหากมีเพียงสองคะแนนเท่านั้นที่ได้รับชัยชนะปัญหานี้จะแก้ไขได้ในเวลาพหุนาม

กรณีทดสอบ

กรณีทดสอบทั้งหมดที่อยู่ในรูปแบบInput1, ,Input2Input3

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
เตือนภัย เรามีประชากรชาวอเมริกันจำนวนมากดังนั้นการเพิ่ม (ฟุตบอล) ในชื่ออาจช่วยหลีกเลี่ยงความสับสน
Christopher

@ คริสโตเฟอร์มันเป็นฟุตบอล ชาวอเมริกันมีความผิด
caird coinheringaahing

ไปเชลซีด้วย!
caird coinheringaahing

@cairdcoinheringaahing อเมริกันกำลัง NEVR ผิด แต่ประเด็นของฉันยังคงอยู่
Christopher

1
ไม่มีใครจำได้ว่าชาวออสเตรเลียและชาวแคนาดา
Robert Fraser

คำตอบ:


4

Haskell (แลมบ์บ็อต) , 84 ไบต์

ขอบคุณ @bartavelle ที่ช่วยฉันบันทึกไบต์

หากไม่มี Lambdabot ให้เพิ่ม 20 ไบต์import Control.Lensพร้อมกับขึ้นบรรทัดใหม่

ฟังก์ชั่นใช้อาร์กิวเมนต์ในลำดับเดียวกันตามที่อธิบายไว้ใน OP, 0-indexed อาร์กิวเมนต์ที่สอง (รายการของการจับคู่ที่เหลืออยู่) คือรายการดัชนีแบบคงที่ (เช่น[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

บรรทัดที่สองกำหนดฟังก์ชั่น infix อื่น?รวมถึงตัวแปรสามตัว (อินพุตท้าทาย) ฉันจะเขียนมันอ่านเพิ่มเติมได้ที่นี่:

(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 ไม่รองรับเลนส์ดังนั้นลิงค์นี้จะไม่ทำงาน


อนุญาตให้ใช้รายการดัชนีแบบคงที่ในรูปแบบอินพุต :)
vauge

ดูเหมือนว่าคุณสามารถบันทึกไบต์โดยไม่ใช้ยาม: ลองออนไลน์!
bartavelle

@bartavelle โทรดี! ขอบคุณ! ฉันจัดการเพื่อโกนไบต์อื่นโดยการแลกเปลี่ยนการสั่งซื้อของคำนิยามของฟังก์ชั่นเพื่อให้ฉันสามารถแทนที่ด้วย[] _
Tutleman

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 นี้
โนอาห์คริสติโน

สำหรับความหลากหลาย :)
Andrei Odegov

ต้องสนุกกับการเขียนโปรแกรม :)
โนอาห์คริสติโน

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]) เกมที่กำลังจะมาเป็นอาร์เรย์ของ 2 ค่าอาร์เรย์ ( [[0,1],[3,2],[1,2],[2,1],[0,1]]) และดัชนีทีมเป็นจำนวนเต็ม ( 1) ทุกอย่างถูกจัดทำดัชนี 0

ตัวอย่างการทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.