这是什么客栈?


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:我们知道我们位于第七名的顶部,因为我们在第六名的底部记录了0,而第七名的顶部为空白。
  • 示例B:可以是第六个的底部或第七个的顶部。
  • 例C:可以是第6个的顶部或底部。

您的任务是返回可能的一局。

输入值

两列非负整数。与主队的名单相比,客队的名单与原队的名单大小相同或大1个元素。您可以按任何顺序获取分数,但如果不使用默认值,请在答案中注明。即,先是客队,然后是主队(默认),或先是主队,然后是客队(倒车)。如果需要,也可以用虚拟数据填充它们,如果需要,请在答案中注明。

输出量

一个字符串或等效形式,用于标识局号以及它是顶部还是底部。例如7B 8TB7 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

我们可以按相反的顺序列出两个列表吗?即底部然后顶部?
乔·金

@JoKing当然可以,只要已注明并且答案仍然正确匹配即可。
维斯卡

正/负整数返回值是可接受的输出吗?

@Rogem有点麻烦,但阅读您的文章,就可以了。我确实说过输出非常灵活。
维斯卡

Answers:


4

C(gcc),50个字节

将输入作为指向交错列表(即{them#1, us#1, them#2,...})的指针。

通过修改返回一个选项,另一个通过返回值返回。

负值表示一局的底部,正值表示一局的顶部。零是“空”。输出的绝对值是局数。因此,-4,5表示可能性在第五名的顶部和第四名的底部,并且1,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

Perl 6的52个48 45字节

-3个字节,归功于nwellnhof的一些重组!

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

在线尝试!

将输入作为顶部和底部两个列表的匿名代码块。输出是一个元组列表,其中第一个元素是局数,第二个元素是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个字节!

有两个清单向量作为输入,并输出一个或两个表示可能的局的整数。正整数是一局的顶部,负整数是一局的底部。

在R中,正整数是真实的,因此我可以将长度的差用作的第一个参数if()


你可能会拥有更好的运气[[作为if替代,因为你用[在你的代码。
朱塞佩

@Giuseppe我尝试了<^。我想这[是我记得的示例中使用的那个。
BLT

您也可以给其他名称命名'if'(并删除{}并移至f=外部):96个字节
digEmAll


2

果冻,11字节

ZẎṖṠṪ$СẈd2

在线尝试!

第一个元素:基于0的列索引。
第二要素:0顶部,1底部。

输出是上面指定的一对或两对的列表(以更好地显示它)。输出接点的顺序相反。


2

Python 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]

在线尝试!

-1感谢@ovs

-4再次感谢@ovs


if d else"11BT"[c<1::2]对于-3
ovs '18 -10-23

if d我可以看到(不应该错过!),但是else"11BT"[c<1::2]对于我来说,它不会显得更短,除非我错过了一些东西。
ElPedro '18 -10-23

@ovs不用担心,因为if d无论如何我发现了另一种启发您的方法。
ElPedro '18

除了if d可以做之外if b,您也不需要存储len(b)在变量中。
ovs

@ovs我看着这一点,但还需要d进行[d<c]。看不到这样的方法。有任何想法吗?
ElPedro '18 -10-23

1

Python 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)和一些帮助器。以零表示零可能性
的形式给出输出(Top, Bottom)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.