有効なペナルティシュートアウトプレフィックスですか?


14

サッカー(また、サッカーとしても知られる)、ペナルティシュートアウトは、余分な時間(すなわち、サッカーの残業)の後、タイで終了することができない試合で使用することができる第二タイブレーカー尺度です。

ペナルティーシュートアウトでは、主審はコインを投げてどのゴールでシュートアウトが起こるかを決定し、次に別のコインを投げてどのチームが最初に開始するかを決定します。ただし、この課題に関連する唯一のことは、次に説明するとおりです。

各チームには開始時に5つのペナルティがあり、ペナルティスコアは0〜0です。いずれかの時点で、チームの残りのペナルティーが現在勝っているチームを変更するのに十分でない場合、シュートアウトは停止します。

残りのペナルティーはないが、両チームのポイントが等しい場合、追加のペナルティーが両チームに付与されます。これは、ポイントが等しくなくなるまで繰り返されます。

シュートアウトが停止した後、ペナルティスコアが最大のチームがゲームに勝利します。

チャレンジ

あなたの課題は、二つのリスト与えられた、あるAB罰則チームAとチームBは、彼らが有効なPK戦を表すかどうかを判断するために、それぞれ得点表します。勝利チームを決定できるかどうかに関係なく、入力によって表される状態に到達できる場合、シュートアウトは有効です。入力に記述された状態が少なくとも1つのシナリオに到達できる場合、入力は有効であるため、おそらく両方のシナリオ(チームA開始、チームB開始)についてテストする必要があることに注意してください。リストの長さが異なる場合、長いリストのチームが最初に開始します(他のリストよりも1つの要素しか持つことができず、短いリストのチームは開始できません。短いリストは時期尚早に使い果たされるため、連続して表示されます)。

詳細な例

以下の「ルール」セクションにスキップできます。これらは、課題の解決に役立つためのものです。

このシュートアウトを入力として受け取り、-ゴールが得られなかったこととゴールが得られたことをX意味するとします(それは無効です):

Team A: - X X X X
Team B: - - - - X

Assuming team A starts first:

Team A: - (0 - 0) (max possible score 4 - 5)
Team B: - (0 - 0) (max possible score 4 - 4)
Team A: X (1 - 0) (max possible score 4 - 4)
Team B: - (1 - 0) (max possible score 4 - 3)
Team A: X (2 - 0) (max possible score 4 - 3)
Team B: - (2 - 0) (max possible score 4 - 2)
Team A: X (3 - 0) (max possible score 4 - 2)
Team A already has a higher score than B could ever have, but the input hasn't
ended yet, so it's invalid if team A is first.

Assuming team B starts first:

Team B: - (0 - 0) (max possible score 5 - 4)
Team A: - (0 - 0) (max possible score 4 - 4)
Team B: - (0 - 0) (max possible score 4 - 3)
Team A: X (1 - 0) (max possible score 4 - 3)
Team B: - (1 - 0) (max possible score 4 - 2)
Team A: X (2 - 0) (max possible score 4 - 2)
Team B: - (2 - 0) (max possible score 4 - 1)
Team A already has a higher score than B could ever have, but the input hasn't
ended yet, so it's invalid if team B stars first.

The input is invalid no matter which team starts first, so it's considered
invalid.

それどころか、有効な例は次のとおりです。

Team A: X X X
Team B: - - -

Assuming team A starts first:

Team A: X (1 - 0) (max possible score 5 - 5)
Team B: - (1 - 0) (max possible score 5 - 4)
Team A: X (2 - 0) (max possible score 5 - 4)
Team B: - (2 - 0) (max possible score 5 - 3)
Team A: X (3 - 0) (max possible score 5 - 3)
Team B: - (3 - 0) (max possible score 5 - 2)
It can be determined that team A wins, however the input has ended, so it's
valid if team A starts first. Therefore, the input is valid.

もう1つの例、今回は追加のペナルティがあります:

Team A: X - X - - - X -
Team B: - X X - - - X X

