それは何イニングですか?


15

ゴール

ワールドシリーズが間近に迫っているので、ボックススコアを読み取って、イニングとは何かを教えてくれるプログラムが必要です。野球はスコアを記録するために奇妙な方法を使用するため、これは少し複雑です。彼らは、イニングの打席チームの得点を、ランを記録するまで(そして、まだ行っている)、または打席を終了するまで書き留めません。したがって、スコアボードの0は常に打席が終了したことを意味します。例えば:

Example A:
Inning| 1| 2| 3| 4| 5| 6| 7| 8| 9|
  Them| 0| 0| 0| 0| 0| 2|  |  |  |
    Us| 0| 0| 2| 0| 0| 0|  |  |  |

Example B:
Inning| 1| 2| 3| 4| 5| 6| 7| 8| 9|
  Them| 0| 0| 0| 0| 0| 2|  |  |  |
    Us| 0| 0| 2| 0| 0| 1|  |  |  |

Example C:
Inning| 1| 2| 3| 4| 5| 6| 7| 8| 9|
  Them| 0| 0| 0| 0| 0| 2|  |  |  |
    Us| 0| 0| 2| 0| 0|  |  |  |  |

#Them is the Away Team, Us is the Home Team (who are the guys you root for)
  • 例A:6番底に0が記録されており、7番上が空白であるため、7番上にいることがわかります。
  • 例B:6番目の下部または7番目の上部のいずれかです。
  • 例C:6番目の上部または下部のいずれかです。

あなたの仕事は、どのイニングになる可能性があるかを返すことです。

入力

非負整数の2つのリスト。リストは、アウェイチームのリストが同じサイズであるか、ホームチームのリストと比較して1つの要素が大きい、ギザギザと見なされます。スコアはどちらの順序でも取得できますが、デフォルトを使用しない場合は回答に記載してください。すなわち、アウェイチーム、次にホームチーム(デフォルト)、またはホームチーム、次にアウェイチーム(逆転)。必要に応じてダミーデータをパディングすることもできます。そうする場合は、回答に記載してください。

出力

イニング番号とそれが上か下かを識別する文字列または同等のもの。例えば7B 8TB7 T8['7B','8T']すべての罰金です。2つの答えがある場合、両方を出力する必要があります。ただし、フォーマットはかなり柔軟です。

ルール

  • 入力は常に有効です
  • ゲームは無期限の追加イニングに入ることができます。あなたのプログラムは255イニングまでサポートできるはずです。
  • 標準的な抜け穴は禁止されています
  • これはので、最短のコードが勝ちます

テストケース

#Input:
[[], 
 []] 
#Output: 1T

#Input:
[[0], 
 []] 
#Output: 1B

#Input:
[[0,0,0,1], 
 [0,0,0,0]] 
#Output: 5T

#Input:
[[0,0,0,1], 
 [0,0,0,1]] 
#Output: 4B, 5T

#Input:
[[0,0,0,1,0,0,1,0,0,1],
 [0,0,0,0,1,0,0,1,0,1]] 
#Output: 10B, 11T

#Input:
[[0,0,0,1], 
 [0,0,0]] 
#Output: 4T, 4B

#Input:
[[0,0,0,0], 
 [0,0,0]] 
#Output: 4B

2つのリストを逆の順序で取得できますか?すなわち、下から上?
ジョーキング

@JoKing確かに、注記されていて、答えがまだ正しく一致している限り。
ヴェスカ

正/負の整数の戻り値は許容可能な出力ですか?

@Rogemそれは少しそれをプッシュしていますが、あなたの記事を読んで、それは結構です。出力は非常に柔軟であると言いました。
ヴェスカ

回答:


4

C(gcc)、50バイト

