我想在这里尝试一种新的代码高尔夫形式。与奖金类似,并非必须完成挑战的所有部分,但每个答案都必须实现一定规模的子集(并且每个答案都必须实现一个核心)。因此,除了打高尔夫球之外,这项挑战还涉及选择一套可以完美搭配的功能。
规则
Kingdom Builder是一种棋盘游戏,在(尖顶)十六进制网格上播放。该评估板由四个(随机的)象限组成,每个象限具有10x10的十六进制单元(因此完整的评估板将为20x20)。出于此挑战的目的,每个十六进制单元格包含水(W
),山(M
),城镇(T
),城堡(C
)或为空(.
)。所以象限看起来像
. . W . . . . . . .
. M W W . . . . . .
. M . . W . . . T .
M M . W . . . . . .
. . M . W W . . . .
. . . . . W W W W W
. T . . . . . . . .
. . W . . C . . . .
. . W W . . . . M .
. . . . . . . M M .
第二行将始终从第一行向右偏移。玩家1
到4
最多可以放置在空单元(以下一些规则,我们将迎接这一挑战忽略)每40个定居点。游戏结束时可能的棋盘如下:
3 3 W . . . 4 . 4 . . 2 W . 4 . . 4 . 4
3 M W W . 1 1 . . 4 2 W . 3 C 4 4 . . 4
3 M 2 2 W 1 1 1 T 3 2 W 4 3 . 1 4 . 4 .
M M . W 2 2 . . . 2 2 W 3 . 1 1 1 . . .
. 4 M . W W 2 2 2 2 W W 3 . 1 4 . T . .
. . . . . W W W W W . 3 C 1 . . 2 2 2 2
. T 1 1 1 1 . . 2 . . 4 . . . 2 2 M M M
4 . W 4 . C 4 4 . . . . . . 2 M M M M M
. 4 W W . . . 4 M . . W . W . 2 2 2 M M
. . . . . . . M M . . W W . . . . 2 M .
. . . 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 . 1
M 3 3 . . . . . . . . 4 . T 2 . 2 4 1 .
M M . C . 4 . 4 . . . . . 1 2 4 2 1 1 .
M . . 1 . 4 . . . . M M 1 2 . . 2 1 . .
. . . W 1 1 4 1 1 . . . 1 2 . . 2 W W W
. . 1 1 W 1 T . 1 1 1 1 T . . 2 W . 4 .
. 1 1 W . 3 3 . . . . . . . . 2 W 4 C 3
C 1 3 3 3 . 3 . 4 . 4 . 4 . . 2 W 1 1 M
4 3 3 4 . M 4 3 . . . . . . . 2 W . . .
. . . 4 . M M 3 . . 4 4 . 4 . 2 W W . .
我们将象限标记为
1 2
3 4
您的任务是为这样的董事会打分。始终使用一个核心分数,并且有8个可选分数,每个游戏选择3个。†在下文中,我将描述所有9个得分,并以上述设置为例,说明每个玩家将获得多少积分。
†在实际比赛中有10个得分,但我将遗漏2个得分,因为没人愿意打这些得分。
核心分数。玩家每获得一个毗邻的定居点,就会获得3分C
。分数示例: 18、0、15、12。
可选分数。
玩家获得至少一个结算点的每一水平行可获得1分。
范例分数: 14、20、12、16。
对于每个玩家,找到他们大部分定居点所在的水平行(如果出现平局,则选择任意行)。玩家在该行上的每个结算获得2分。
分数示例: 14(第16行),8(第4、5或6行),28(第11行),10(第1行)。
玩家在靠近战场的每个定居点可获得1分
W
。范例分数: 13、21、10、5。
一名玩家每获得一个结算将获得1点
M
积分。分数示例: 4、12、8、4。
计算每个象限中每个玩家的结算。每个象限中,拥有最多定居点的玩家每人获得12点,拥有第二数量的定居点的玩家每人获得6点。
分数示例: 18(6 + 0 + 6 + 6),36(12 + 12 + 0 + 12),12(0 + 0 + 12 + 0),18(12 + 6 + 0 + 0)。
为每个玩家确定他们拥有最少定居点数量的象限。玩家在该象限中的每个结算都获得3分。
分数示例: 18(第2个象限),0(第3个象限),15(第1或第2个象限),27(第3个象限)。
玩家每连接一组定居点可获得1分。
范例分数: 7、5、6、29。
玩家在最大的关联解决方案组中每2个解决方案可获得1点积分。
分数示例: 4、10、8、2。
挑战
与在游戏中一样,您将选择3个可选分数,并根据核心分数和这三个分数为给定的棋盘评分。您的代码应列出4个分数。但是,在选择上有一个限制:我将分数分为3组,而您将实现每个组之一:
- 实现1和2之一。
- 实现3,4,5和6之一。
- 实现7和8之一。
您可以编写程序或函数,通过STDIN,命令行参数,提示符或函数参数进行输入。您可以返回结果或将其打印到STDOUT。
您可以为输入选择任何方便的1D或2D列表/字符串格式。您可能无法使用带有完整邻接信息的图。如果您需要灵感,可以在六角格上阅读一些不错的文章。
您的输出也可以采用任何方便,明确的列表或字符串格式。
这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。
进一步的假设
您可能会认为...
- ...每个玩家至少有1个和解,每个玩家最多不超过40个和解。
- ...每个象限包含一个城镇和两个城堡,或者两个城镇和一个城堡。
- ...城镇和城堡之间的距离足够远,以至于没有一个定居点可以与其中两个相邻。
测试用例
仍然使用上面的面板,这是评分机制所有可能选择的个人分数:
Chosen Scores Total Player Scores
1 3 7 52 46 43 62
1 3 8 49 51 45 35
1 4 7 43 37 41 61
1 4 8 40 42 43 34
1 5 7 57 61 45 75
1 5 8 54 66 47 48
1 6 7 57 25 48 84
1 6 8 54 30 50 57
2 3 7 52 34 59 56
2 3 8 49 39 61 29
2 4 7 43 25 57 55
2 4 8 40 30 59 28
2 5 7 57 49 61 69
2 5 8 54 54 63 42
2 6 7 57 13 64 78
2 6 8 54 18 66 51