解密扩展的韦氏格式


18

此挑战基于user48538的沙箱帖子。由于他不再活跃于此站点,因此我接手了这项挑战。


apgsearch是Conway的《生命游戏》的分布式汤搜索程序和搜索结果数据库,Catagolue使用apgcodes样式进行分类和表示。apgcode本身使用扩展的Wechsler格式,这是Allan Wechsler在1992年开发的模式符号的扩展。

以下示例和图像取自LifeWiki

  1. 集合中与正则表达式匹配的n个字符的字符串[0-9a-v]表示一条5行,n列宽的条带。每个字符表示对应于位串五个单元在垂直柱[ 000001000001000... 00010100100101011010... 11111]。

    例如,27deee6对应于重量级的太空飞船

27岁

[01个1个00001个1个01个1个1个1个01个1个1个1个1个1个001个1个1个1个00000000]
  1. 字符z分隔连续的五行带。

    例如,0ca178b96z69d1d96对应于31位静物:

在此处输入图片说明

在此处输入图片说明

[0001个1个01个1个0001个01个01个01个01个001个0001个01个1个001个1个1个000000000001个1个1个1个1个0001个000001个001个01个01个01个0001个1个01个1个000000000000]
  1. 字符wx分别用于缩写00000

    因此w33z8kqrqk8zzzx33对应于跨女王蜂班车

在此处输入图片说明

在此处输入图片说明

(省略10行)

在此处输入图片说明

[001个1个000001个1个0000000000000000000000000001个000001个1个1个0001个0001个01个01个1个1个01个01个1个1个1个1个000000000000000000000000000000000000000000000000000000000000000000000000001个1个000001个1个00000000000000000000000]
  1. 最后,与正则表达式匹配的符号y[0-9a-z]对应于4到39个连续0s 之间的游程。

    一个很好的例子是31a08zy0123cko,对应于四极上的一艘船

在此处输入图片说明

在此处输入图片说明

[1个1个000000001个01个00000000000000000001个01个00000000000000000001个01个000000001个1个00000000001个1个000000001个01个000000001个1个]

挑战

编写程序或函数以解析上面定义的扩展的Wechsler格式的字符串,并打印(或返回)与此字符串相对应的模式。

您可以假定该字符串为非空字符串,并且不以开头或结尾z

您可以使用任何合理的输出格式,例如字符串,矩阵,二维数组。您可以使用任意两个值来表示01,前提是您在答案中声明了它们。

您可以在输出中省略尾随零行,或添加额外的尾随零行。您还可以在每行上添加/忽略尾随零,只要所有行的输出长度相同即可。

如果更方便,则可以返回数组的转置。

这是,因此最短的代码获胜。

测试用例

