Favori takımım hala Futbol Şampiyonu olabilir mi?


10

En orta derecede başarılı bir futbol BE takımının hayranı olarak , sezonun sonuna doğru sık sık favori takımımın hala şampiyon olmak için herhangi bir teorik şansı olup olmadığını merak ediyorum. Bu görevdeki göreviniz bu soruyu benim için cevaplamak.

Giriş

Üç giriş alacaksınız: mevcut tablo, kalan maçlar listesi ve ilgilendiğimiz takımın mevcut konumu.

Giriş 1: Geçerli tablo , bir sayı dizisidir vardı ı -inci sayı ekibi tarafından kazanılan noktalardır i şimdiye kadar. Örneğin, girdi [93, 86, 78, 76, 75]aşağıdaki tabloyu kodlar (yalnızca son sütun önemlidir):

birinci lig tablosu


Giriş 2 : Kalan maçlar , her bir grubun ( i , j ) takım i ve j arasında kalan bir eşleşmeyi temsil ettiği bir dizi tuple . Yukarıdaki örnekte, ifadesinin ikinci girişi [(1,2), (4,3), (2,3), (3,2), (1,2)], kalan eşleşmelerin şu şekilde olacağı anlamına gelir:

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

Giriş 3: geçerli konum . Biz de ilgilendi takımın Örneğin, bir giriş 2Yukarıdaki örneğin biz Tottenham hala şampiyonu olmak alamayacağını bilmek istediğiniz anlamına gelir.

Çıktı

Formun ( i , j ) kalan her bir eşleşmesi için üç olası sonuç vardır:

  • Takım i kazanır: Takım i 3 puan alır , takım j 0 puan alır
  • Takım j kazanır: Takım i 0 puan alır , takım j 3 puan alır
  • Beraberlik: Takım i ve j'nin ikisi de 1 puan alır

Kalan tüm oyunlar için bir sonuç varsa, sonuçta başka hiçbir takımın 3. girişte belirtilen takımdan daha fazla puanı olmayacak şekilde doğru bir değer çıkarmalısınız. Aksi takdirde, yanlış bir değer verin.

Örnek : Yukarıdaki bölümden örnek girişi düşünün:

Giriş 1 = [93, 86, 78, 76, 75], Giriş 2 = [(1,2), (4,3), (2,3), (3,2), (1,2)], Giriş 3 =2

Takım 2kalan tüm maçları kazanırsa (yani (1,2), (2,3), (3,2), (1,2)), 4 * 3 = 12 ek puan alır; diğer takımların hiçbiri bu maçlardan puan alamaz. Diyelim ki diğer kalan maç (yani (4,3)) berabere kaldı. Son puanlar şöyle olur:

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

Bu, diğer maçlarda takımdan daha fazla puan olmayacak şekilde kalan maçlar için bazı sonuçlar bulduğumuz anlamına gelir 2, bu nedenle bu girdinin çıktısı doğru olmalıdır.

ayrıntılar

  • Eğer bir sıralı sekans, yani hem ilk giriş alabilmektedir i < j , i -inci girişi eşit ya da bundan daha büyük olan j -inci girdi. İlk girdi bir liste, bir dize veya benzeri olarak alınabilir.
  • İkinci girdiyi dize, tuples listesi veya benzeri olarak alabilirsiniz. Alternatif olarak, bir iki boyutlu bir dizi olarak alabilir formun girişlerin sayısıdır kalan maçların listesinde. Örneğin, karşılık gelir .aa[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)]
  • İkinci ve üçüncü girdi için, 1 dizinleme yerine 0 dizinleme olduğunu varsayabilirsiniz.
  • Üç girişi istediğiniz sırayla alabilirsiniz.

Lütfen cevabınızda seçtiğiniz tam giriş formatını belirtin.

Yan düğüm : Bu zorluğun altında yatan sorunun " Futbol Eliminasyonunun 3 Nokta Kuralı Altında Karar Verilmesi Zor " bölümünde NP-tam olduğu gösterilmiştir . İlginç bir şekilde, bir galibiyet için sadece iki puan verilirse, sorun polinom zamanında çözülebilir hale gelir.

Test Durumları

Tüm test durumları biçimindedir Input1, Input2, Input3.

Doğru:

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

kazanan

