私の好きなチームは今でもフットボールチャンピオンになれますか?


10

最大で中程度に成功するフットボールBEチームのファンとして、シーズンの終わりに向けて、私のお気に入りのチームがまだチャンピオンになる可能性があるかどうか疑問に思います。この課題におけるあなたの仕事は、私のためにその質問に答えることです。

入力

現在のテーブル、残りの対戦のリスト、関心のあるチームの現在のポジションの3つの入力を受け取ります。

入力1:現在のテーブル、数字のシーケンスがされた番目の数は、チームによって得られるポイントです私はこれまで。たとえば、入力 [93, 86, 78, 76, 75]は次の表をエンコードします(最後の列のみが重要です)。

プレミアリーグテーブル


入力2残りの一致。各タプル(ij)がチームijの間の残りの一致を表すタプルのシーケンス。上記の例では、2番目の入力は[(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、上記の例のの入力は、トッテナムがまだチャンピオンになることができるかどうかを知りたいことを意味します。

出力

フォームの残りの一致ごとに( ij)のに、3つの結果が考えられます。

  • チームiが勝利:チームiが獲得 3ポイント、チームj0ポイント
  • チームjが勝利:チームiが獲得 0ポイント、チームj3ポイントを獲得
  • 抽選:チームijの両方が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

これは、他のチームがteamよりも多くのポイントを持たないように、残りの試合の結果をすでに発見している2ため、この入力の出力は真実である必要があることを意味します。

細部

  • 最初の入力は順序付けられたシーケンスであると想定できます。つまり、i < jの場合、i番目のエントリはj番目のエントリ以上です。最初の入力は、リスト、文字列などとすることができます。
  • 2番目の入力は、文字列、タプルのリストなどとして受け取ることができます。あるいは、残りの一致のリストにあるフォームのエントリ数がaである2次元配列と見なすこともでき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)]ます。
  • 2番目と3番目の入力については、1インデックスではなく0インデックスを想定できます。
  • 3つの入力は任意の順序で取得できます。

回答で選択した正確な入力形式を指定してください。

サイドノード:この課題の根底にある問題は、「3点ルールではフットボールの排除を決定するのは難しい」でNP完全であることが示されました。興味深いことに、勝つために2ポイントしか与えられない場合、問題は多項式時間で解決可能になります。

テストケース

すべてのテストケースは形式ですInput1Input2Input3

真実:

  • [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週間後に選ばれます。


1
公正警告。アメリカ人の人口は多いので、タイトルに(サッカー)を追加すると混乱を避けるのに役立ちます
Christopher

@クリストファーそれはサッカーです。アメリカ人はそれを間違っている
ケアードcoinheringaahing

チェルシーも行きます!
caird coinheringaahing

@cairdcoinheringaahingアメリカ人はNEVRが間違っています。しかし、私の
クリストファー

1
オーストラリア人とカナダ人を覚えている人はいません。
ロバートフレイザー

回答:


4

Haskell(Lambdabot)、84バイト

1バイト節約してくれた@bartavelleに感謝します。

Lambdabotがない場合は、20バイトをimport Control.Lens追加して改行します。

この関数は、OPで説明されているのと同じ順序で、0インデックスで引数を受け取ります。2番目の引数(残りの対戦のリスト)は、インデックスのフラットリストです(たとえばに[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

説明:

最初の行は、リスト内の指定されたインデックスで値をインクリメントする!タイプの3つの変数の内置関数を定義(!) :: Int -> Int -> [Int] -> [Int]しています。多くの場合、コードは単語よりも理解しやすいため(そしてHaskellの構文は奇妙な場合があるため)、Pythonでの翻訳を次に示します。

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

2行目は?、同じく3つの変数(チャレンジ入力)の別の中置関数を定義しています。ここで読みやすくします。

(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

これは、徹底的な検索の再帰的な実装です。残りのゲームのリストを繰り返し、3つの可能な結果に分岐し、リストが空になると、チームに最大ポイント数があるかどうかを確認します。(慣用的ではない)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 2017

@bartavelleグッドコール!ありがとう!関数定義の順序を入れ替えることで別のバイトを削り落とし、で置き換えることができまし[]_
Tutleman 2017

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
ノアクリスティーノ2017

多様性のために:)
Andrei Odegov

それはプログラムするのが面白かったに違いありません:)
ノアクリスティーノ2017

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.