153 => [[1, 1, 1], [0, 0, 1], [0, 1, 0], [0, 0, 0], [0, 0, 0]]
27deee6 => [[0, 1, 1, 0, 0, 0, 0], [1, 1, 0, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0]]
0ca178b96z69d1d96 => [[0, 0, 0, 1, 1, 0, 1, 1, 0], [0, 0, 1, 0, 1, 0, 1, 0, 1], [0, 1, 0, 0, 1, 0, 0, 0, 1], [0, 1, 1, 0, 0, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0, 1, 0, 0], [1, 0, 1, 0, 1, 0, 1, 0, 0], [0, 1, 1, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]
w33z8kqrqk8zzzx33 => [[0, 0, 1, 1, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 1, 1, 1, 0, 0], [0, 1, 0, 0, 0, 1, 0], [1, 0, 1, 1, 1, 0, 1], [0, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]
31a08zy0123cko => [[1, 1, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 1, 1]]
o5995ozes88sezw33 => [[0, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 1, 0], [1, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 1], [1, 1, 0, 0, 1, 1], [1, 1, 1, 1, 1, 1], [0, 1, 0, 0, 1, 0], [0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
y3343x6bacy6cab6x343zkk8yy8kkzgo8gywg8ogz0123yw321zzgo4syws4ogzgh1yy1hgz221yy122zy3c2cx6d53y635d6xc2c => [[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

z在一开始就发生吗?
Xcoder先生18年

@ Mr.Xcoder LifeWiki页面没有对此进行任何说明。但是您可以在此处假设字符串不是以开头或结尾z
alephalpha

3
并不是真正的“人生游戏”模式,而只是为了好玩:vv99f60vv99f60uv11320uv19rqz33y133y11322310132231
Arnauld

1
“您可以返回数组的转置”-如果可以,那么其他对称性(例如上下颠倒等等)又如何呢?
乔纳森·艾伦,

1
前三个答案中的两个失败其中的一些:1yx11yy11yw11yz1。也许他们应该进行测试。
乔纳森·艾伦

Answers:


2

木炭,50字节

UB0≔⁺⭆χιββFS¿υ×0⁺⊟υ⌕βι≡ιz×⸿⁵y⊞υ⁴x×0³w¦00«P↓⮌⍘⌕βι²→

在线尝试!链接是详细版本的代码。用途10。说明:

UB0

将背景(即包含输出的矩形的所有未打印单元格)设置为0

≔⁺⭆χιββ

将数字前缀为预定义的小写字母。

FS

循环输入字符串。

¿υ

如果预定义的空列表不为空...

×0⁺⊟υ⌕βι

...然后打印0由列表中弹出的数字与数字和字母中当前字符的索引之和得出的s数。请参阅下面的数字始终是多少。

≡ι

切换当前字符。

z×⸿⁵

如果是,z则输出5回车,将我们带到下一个输出条。

y⊞υ⁴

如果是y,则推4送到预定义的空列表,使4+n 0s下一次输出。

x×0³

如果是,x则输出3 0s。(这是通过重复执行的,以避免字面量0接触x或后面的字面量。)

w¦00

如果是,w则输出2 0s。(¦需要使用来分隔两个字符串文字。)

«P↓⮌⍘⌕βι²→

否则,用数字和字母索引当前字符,转换为二进制,然后首先将结果向下最低有效位打印;然后将光标向右移动到下一列。


6

JavaScript(ES8),197个字节

将输入作为字符串。返回带有'#'和空格的字符串数组。输出可能在每行上包含额外(但一致)的尾随空格。

s=>[x='x',...s.replace(/w|x|y./g,s=>''.padEnd(s<x?2:s>x?P(s[1],36)+4:3),P=parseInt)].map(c=>[!++w,1,2,3,4].map(i=>c<x?o[y+i-5]+=' #'[P(c,36)>>i&1]:o=[...++y&&o,'']),w=y=o=[])&&o.map(r=>r.padEnd(w))

在线尝试!(预定输出)

怎么样?

全局变量

  • 该字符"x"已使用多次,因此值得将其存储到变量x中
  • 该函数parseInt使用了两次,因此值得将其存储到变量P中
  • y是行索引,初始化为0
  • w跟踪用于填充最终输出的宽度的上限。
  • o []是输出数组,最初为空。

预处理重复零

我们首先替换所有模式"w""x""yX"在输入字符串中使用适当数量的空格。这些空格将在以后解释为"0"

s.replace(
  /w|x|y./g,
  s => ''.padEnd(
    // w --> 2
    s < x ? 2 :
    // yX --> value of X + 4
    s > x ? P(s[1], 36) + 4 :
    // x --> 3
    3
  )
)

解码

我们拆分结果字符串,在每个字符c之前加上一个首字母"x"并迭代5次(i = 04):

  • 如果c小于"x",则将相应的模式附加到接下来的5行。

    o[y + i - 5] += ' #'[P(c, 36) >> i & 1]
  • 如果c大于或等于"x",我们在o []中分配5个新的空字符串,并将5加到y上。这是由在"x"字符串开头添加的首字母或"z"原始内容中的任何字母触发的。

    o = [...++y && o, '']

填充

最后,我们将o []中的每个字符串都用空格填充,以便它们都具有w个字符。

o.map(r => r.padEnd(w))

6

05AB1E148个 132 98字节

我是一名高中生,这是我第一次打高尔夫球和使用05AB1E,因此非常感谢!

„YY¾38×:'Yð:žLRDUsð«#εNĀiDнXsk4+s¦sú]'W¾2×:'X¾3×:J'Z¶:.Bð¾:vNUyvDykDNX‚Š32VY‹iY+b¦RX_i¶ì}‚ˆ]¯{€¦˜J

在线尝试!

在线尝试!

在线尝试!

将输入作为大写,并将转置后的矩阵作为1s和0s的多条输出线输出。可能会添加额外的零。

如果要使用小写字符串进行测试,请添加uTIO标头。

如果要输出漂亮的输出,请添加'1'█:'0'.:TIO页脚。

说明

(我称“行”和“列”与您期望的相反,因为它会生成转置矩阵)

基本算法是:

  1. 将“ yy”替换为38 0
  2. 拆分“ y”,然后扩展0行程。
  3. 替换为“ w”和“ x”
  4. 找出最长的列(即z之间的最长字符串),并填充所有其他列,使它们等于该长度。(这是必需的,因为下面的算法是如何工作的)
  5. 在z上分割
  6. 此时,输入字符串是一个列数组,其中每个列是[0-9A-V]字符串,其中每个列的长度相同。
  7. 将其转换为输出格式的算法是
    1. 通过在查找字符串中使用indexOf将字符转换为数字
    2. 将字符转换为二进制,然后填充为长度5
    3. 如果是第一列,请在二进制数字之前添加换行符
    4. 在存储字符的行然后是列的二进制字符串的开头添加一个前缀。
    5. 将带有前缀的二进制字符串推送到05AB1E的“全局数组”寄存器/变量
  8. 对全局数组进行排序。前缀字符串(确定排序顺序)将确保所有内容以正确的顺序结束并且换行符位于正确的位置。
  9. 从全局数组的每个元素中删除前缀字符串
  10. 用“”将数组连接起来并打印。

您还可以在下面的扩展代码中看到一些其他次要细节。每行末尾的选项卡之后的所有内容均为注释,可以忽略。(顺便说一句,此注释方案不是05AB1E的一部分。之所以这样做是因为它看起来不错。)以“ @”开头的注释行用于调试目的,可以在不更改最终输出的情况下省略。

„YY¾38×:                                        Replace "YY" with 38 0's. (y is the 34th character in the index, so need to add 34+4 = 38). ¾ is initialized to zero, which saves one byte from typing '038
'Yð:                                            Replace "Y" with " "                                
"Replaced input Stage1 = "?D,                   @DEBUG

žLR                                             Pushes [0-9A-Za-z]
DU                                              Set X to [0-9A-Za-z] and leave [0-9A-Za-z] on the stack.
s                                               Swap top two elements. Now the stack is [0-9A-Za-z],input

ð«                                              Append a space so the below splitter works even if there are no other spaces.
#                                               Split input on " ", which "Y" has been replaced with
ε                                               Map. This map replaces the y runs
    "Element = "?D,                             @DEBUG
    "N = "?N,                                   @DEBUG
    NĀi                                         If N != 0   
        "Replacing!",                           @DEBUG
        Dн                                      Get the first letter
        X                                       Push X
        s                                       Swap
        k                                       X (which is [0-9A-Za-z]) .indexOf(firstLetter)
        "indexOf run token = "?D,               @DEBUG
        4+                                      Add 4 to the index, now becoming the number of zeros to add
        s                                       Swap. Now top is the string between runs
        ¦                                       Remove the first character
        s                                       Swap again. Now the top is the number of zeros to add.
        ú                                       Add that many spaces (will be replaced with zeros later) to the start of the element.
        "Element Replaced = "?D,                @DEBUG
]
'W¾2×:                                          Need to do this replacement after the Y replacement so stuff like YW gets parsed properly. Again, ¾ is zero.
'X¾3×:
J                                               Join with ""
"Replaced input Stage2 = "?D,                   @DEBUG
'Z¶:                                            Replace "Z" with "¶".
.B                                              "Squarify" command. Splits on \n and appends spaces to the end of each element so each is the same length. In this case, that is equivalent to adding zeros to the end of each column, which is what we want.
ð¾:                                             Replace spaces (which we used for padding above) with zeros.
"Replaced input Stage3 = "?D,                   @DEBUG
"0 Stack top = "?D,                             @SDEBUG
"0 Stack top-1 = "?sD,s                         @SDEBUG
v                                               pop and loop over top element, which is array of column code
    NU                                          Store the column number in X
    yv                                          Loop over each character in the column              
        "1 Stack top = "?D,                     @SDEBUG
        "1 Stack top = "?D,                     @SDEBUG
        D                                       Duplicate top element (which is now [0-9A-Za-z])
        y                                       Push y (special loop variable)
        "Character = "?D,                       @DEBUG
        k                                       Push indexOf y in [0-9A-Za-z]
        "Index = "?D,                           @DEBUG
        "2.1 Stack top = "?D,                   @SDEBUG
        "2.1 Stack top-1 = "?sD,s               @SDEBUG
        D                                       Duplicate index.
        NX‚                                     Push [rowNumber,columnNumber]. This result is used for sorting.
        Š                                       Triple swap. The top of the stack is now sortPrefix, index, index
        32V                                     Set Y to 32
        Y‹i                                     index < 32. This uses up one copy of index
            Y+                                  Add 32 to the index
            b                                   Push the index in binary. This uses the second copy of index. 
            ¦                                   Remove the first character, which will be a 1 because we added 32. The result is now a padded binary string of length 5
            "Binary = "?D,                      @SDEBUG
            R                                   Reverse the binary string. This gives the proper transposed output. 
            X_i                                 This will only run if X (which is set to the column number) == 0. (Runs !X)
                ¶ì                              Stick a linebreak at the beginning of the binary string
            }
            "2.5 Stack top = "?D,               @SDEBUG
            "2.5 Stack top-1 = "?sD,s           @SDEBUG         
            ‚                                   At this point the top of the stack is sortPrefix,binaryString. This will combine the two into a list.
            "Pushing '"?D?"'",                  @DEBUG
            ˆ                                   Push [[rowNumber,columnNumber],binaryString] to global array
            "2.6 Stack top = "?D,               @SDEBUG
            "2.6 Stack top-1 = "?sD,s           @SDEBUG
        ]                                       Close all blocks
¯                                               Push global array

{                                               Sort global array. 
"Sorted Data = "?D,                             @DEBUG
€¦                                              Remove the sort prefix              
˜                                               Flatten. Before doing this, the array is in the format [[<binary string>],[<binary string>],[<binary string>],...]
J                                               Join with ""
'1'█:'0'.:                                      @DEBUG pretty print 

1
您好,欢迎来到PPCG;非常好的第一篇文章!关于你的字节数:你是对的。TIO甚至使用05AB1E代码页方便地显示148个字符由148个字节表示。
乔纳森·弗雷希

一个小注意事项:大多数高尔夫语言都实现隐式打印;我认为您可以省略最后一个,
乔纳森·弗雷希

我仔细查看并进行了一些改进。行为仅在理论上适用于行或列超过1000的事物,此时较小的程序将执行意外的事情。
kerwizzy

并非最容易开始的挑战!干得好,我想一些05AB1E坚强的指针在经过时会提供一些方便的提示。
乔纳森·艾伦

1
欢迎来到PPCG和05AB1E的世界。我没有那么多时间,现在,我只用05AB1E开始几个月前,所以我没有那么多亲的又下去,但这里的一些小东西高尔夫:"yy"„yy(05AB1E有内置2个字符和3个字符的字符串)。>≠可以Ā(实实在在,基本上0仍然存在0,其他一切都变成了1)。}}可以是](关闭所有循环和if-elses)。我确信05AB1E型职业高尔夫球手中的一些人能够打出比我更坚固的东西,甚至可能使字节数减半。
凯文·克鲁伊森