Bu , bu yüzden en kısa doğru cevap (bayt cinsinden) kazanır. Kazanan ilk doğru cevap gönderildikten bir hafta sonra seçilecektir.


1
Adil uyarı. Büyük bir Amerikan nüfusumuz var, bu yüzden başlığa (futbol) eklemek karışıklıktan kaçınmaya yardımcı olabilir
Christopher

@Christopher bu futbol. Amerikalılar yanlış var
caird coinheringaahing

Ayrıca Chelsea'ye git!
caird coinheringaahing

@cairdcoinheringaahing Amerikalılar NEVR yanlış. Ama benim açımdan hala
Christopher

1
Kimse Avustralyalıları ve Kanadalıları hatırlamıyor.
Robert Fraser

Yanıtlar:


4

Haskell (Lambdabot) , 84 bayt

@Bartavelle'e bir bayt kazandýđýn için sađ ol.

Lambdabot olmadan 20 bayt import Control.Lensartı bir yeni satır ekleyin .

İşlev argümanlarını OP'de 0 ile indekslenenle aynı sırada alır. İkinci argümanı (kalan eşleşmelerin listesi) dizinlerin düz bir listesidir (örneğin [1,2,4,1]karşılık gelir [(Team 1 vs Team 2), (Team 4 vs Team 1)]).

Buna izin verilip verilmediğine ilişkin kurallar biraz belirsizdir. İzin verilmezse, işlev örnekler tarafından sağlanan formatta girdi alabilir - tuples listesi. Bu durumda, bağlı değiştirilmesi için, bu çözümün skoru 2 bayt eklemek a:b:rile (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

Açıklama:

İlk satır, !üç değişkenli, türdeki bir infix işlevini tanımlar(!) :: Int -> Int -> [Int] -> [Int] listedeki belirli bir dizindeki değeri artıran . Çoğu zaman, kodun anlaşılması kelimelerden daha kolay olduğundan (ve Haskell sözdizimi garip olabileceğinden), bir Python çevirisi:

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

İkinci satır başka bir infix fonksiyonunu tanımlar ? üç değişkenden (deneme girişi) . Burada daha okunabilir bir şekilde yeniden yazacağım:

(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

Bu, kapsamlı aramanın yinelemeli bir uygulamasıdır. Kalan oyunların listesi üzerinde tekrarlar, üç olası sonuca dallanır ve daha sonra liste boş olduğunda, ekibimizin maksimum puan olup olmadığını kontrol eder. Yine (deyimsel olmayan) Python'da bu:

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

Çevrimiçi deneyin!

* Ne yazık ki, TiO Lens'i desteklemediğinden, bu bağlantı aslında çalışmaz.


Endekslerin düz listesine giriş formatı olarak izin verilir :)
17'de

Görünüşe göre korumaları kullanmadan bir bayt kaydedebilirsiniz: Çevrimiçi deneyin!
bartavelle

@bartavelle İyi çağrı! Teşekkürler! Ben yerini böylece fonksiyon tanımları sırasını değiştirerek başka byte traş başardı []ile _.
Tutleman

3

Microsoft SQL Server, 792 bayt

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;

İşlev yanlış bir sonuç için 0, doğru bir sonuç için 0'dan fazla döndürür.

Bütün pasaj:

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

Çevrimiçi Kontrol Edin!


Tüm diller dışında neden bu xD
Noah Cristino

Çeşitlilik için :)
Andrei Odegov

Bu program için eğlenceli olmalı :)
Noah Cristino

1

Python 2, 242222 bayt

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

Çevrimiçi deneyin!

Temel golf düşüncesiyle ilk geçişten sonra. 0 tabanlı indeksleme ile girdi alır ; TIO'daki test senaryoları bu işlevle ayarlanırF .

product([0,1,2],repeat=len(m))Yineleme ekibi-faiz (TOI) sürece her maç için kravat / kazanmak / zarar üzerinde olası sonuçlarını değerlendirir (ki, TOI her zaman kazanmak varsayılır) maçın bir parçasıdır.


1

JavaScript (ES6), 145 bayt

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

Skor girişini dizi ( [93,86,78,76,75]), yaklaşan oyunları 2 değerli diziler ( [[0,1],[3,2],[1,2],[2,1],[0,1]]) ve takım dizini tamsayı (1 ) olarak alır. Her şey 0 dizinlidir.

Snippet'i Test Et

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.