计算创新八卦的图标


11

创新是一种纸牌游戏,玩家在从史前时代到现代时代的各个年龄段中进行战斗,以期比对手更快地获得成就。

创新中的每张卡都是唯一的,并为玩家提供了许多图标。如果我们将每张卡都视为2x3网格,那么左右两侧四个插槽中的三个插槽将始终被图标占用(黑色六边形中的符号不​​计算在内)。

在此处输入图片说明

该游戏有6种图标(城堡,树冠,树叶,灯泡,工厂和时钟),我们将使用chars任意代表它们012345。使用#代表黑色六边形,我们可以使用4个字符来表示每个卡上的图标。例如,上面的卡片是

0.. #.. 3.. 1..  -> 03#0 #331 355# 144#
3#0 331 55# 44#

现在,在“创新”中,游戏区域中的纸牌被分组为一堆*,以四种方式之一展开。对于每个示例,我们将使用上面的纸牌,假设最左边的纸牌03#0位于堆的顶部。

无花哨:只有最上面的卡片可见

0..
3#0

向左张开:顶部的卡片完全可见,下面所有卡片的右三分之一

0..|.|.|.|
3#0|1|#|#|

向右张开:顶部的卡片完全可见,而下面所有卡片的左三分之一

1|3|#|0..
4|5|3|3#0

向上张开:顶部的卡片完全可见,下面所有卡片的下半部分也完全可见。

0..
3#0
---
331
---
55#
---
44#

挑战

输入将是由空格分隔的单个字符串,该字符串由两部分组成:

  • 展开方向,是中的一个!<>^,分别表示不展开,向左展开,向右展开或向上展开。
  • 非空卡片列表,每个卡片长4个字符,由chars组成012345#。最左边的卡片在纸堆的顶部,每张卡片正好包含一张#

答案可能是函数,完整程序或等效的。您可以选择展开方向是第一个还是最后一个,即选择以下两种格式之一:

> 03#0 #331 355# 144#
03#0 #331 355# 144# >

输出将是六个数字的列表,代表每个图标的计数,例如,上面的示例卡:

! 03#0 #331 355# 144#  ->  2 0 0 1 0 0
< 03#0 #331 355# 144#  ->  2 1 0 1 0 0
> 03#0 #331 355# 144#  ->  2 1 0 3 1 1
^ 03#0 #331 355# 144#  ->  2 1 0 3 2 2

例如,no splay案例具有两个0图标和一个3图标,显示第一行。请注意#,由于黑色六边形不是图标,因此我们不计算s。

您可以选择任何合理且明确的方式表示列表,例如,以分隔符分隔或使用语言的自然列表表示法。

测试用例

! 113#  ->  0 2 0 1 0 0
< 113#  ->  0 2 0 1 0 0
> 113#  ->  0 2 0 1 0 0
^ 113#  ->  0 2 0 1 0 0
! 000# 12#2  ->  3 0 0 0 0 0
< 000# 12#2  ->  3 0 1 0 0 0
> 000# 12#2  ->  3 1 1 0 0 0
^ 000# 12#2  ->  3 0 2 0 0 0
! 000# 111# 222#  ->  3 0 0 0 0 0
< 000# 111# 222#  ->  3 0 0 0 0 0
> 000# 111# 222#  ->  3 2 2 0 0 0
^ 000# 111# 222#  ->  3 2 2 0 0 0
! 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  0 0 0 2 0 1
< 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  1 1 2 5 1 1
> 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  0 3 3 7 1 1
^ 335# #101 21#2 333# 2#20 3#33 4#54 #133 3#33 32#2  ->  2 4 4 10 1 2

请注意,类似这样的内容!是无效输入,因为保证列表是非空的。


*就此挑战而言,我们将忽略绒头颜色。

Answers:


5

CJam,44 37 36字节

感谢Sp3000提醒我,我使事情变得过于复杂,并节省了7个字节。

rci7%"3>0<2<1>"2/=6,slS%{W$~+}*fe=p;

在这里测试。

说明

一些观察:

  • 我们一直想计算整个第一张卡片。
  • 所有展开都会导致删除图标的前缀或后缀。!删除所有字符(前缀或四个字符的后缀),<删除前三个字符,>删除后两个字符,^删除第一个字符。

因此,我们所需要的只是将splay模式映射到正确的截断的简短方法:

rci   e# Read the splay mode and convert to its character code.
7%    e# Take modulo 7. This maps "<!>^" to [4 5 6 3], respectively. Modulo 4 those are
      e# are all distinct (namely [0 1 2 3], respectively).
"3>0<2<1>"
      e# Push this string.
2/    e# Split it into chunks of 2, ["3>" "0<" "2<" "1>"]. Each chunk is CJam code which
      e# performs one of the truncations.
=     e# Select the correct snippet. This works, because array indexing is cyclic in CJam.
6,s   e# Push the string "012345".
lS%   e# Read the remainder of the input and split into space-separated tokens.
{     e# Now we're abusing the fold operation to apply our snippet to every card except
      e# the first, while also combining them all back into a single string.
  W%  e#   Copy the bottom of the stack (the truncation snippet).
  ~   e#   Evaluate it.
  +   e#   Append it the string we're building.
}*
fe=   e# For each character in "012345", count the occurrences in our new string.
p     e# Pretty-print the array.
;     e# Discard the truncation snippet which was still at the bottom of the stack.

我们可以注意到,截断片段实际上具有很多结构。每种显示模式都映射到一个数字[0 1 2 3](具体是按顺序排列"!^><"),其中两个具有>,两个具有<。我希望找到两个散列可以神奇地分别产生这些部分的散列,因为那样可以节省很多字节,但是到目前为止我什么都找不到。我可以使用映射"!^><"到具有交替奇偶校验的数字31%(以从中选择正确的字符"<>"),但是我还没有找到能按此[0 1 2 3]顺序巧妙地映射它们的任何东西。("!^><"#不幸的是,朴素的解决方案没有保存任何字节。)

还要注意,它实际上更加灵活。!也可以实现n>为任何形式n > 3(丢弃所有内容作为前缀)。不幸的是,我也找不到这种地图的任何简单功能。


0

Pyth,39 36 33 31字节

Jtczdm/s+hJm@yk%*%Chz33T19tJ`d6

在线尝试。 测试套件。

说明

  • Jtczd:用空格分隔输入,删除第一部分,并将其余部分保存到J
  • m6:对数字0到5重复以下操作。
    • mtJ:对除第一张卡以外的所有卡重复以下操作。
      • Chz:获取输入中第一个字符的代码点。
      • %*%33T19:将!<>^(33、60、62、94)的代码点映射到数字0、4、5、14。执行的精确计算为cp % 33 * 10 % 19
      • yk:获取当前卡的电源集。这是卡的所有子序列的列表。
      • @:获取与之前计算的索引相对应的幂集的项。
    • +hJ:将第一张卡片附加到结果中。
    • s:将处理后的卡片连接在一起。
    • /`d:计算结果中当前数字的出现次数。
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.