4

APL(Dyalog Unicode)87 80 77 67 63字节

感谢H.PWiz节省了7个字节,而ngn节省了另外13个 17。

a←⎕D,⎕A⋄,⍉↓⊖(5/2)⊤↑35(≠⊆⊢)a'Y.|W|X'R{'0'/⍨30 36|a2↑⍵.Match}⍞

在线尝试!

注意:将输入作为大写字符串。

具有漂亮的打印输出

说明

a←⎕D,⎕Aa是'0123...89ABCD...XYZ'
'Y.|W|X'⎕R{'0'/⍨+/30 36|a⍳2↑⍵.Match}用相应的'0's 数替换XW和Yx 的字符串(在下文中有更多解释) 35(≠⊆⊢)a⍳将字符串转换成indecies的向量a并分割35(例如)'Z'创建嵌套向量,
将嵌套的向量转换成矩阵填充,以0s 结尾,
(5/2)⊤每个转换数字转换为二进制向量,生成3维矩阵,沿主轴的二进制向量沿主轴
反向,
从而降低了矩阵的秩,因此将其二维变换
,⍉为适当的输出结果

'Y.|W|X'R{'0'/⍨30 36|a2↑⍵.Match}
'Y.|W|X'R                          Regular expression replace. mathing the string.
                        2↑⍵.Match   Takes matching string (either 'X' 'W' or 'Y.') and pads with spaces to length 2
                      a            Returns the indecies of each charactor in a. on the spaces this is 36 (length of a)
                30 36|              Takes the remainders of the indecies when divided by 30 and 36 respectively. Overall 'W' -> 'W ' -> 32 36 -> 2 0, 'Y2' -> 'Y2' -> 34 2 -> 4 2.
           '0'/⍨                    Make vector of repeating '0's with length equal to the sum of the result. '0'/⍨4 2  '000000'