入力をインターリーブされたリストへのポインタとして受け取ります(すなわち{them#1, us#1, them#2,...})。

変更によって1つのオプションを返し、戻り値によって他のオプションを返します。

負の値はイニングのボトムを示し、正の値はイニングのトップを示します。ゼロは「空」です。出力の絶対値は、イニングの数です。したがって、-4,5可能性が5番目の上部であり、4番目の下部である1,0可能性を示し、唯一の可能性が最初の上部であることを示します。

マクロの戻り値を使用して、1回または2回のイニングがあるかどうかを判断できます。戻り値は0、他のイニングがない場合です。それ以外の場合は、イニングの番号です。

ソースコードのゼロバイト。次をプリプロセッサフ​​ラグとして使用します。

-Df(o,n,l)=({o=n%2?~n/2:n/2+1;l[n-1]?-o-~n%2:0;})

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

デゴルフ

-Df(o,n,l)=({
// Define a function-like macro f(o,n,l)
// o is the output variable, n is the size of the list, 
// l is a pointer to the first element of the list.
o=n%2?~n/2:n/2+1;
// If there's an odd number of elements, first possible inning is -(n+1)/2. 
// Else, it is (n/2)+1.
l[n-1]?-o-~n%2:0})
// If the score from the last inning is non-zero, the other possible inning
// needs to be determined; flip the sign of first output value then deduct 
// 1 from it if the number of elements is even.

また、リストの順序が逆(最初から最後)であると想定できる場合、または配列の最後の要素を指すポインターである場合、これはさらに4バイト増えます。それはあまりにもチートのように感じたので、そのために行きませんでした。

元の仕様とはまったく異なる(そして有用である)ように見えるので、あなたがしたように入力を受け入れても大丈夫なら@veskahから聞いてみたいです。
BLT

2
@BLT慣例により、インターリーブはリストのリストがCで行われる方法です。複数の逆参照はリソースに非常に負担がかかります。他のオプションは、リストを次々に作成することですが、新しい要素を追加することは非常に非現実的です。

3

Perl 6の52の48 45バイト

nwellnhofからの再構築のおかげで-3バイト!

->\a,\b{(+a,a==b if (b,a)[a>b].tail;b+1,a>b)}

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

上部と下部の2つのリストとして入力を受け取る匿名コードブロック。出力はタプルのリストです。最初の要素はイニング番号で、2番目の要素はボトムまたはトップに対応するTrueまたはFalseです。

説明:

       {                                    }  # Anonymous code block
->\a,\b   # That takes input lists a and b
        (                                  )   # Return a list of
                                    b+1,a>b    # A list of 
                                               #  The length of the second list plus 1
                                               #  And top/bottom
         +a,a==b     # And the length of the first list
                     # And the other of top/bottom
                 if  # Only if:
                    (b,a)[a>b]      # The current of top/bottom's
                              .tail # Last element exists and is not 0

3

R103 96バイト

function(a,b,l=sum(a|1),k=sum(b|1))I(l,I(l-k,I(a[l],c(l,-l),-l),I(b[l],c(-l,l+1),l+1)),1)
I=`if`

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

@digEmAllは7バイトを節約しました!

2つのリストを取ります入力としてベクトルを受け取り、可能なイニングを表す1つまたは2つの整数を出力します。正の整数はイニングの上部であり、負の整数はイニングの下部です。

Rでは、正の整数は真であるため、長さの違いをの最初の引数として使用できますif()


コードで使用するので[[、おそらくif代替品としてより良い運[があります。
ジュゼッペ

@Giuseppe私はそれを試してみました<^。私[が覚えている例で使用されたものだと思います。
BLT

別の名前を付けることもできます'if'(削除{}してf=外に移動します
-digEmAll



2

パイソン2135の 129 126 125 123 119バイト

a,b=input()
c=len(a)
e,f=`c+1`+"T",`c`+"B"
print((f+e,e)[b[-1]<1],(`c`+"T"+f,f)[a[-1]<1])[len(b)<c]if b else"1"+"TB"[c]

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

-1 @ovsのおかげで

-4 @ovsに再び感謝


if d else"11BT"[c<1::2]-3
ovs

if d私は見ることができます(それを見逃してelse"11BT"[c<1::2]はなりません!)が、私が何かを見逃していない限り、私にとってこれ以上短くなることはありません。
エルペドロ

if dとにかくあなたに触発された別の方法を見つけたので、@ ovsの心配はありません。
エルペドロ

if dあなたができる代わりに、変数if bに保存する必要はありませんlen(b)
ovs

@ovs私はそれを見ましたが、また必要dです[d<c]。その周りの方法を見ることができません。何か案は?
エルペドロ

1

Python 2、65バイト

a,b=input()
exec"a,b=[0]+b,a;print[len(b)][a[-1]<len(a+b)%2:];"*2

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

シングルトンリストとして、最初に下から上へ、次に上から1行の2行を出力します。どちらかが不可能な場合、そのリストは空です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.