Assuming team A starts first:

Team A: X (1 - 0) (max possible score 5 - 5)
Team B: - (1 - 0) (max possible score 5 - 4)
Team A: - (1 - 0) (max possible score 4 - 4)
Team B: X (1 - 1) (max possible score 4 - 4)
Team A: X (2 - 1) (max possible score 4 - 4)
Team B: X (2 - 2) (max possible score 4 - 4)
Team A: - (2 - 2) (max possible score 3 - 4)
Team B: - (2 - 2) (max possible score 3 - 3)
Team A: - (2 - 2) (max possible score 2 - 3)
Team B: - (2 - 2) (max possible score 2 - 2)
First 5 penalties result in a tie, so we move on to extra penalties.
Team A: -, Team B: - (2 - 2)
Team A: X, Team B: X (3 - 3)
Team A: -, Team B: X (3 - 4)
It can be determined that team B wins, however the input has ended, so it's
valid if team A starts first. Therefore, the input is valid.

勝者を決定するには早すぎる有効な入力を次に示します。

Team A: X X - -
Team B: - X - X

Assuming team A starts first:

Team A: X (1 - 0) (max possible score 5 - 5)
Team B: - (1 - 0) (max possible score 5 - 4)
Team A: X (2 - 0) (max possible score 5 - 4)
Team B: X (2 - 1) (max possible score 5 - 4)
Team A: - (2 - 1) (max possible score 4 - 4)
Team B: - (2 - 1) (max possible score 4 - 3)
Team A: - (2 - 1) (max possible score 3 - 3)
Team B: X (2 - 2) (max possible score 3 - 3)
The input has ended before the winner can be determined, so it's valid if team A
starts first. Therefore, the input is valid.

最後に、リストの長さが異なる入力を次に示します。

Team A: - - -
Team B: X X - X

Since team B shot more penalties, it starts first:

Team B: X (0 - 1) (max possible score 5 - 5)
Team A: - (0 - 1) (max possible score 4 - 5)
Team B: X (0 - 2) (max possible score 4 - 5)
Team A: - (0 - 2) (max possible score 3 - 5)
Team B: - (0 - 2) (max possible score 3 - 4)
Team A: - (0 - 2) (max possible score 2 - 4)
Team B: X (0 - 3) (max possible score 2 - 4)
It can be determined that team B wins, however the input has ended, so it's
valid.

ルール

  • 最初に撃つチームはAまたはBのいずれかであり、常に最初に撃つとは限りません。
  • リストの長さは同じであるか、リストの長さが1つ異なります。
  • スコア付き/スコアなしのペナルティーを表すために、2つの異なる一貫した値を選択できます。
  • リストは、全単射の基数 2、文字列、または言語のネイティブリスト形式から変換された整数として表すこともできます。全単射の基数2形式が選択された場合、入力規則は全単射の基数2に変換された数値に適用されます(したがって、数字12それぞれスコア付きとスコアなし、またはスコアなしとスコア付きのいずれかを意味します)。通常のバイナリは許可されません。意図したバイナリ表現に先行ゼロが存在するかどうかを判断できないためです。
  • これはであるため、最短のソリューションが優先されます。ただし、あなたの言語が「専門的な言語に勝る」ことができないと思われる場合でも、答えを落胆しないでください。

テストケース

これらのテストケースでは、a 0は目標なし1を表し、aは目標を表します。

フォーマット:

[Team A], [Team B]

有効な入力:

[], []
[0], [0]
[0], [1]
[1], [1]
[0], []
[1, 1, 1, 1], [0, 0, 1, 1]
[0, 1, 1, 1, 1], [0, 1, 1, 0]
[0, 0, 0, 0, 1], [0, 0, 0, 1, 0]
[0, 0, 0, 0, 1], [0, 0, 0, 1]
[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1]
[0, 1, 1, 1, 1], [0, 1, 1, 0, 1]
[1, 1, 1], [0, 0, 0]
[1, 1, 1, 1], [0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

無効な入力:

[0, 1, 1, 1, 1], [0, 1, 1, 0, 0]
[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1]
[1, 1, 1, 0], [0, 0, 0]
[1, 1, 1, 1], [0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
[1, 0, 1, 0, 1], [0, 1, 0, 1, 0, 1]
[0, 0, 0, 0, 1], [0, 1, 1, 1, 0]

無効の場合は0またはfalseを返し、有効の場合はtrueを返すことはできますか?
無知の

@EmbodimentofIgnorance「スコア付き/スコアなしのペナルティーを表すために、2つの異なる一貫した値を選択できます。」正確な値は重要ではありませんが、値は2つだけでなければなりません。
エリックアウトゴルファー

私は仮定[[0,0],[1,1]]のゲームはまだ(と、単にテストケースのように起こっていることから、(または2つの内のリストの1が2つの項目を持つすべてのテストケース)truthyである[[0],[1]]か、[[0],[]]まだ進行中ですか)?
ケビンCruijssen

@KevinCruijssenはい、誰が勝つかを決めることができないため、結果は3-2になります。;-)
アウトゴルファーのエリック

回答:


3

JavaScript(ES6)、 117 112  109バイト

(a)(b)1201

a=>b=>!(g=(a,b,P=Q=i=5)=>(p=a[5-i])|(q=b[5-i])&&(--i<0?P-Q:P-Q>i|Q+q-P-p>i&p<2)|g(a,b,P+p,Q+=q))(a,b)|!g(b,a)

オンラインでお試しください!

コメント済み

a => b =>                   // given a[] and b[]
  !(g = (                   // g is a recursive function taking:
      a,                    //   the results a[] of the team that plays first
      b,                    //   the results b[] of the team that plays second
      P =                   //   the cumulated goals P of the 1st team (relative value)
      Q =                   //   the cumulated goals Q of the 2nd team (relative value)
      i = 5                 //   a counter i
    ) =>                    // and returning a truthy value if something goes wrong
      (p = a[5 - i]) |      // if either the first team
      (q = b[5 - i]) && (   // or the second team is playing this round:
        --i < 0 ?           //   decrement i; if we've played more than 5 penalties:
          P - Q             //     do we already have a goal difference?
        :                   //   else:
          P - Q > i |       //     was the 1st team already guaranteed to win?
          Q + q - P - p > i //     or is the 2nd team now guaranteed to win
          & p < 2           //     while the 1st team failed its last attempt?
      ) |                   //
      g(                    //   do a recursive call:
        a, b,               //     pass a[] and b[] unchanged
        P + p,              //     update P
        Q += q              //     update Q
      )                     //   end of recursive call
  )(a, b) |                 // try g(a, b)
  !g(b, a)                  // try g(b, a); return 1 if at least one of them is falsy

2

パイソン2176の 169 171 169バイト

@Kevin Cruijssenのおかげで-2バイト

exec"h=lambda a,b,m:m-%s/2>abs(sum(a)-sum(b));f=lambda a,b:a[5#==b[5#and h(a[:5],b[:5],6)if %s>10else h(a,b,7)and h(a[#,b[#,6)".replace("#",":~-%s/2]")%(("len(a+b)",)*6)

オンラインでお試しください!(上記以外の追加のテストケースを含む。)

f2つの引数(スコア付き/スコアなしのペナルティの2つのリスト)を取る関数を作成しTrue、スコアが有効かどうかを返しますFalse

部分的な説明:

まず第一に、exec構築は式をlen(a+b)複数回繰り返す必要がないことにより、数バイトを節約するための単なる方法です。上記のコードは次のコードと同等です。

更新:新しく改善された回答は、execトリックの有無にかかわらず同じバイトカウントであるため、簡単にするために削除しました。

更新2:バグ修正された新しいバージョンには、置換およびexec。はい、同じ文字列で%フォーマットとa を使用し.replaceます。上記のコードは次と同等です:

h=lambda a,b,m:m-len(a+b)/2>abs(sum(a)-sum(b))
f=lambda a,b:a[5:(len(a+b)-1)/2]==b[5:~-len(a+b)/2]and h(a[:5],b[:5],6)if len(a+b)>10else h(a,b,7)and h(a[:(~-len(a+b)/2],b[:(len(a+b)-1)/2],6)

<=5not len(a+b)>10hm

ただし、有効なスコアのセットであるために、入力は厳密に継続可能である必要はありませんが、最後のキックが行われる前に継続可能でなければなりません。この条件は、1)両側が同じ回数キックした最後に継続可能でなければならず、2)現在、継続可能であるという2つの半分の範囲内になければならないということと同等hです。h(a[:~-len(a+b)/2],b[:~-len(a+b)/2],6)テスト条件1)およびh(a,b,7)7マージンの余分な2つの許容ハーフポイントを表す)テスト条件2)。