这是7字节的节省:a←⎕D,⎕A⋄,↓↑{⊖(5/2)⊤a⍳⍵}¨'Z'(≠⊆⊢)('Y.|W|X'⎕R{'0'/⍨{0::2+'WX'⍳⍵⋄4+a⍳1⊃⍵}⍵.Match})⍞。错误捕获也不是很容易
理解-H.PWiz

谢谢@ H.PWiz。是的,我也不喜欢错误捕获,但是否则我正在使用两个正则表达式替换。
jslip

围绕@jslip括号⎕R和它的操作数是不必要的
NGN

2+'WX'⍳⍵->2+'X'=⍵
ngn

{0::2+'X'=⍵⋄4+a⍳1⊃⍵}⍵.Match->30 36|a⍳2↑⍵.Match
ngn

3

Perl 6156 142字节

感谢Jo King,节省了14个字节。(还通过解析修复了一个小错误,y并添加了前缀。)

修复的错误解析y[wxy]

{s:g/y(.)/000{0 x:36(~$0)}/;s:g/x/w0/;s:g/w/00/;s/$/z/;map {
.flatmap:{:32($_).fmt("%05b").flip.comb}},[Z] .split("z").map: (*~0 x.chars).comb}

在线尝试!

换行符只是为了使文本适合屏幕。它不是程序的一部分。

