通过使用更好的“功能”定义节省了19个字节
我说这对于仅使用Regex的语言来说非常不错。
基本库的确允许在一元和十进制之间进行转换(因为挑战规范明确指出了十进制,所以需要此库),但是不支持二进制。因此,我必须将其编写为脚本的一部分,并向其中添加120个字节。
#import base
b(\d*):(_*)\2_b/b1$1:$2b/b(\d*):(_+)\2b/b0$1:$2b/b(\d+):b/$1/b:b/0/B(_*):1/B$1$1_:/B(_*):0/B$1$1:/B(_*):B/$1/j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/j(\d*),\1\d{0,7}:,?(.*)/,$2,/,((_+)_+),(\2),/,$1,/,(_+),(\1_*),/,$2,/^,(_*),$/d<$1>/j,b:u<(?#input)>b:
在线尝试!
通过个人正则表达式。
#import base
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
^,(_*),$/d<$1>/
j,b:u<(?#input)>b:
脚步
首先,我们导入“ base”库,该库提供了两个正则表达式。一转换u<numbers>
为一元。和一个转换d<unary_underlines>
回十进制。这是因为挑战需要在base10中使用IO。
然后,我们定义了少数将一元转换为二进制的正则表达式。
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
首先,b(\d*):(_*)\2_b/b1$1:$2b/
搜索b
,可选地后跟一些二进制数字,然后是a :
,然后是任意数量的下划线,然后是完全相同数量的下划线再加上一个,最后是另一个b
。
然后,我们将其替换为,b1
后跟之前的二进制数字,然后:
是下划线的前半部分,最后是下划线b
。
因此,这将检查一元数是否不能被2整除,如果是,则将1附加为二进制数,然后将其减一并除以二。
第二个b(\d*):(_+)\2b/b0$1:$2b/
几乎是无所事事的,但是不检查多余的内容_
,这意味着它仅在被二可整的情况下才匹配,在这种情况下,前面要加上a 0
。
第三个检查我们是否用一位数表示,如果是,则去掉填充以只留下二进制数。
最后一个检查是否从未提供过任何二进制数字,在这种情况下,就离开了0
。
我们定义的下一组正则表达式将二进制转换回一元,并且稍微简单一些。
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
该组的第一个B(_*):1/B$1$1_:/
,与它的对立相似,检测到a B
,然后是任意数量的一进制数字,然后是:1
。B
在这种情况下,它不会检查是否匹配,因为它一次只搜索一位数字。如果匹配,则将先前匹配的一进制数字加倍并加一,然后将其删除。
第二个()B(_*):0/B$1$1:/
与第一个几乎一样,只是匹配a 0
而不是a 1
,并且不添加额外的一进制数字。
其中的最后一个B(_*):B/$1/
,检查是否没有更多的二进制数字,如果是,则解开一进制。与其对立面不同,这不需要特殊的0情况。
接下来,我们定义正则j
表达式,它们充当拆分功能。
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
首先,j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
完成大部分繁重的工作。它搜索j
,可选地后面跟着二进制数字,它们是“增量器”,然后是逗号,接着是增量器,然后是正好8个二进制数字,再跟其余的二进制数字,然后是a :
。8位数字中的第一个数字附加到增量器上,从而对其进行递增,然后将二进制输入中除那8位数字之外的所有数字附加在:
后面的a 后面,
。因此(如果我们使用2位数而不是8位数)j,1001:
将变为j1:1001:,01
then j10:1001,01,11
。此外,将附加的数组元素包装在中B
,以将它们转换回一元。
另一个j(\d*),\1\d{0,7}:,?(.*)/,$2,/
检查增量器之后是否还剩下少于8个二进制数,如果是,则除去包裹在,
s中的数组以外的所有内容。例如。,_,___,
在创建数组期间和之后,我们定义比较正则表达式。
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
首先,,((_+)_+),(\2),/,$1,/
检查逗号,然后加上下划线,然后再检查逗号,再检查逗号,再加上下划线。然后用,
s 包围的第一个元素中的下划线总数替换它。
后者,(_+),(\1_*),/,$2,/
检查一个逗号,然后是下划线,然后是另一个逗号,然后是相同数量或更多的下划线,最后是逗号。相反,这将保留正确的元素。
最后,当剩下的元素如此匹配时^,(_*),$
,我们删除周围的逗号并通过将其转换回十进制d<>
。然后,不再有正则表达式可以触发并显示输出。
首先将输入放入模板中j,b:u<(?#input)>b:
,该模板首先将十进制输入转换为一进制,例如5
-> j,b:_____b:
,然后将结果一元转换为二进制,j,101:
然后拆分二进制(对于示例而言无效),获得最大的元素,然后进行转换返回十进制,然后完成。