무슨 이닝인가?


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의 상단 또는 하단 일 수 있습니다.

당신의 임무는 그것이 될 수있는 이닝을 반환하는 것입니다.

입력

음이 아닌 정수의 두 목록. Away 팀의 목록이 홈 팀과 비교할 때 같은 크기이거나 한 요소 더 큰 목록은 들쭉날쭉 한 것으로 간주됩니다. 기본값을 사용하지 않으면 점수를 어느 순서로나 답변에 표시 할 수 있습니다. 즉, 원정 팀 다음 홈 팀 (기본값) 또는 홈 팀 원정 팀 (역순). 원하는 경우 더미 데이터로 채울 수도 있습니다. 그렇다면 답변에 상태를 표시하십시오.

산출

이닝 번호와 상단 또는 하단인지를 식별하는 문자열 또는 이와 동등한 것입니다. 예 7B 8T, B7 T8, ['7B','8T']모두 정상입니다. 두 가지 답변이 있으면 두 가지를 모두 출력해야합니다. 형식은 매우 유연합니다.

규칙

  • 입력은 항상 유효합니다
  • 게임은 무기한 추가 이닝으로 들어갈 수 있습니다. 프로그램은 최대 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

두 목록을 역순으로 가져올 수 있습니까? 즉, 하단 다음 상단?
Jo King

@JoKing Sure, 그것이 언급되고 대답이 여전히 올바르게 일치하는 한 확실합니다.
Veskah

양수 / 음수 리턴 값이 허용 가능한 출력입니까?

@Rogem 그것은 조금 밀고 있지만 글을 읽는 것은 괜찮습니다. 나는 출력이 매우 유연하다고 말했다.
Veskah

답변:


4

C (gcc) , 50 바이트

인터리브 된 목록에 대한 포인터로 입력을 {them#1, us#1, them#2,...}받습니다 (예 :) .

수정을 통해 한 옵션을 반환하고 반환 값을 통해 다른 옵션을 반환합니다.

음수 값은 이닝의 맨 아래를 나타내고 양수 값은 이닝의 맨 위를 나타냅니다. 0은 "빈"입니다. 출력의 절대 값은 이닝 수입니다. 따라서 -4,5가능성은 다섯 번째의 상단과 네 번째의 맨 아래에 있으며 1,0, 유일한 가능성은 첫 번째의 맨 위에 있음을 나타냅니다.

매크로의 반환 값을 사용하여 1 ~ 2 개의 가능한 이닝이 있는지 확인할 수 있습니다. 반환 값은 0다른 이닝이없는 경우입니다. 그렇지 않으면, 이닝 수입니다.

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

펄 6 , 52 48 45 바이트

nwellnhof의 일부 구조 조정 덕분에 -3 바이트!

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

온라인으로 사용해보십시오!

입력 값을 맨 위와 맨 아래로 두 번 입력하는 익명 코드 블록 출력은 튜플의 목록이며, 첫 번째 요소는 시작 번호이고 두 번째 요소는 True 또는 False이며 Bottom 또는 Top에 해당합니다.

설명:

       {                                    }  # 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

R , 103 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 바이트를 절약했습니다!

두 개의 목록 벡터를 입력으로 취하고 가능한 이닝을 나타내는 하나 또는 두 개의 정수를 출력합니다. 양의 정수는 이닝의 상단이고 음의 정수는 이닝의 맨 아래입니다.

R에서 양의 정수는 진실이므로 길이의 차이를의 첫 번째 인수로 사용할 수 있습니다 if().


당신은 아마 더 나은 운이있을 것이다 [[int로서 if사용하기 때문에 교체 [코드에서.
Giuseppe

@Giuseppe 나는 그것을 시도 <하고 ^. 나는 [내가 기억하는 예에서 사용 된 것이라고 생각 합니다.
BLT

당신은 또한 다른 이름을 지정할 수 있습니다 'if'(및 제거 {}하고 f=밖으로 이동 ) : 96 바이트
digEmAll



2

파이썬 (2) , 135 (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]

온라인으로 사용해보십시오!

@ovs 덕분에 -1

@ovs에게 -4 감사합니다


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

if d나는 그것을 볼 수 있지만 (그것을 놓쳐서는 안된다!)하지만 else"11BT"[c<1::2]내가 빠진 것이 아니라면 나를 위해 더 짧게 나오지 않습니다.
ElPedro

if d어쨌든 영감을 얻은 다른 방법을 찾았으므로 @ovs를 걱정하지 마십시오 .
ElPedro

대신에 if d당신이 할 수있는 if b, 당신은 저장 할 필요가 없습니다 len(b)변수에.
ovs

@ovs 나는 그것을 보았지만 필요 d합니다 [d<c]. 그 길을 볼 수 없습니다. 어떤 아이디어?
ElPedro

1

파이썬 2 , 65 바이트

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

온라인으로 사용해보십시오!

맨 아래 이닝 가능성에 이어 맨 위 목록 인 두 줄을 단일 목록으로 인쇄합니다. 둘 중 하나를 사용할 수 없으면 해당 목록이 비어 있습니다.


1

클린 , 84 75 바이트

import StdEnv
$ =length
?v|last[0:v]>0= $v=0
@a b| $b< $a=(?a,$a)=($a+1,?b)

온라인으로 사용해보십시오!

함수 @ :: [Int] [Int] -> (Int, Int)와 일부 도우미를 정의합니다 . 0은 null 가능성을 나타내는
형식으로 출력을 제공합니다 (Top, Bottom).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.