它是如何工作的

这是一个采用可变字符串的匿名函数。(这使得使用该功能有些特殊,因为您只能给它变量,而不是文字。)经过一些工作,它返回一个包含0和1的列表的列表,其含义与原始文章相同。

输入字符串进入变量中$_。我们首先在其上使用一系列替换语句,以消除各种数量的零的所有速记。首先,我们需要对进行梳理y,因为在yx或的情况下yww(或x)本身并不构成简写。我们搜索y(.)y和一个字符,它记住了)并替换为000{"0"x:36(~$0)}:三个零被逐字复制,然后将下一个字符从36转换为10(:36(~$0)),并添加更多零。然后,我们替换w的using s:g/w/00/x的using s:g/x/000/。最后,使用s/$/z/添加一个z最后,在底部添加了很多空行。(我们会在后面看到原因。)

剩下的只是一个大地图声明。我们在上映射了.split("z").map: (*~0 x.chars).comb}),这是输入字符串(无零速记),在处分成几行z,每行首先填充0 x.chars右边的(零吨,等于输入字符串的总长度)然后细分为单个字符列表(.comb)。最后,我们用[Z](减少zip)转置它。最短列表耗尽后,压缩结束,从而导致所有行的长度相同。(右边无用的尾随零的数目等于最短行的长度。而且,对于只有一行的“矩阵”,此换位技巧失败。这就是为什么我们在之前强制在末尾添加另一行。)