したがって、各チームが最大5回キックしたケースは解決されました。(他のケースについては説明を続ける。)

低レベルのゴルフに関しては、削るのが多すぎるとは思いませんが、アルゴリズム的にはもっと簡単にできるかもしれません。


1
ゴルフ(%s-1)/2~-%s/2て2バイト節約できます。
ケビンCruijssen

@KevinCruijssenありがとう!
エイダンF.ピアース

1

ゼリー62 54 49バイト

ṫ⁵Ṗm2¬Ạ
N§ỤḢƊ¦LÞṚZFĵ12R:2U_ṁḣ⁵ṫ-N<Ø.ẠaÇoL<3
ṚÇoÇ

オンラインでお試しください!

ṫ⁵Ṗm2¬Ạ # helper function to determine whether
        # even indices at or beyond 10 are zero
ṫ⁵      # tail - take every item from 10
  Ṗ     # remove last item
   m2   # take every second item
     ¬  # logical not, will return 1 for an empty list
      Ạ # all
# function to create cumulative score
# difference and check values
N§ỤḢƊ¦    # negate scores for team with lower score
          # (or one of them if both same score)
  LÞṚ     # sort by length, longest first
  ZF      # transpose lists and flatten
  Ä       # cumulative sum
  µ       # this cumulative score difference (CSD) 
          # now becomes left value
  12R:2U_ # subtract cumulative score difference from
          # 6,5,5,4,4,3,3,2,2,1
  ṁḣ⁵     # shorten to be no longer than 10 items
          # and no longer than CSD
  ṫ-N<Ø.Ạ # check last two values are greater than 0,-1
  aÇ      # check that helper function also TRUE
  oL<3    # handle very short scores
# main link that calls the above for scores in either order
ṚÇoÇ

tioのフッターコードは、複数のテストケースを処理し、入力に対して出力を印刷するためのものです。

8バイトのゴルフをしてくれた@EriktheOutgolferに感謝


よい試み!これはささいな挑戦ではありません。いくつかのゴルフ。
エリックアウトゴルファー

0

Perl 6、123バイト

{all map {@^b>@^a||[R,](map {abs(($+=$_)-++$ %2/2)>(5-++$ /2 max++$ %2)},flat roundrobin @a,-<<@b).skip.any},@^a,@^b,@b,@a}

オンラインでお試しください!

有効なシュートアウトに対してfalseyを返し、無効なシュートアウトに対してtrueyを返します。

説明

# Check whether block returns true (invalid shoot-out) for arguments (a, b) and (b, a)
{all map {...},@^a,@^b,@b,@a}
# Return true (invalid) if array b is longer than a
@^b>@^a||
# Return true (invalid) if any except the last value is true (shoot-out stopped)
[R,](...).skip.any
# Map values from a and negated b, interleaved
map {...},flat roundrobin @a,-<<@b
# Shoot out stopped?
abs(($+=$_)-++$ %2/2)>(5-++$ /2 max++$ %2)
    #     # Accumulator
           #        # Subtract 0.5 for first team
                      #                  # Sequence 4.5 4 3.5 3 2.5 2 1.5 1 1 0 1 0 1 0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.