现在,我们只需映射行(原始矩阵的列),然后将遇到的每个字符替换为相应的5位。使用:32($_)(从32到10的基数).fmt("%05b")(格式为宽度5 .flip的位字符串,用零填充)完成此操作(将字符串反转,因为LSB在最上面一行,而不是最下面).comb(将字符串分成列表字符)。我们使用了.flatmap,它使结果列表变平(否则,我们将在每一列中获得一个列表列表)。然后隐式返回结果的转置。

(由于很难如此简单地尾随零,我感到有点不舒服。但是它大大减少了字节数:-)。



@JoKing —哦,是的,非常感谢!
拉米利斯

1yx11yw1
Jonathan Allan

@乔纳森·艾伦,你是对的,谢谢。我待会儿解决。(我首先出于某种原因想到可能只有y[0-9a-v]这种情况,当我发现情况并非如此时,我只是添加了一个快速(错误的)修复程序。)
Ramillies

您可以将000y替换为x
Jo King

2

果冻,66 个字节

哇!

ØBiⱮ+
Œuœṣ⁾YYj38Żṣ”YµḢç3;)Fṣ”Wj2ṣ”Xj3”0ẋ$¹OƑ?€Fṣ”Zµȯ”0ç31BḊ€UZ)Ẏz0

单声道链接,产生换位版本作为列表列表(添加Z到末尾以换位回去)。

在线尝试!或查看测试套件(打印输出漂亮)。


2

视网膜,203字节

y(.)
#$1
{`#
0#
#0
000
)T`dl`_dl`#.
w
000
x
00
z
¶
%(`.+
$&¶$&¶$&¶$&¶$&
T`g-v`#`.+$
T`dl` `.+$
T`g-v`dl
T`89l`#`.+¶.+$
T`d` `.+¶.+$
T`89l`d
T`d`    #`.+¶.+¶.+$
T`4-7`d
T`d`  #`.+¶.+¶.+¶.+$
)T`d` # #
P`.+

在线尝试!链接包括测试用例。替代解决方案,也是203个字节:

y(.)
#$1
{`#
0#
#0
000
)T`dl`_dl`#.
w
000
x
00
z
¶
%(`.+
$&¶$&
T`g-v`#`¶.+
T`dl` `¶.+
T`g-v`dl
^.+
$&¶$&
T`89l`#`¶.+
T`d` `¶.+
T`89l`d
^.+
$&¶$&
T`d`    #`¶.+
T`4-7`d
^.+
$&¶$&
T`d`  #`¶.+
)T`d` # #
P`.+

在线尝试!链接包括测试用例。说明:

y(.)
#$1

首先处理y命令的尴尬情况。遗憾的是,此后的字母允许为a y甚至a z,因此我们在这里必须小心。所有的魔力y首先都变成#s。

{`#
0#
#0
000
)T`dl`_dl`#.

循环然后处理#。首先,将0前置在之前#。如果是a,#0则将其更改为000,以完成操作,否则将#减少#s 之后的字符,并重复循环,直到处理完所有s 为止。

w
000
x
00

修正ws和xs。

z
¶

在新行上拆分。(S`z也适用于相同的字节数。)

%(`.+
$&¶$&¶$&¶$&¶$&
T`g-v`#`.+$
T`dl` `.+$
T`g-v`dl
T`89l`#`.+¶.+$
T`d` `.+¶.+$
T`89l`d
T`d`    #`.+¶.+¶.+$
T`4-7`d
T`d`  #`.+¶.+¶.+¶.+$
)T`d` # #

每行制作5个副本,然后通过将具有适当位的字母映射到该位#并将其清除来执行二进制转换,而其他字母变为空格。这些位以16、8、4、2的顺序处理,然后最后的转换处理清除该2位并同时转换该1位。(替代版本使每个副本分别花费更多的字节,但由于简化了位处理,因此节省了字节。)

P`.+

将所有线条填充到相同的长度。


1

Python 2中249个 244字节

def f(s,Z='0'):
 while'y'in s:i=s.find('y');s=s[:i]+4*Z+Z*int(s[i+1],36)+s[i+2:]
 t=s.replace('w',2*Z).replace('x',3*Z).split('z');return map(''.join,zip(*[[(Z*5+bin(int(c,32))[2:])[:-6:-1]for c in r]+[Z*5]*(max(map(len,t))-len(r))for r in t]))

在线尝试!

Jonathan Frech保存了5个字节。


里面有多余的空间while 'y'in。我认为下标[-5:][::-1]可以使用[:-6:-1]。return语句可以放在前一行。
乔纳森·弗雷奇

1

JavaScript(ES8),192个字节

s=>[...s,"z"].map(c=>{h=parseInt(c,36);k="wxy".search(c)+1;y?k=h-y--:h-35?y=h>33:m=m.map(P,z+=5,i=k--);for(h=k?0:h;~k--;m[i]=h.toString(2)+P(m[i++]||""));},P=d=>d.padStart(z,0),m=[i=z=y=0])&&m

返回转置...,然后在垂直轴上反射;让我知道这是否会使此项无效。输出是包含0s和1s 的字符串数组 。

在线尝试!

说明

对于每个字符ck+1计算出要修改的行数。 k = "wxy".search(c) + 1;,其中search方法返回索引或-1k然后递减直到-1通过检查~k--真实值达到。

如果当前字符为“ y”,则设置一个标志,以使下一个字符-1的base-36值成为的值k

遇到“ z”后,将字符串填充到左侧,将填充量增加5,并将数组索引重置为0

s =>
    [...s, "z"].map(c => {                  // append a "z" to ensure final output is properly padded
        h = parseInt(c, 36);
        k = "wxy".search(c) + 1;            // note that "y" -> 4 zeroes
        y                                   // if previous char is "y"...
            ? k = h - y--                   //      decrement y after subtracting y=1 since k is decremented to -1 and the previous y already pushed 4 zeroes
        : h - 35                            // else if current char is not "z"...
            ? y = h > 33                    //      set y if current char = "y"
        : m = m.map(P, z += 5, i = k--);    // else if current char is "z", pad
        for (
            h = k ? 0 : h;                  // if k is truthy, push zeroes
            ~k--;
            m[i] = h.toString(2)            // convert to boolean representation
                + P(m[i++] || "")           // prepend to row or to a newly padded row
        );
    },
        P = d => d.padStart(z, 0),
        m = [i = z = y = 0]                 // the logical OR 4 lines above replaces this value with ""
    ) &&
    m

我认为不返回输入的转置会更有意义。
mbomb007 '18

1

Haskell,399个字节

安装split包:cabal install split

import Data.Char
import Data.List.Split
import Data.List
p=map
r=replicate
a c|47<c&&c<58=c-48|96<c&&c<123=c-87
o=a.ord
m l n|l==0=[]|True=(mod n 2):m(l-1)(div n 2)
t a=p(\l->l++r((maximum$p length a)-length l)'0')a
y s|length s==0=""|h=='y'=(r(4+(o$s!!1))'0')++y(drop 2 s)|h=='w'="00"++y t|h=='x'="000"++y t|True=h:y t where h=head s;t=tail s
w=(p concat).transpose.(p$p$(m 5).o).t.(splitOn "z").y
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.