视网膜,530 220 210 202 201 193 191 187 185(184)个字节
归功于randomra以节省3个字节!(并为更多人铺平道路。)
+`\.(\d)(.+)( .+)
$1.$2_$3_
\b
#
+`(\d*)#((((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|\w)
$1$1$1$1$1$1$1$1$1$1$3$4$5$6$7$8$9$10$11#
\d
11
(?=(1*)\1)[^.]
$1
^(1+)\.\1{90000}1+
Retina!
1.+
Trash!
为了进行字节计数,每行都在一个单独的文件中,但是您可以通过使用-s
标志调用Retina,从单个文件中直接运行上述代码。
这首先需要密度(即使是尾随的,也要包含小数点),然后是宽度和高度,即d w h
。
这有点慢。我不会尝试大多数给定的测试用例,因为它将运行很长时间。但是,您可以检查它是否与测试用例一起正常工作
19. 4096 2160 -> Trash!
1. 180 240 -> Trash!
1. 181 240 -> Retina!
1. 180 241 -> Retina!
0.04 10 10 -> Retina!
基本上,在将所有数字相乘以使密度成为整数之后,您不希望宽度和高度的位数超过4位。
虽然这很慢,但完全正确……没有浮点问题或类似问题。所有算术都使用(一元)整数。
原则上,我可以再减少一个字节:^
可以将其省略,但是Trash!
由于回溯量过多,这会使测试用例非常慢。
说明
首先,让我们重新排列不等式以避免浮点运算:
√(w2 + h2) / d > 300
√(w2 + h2) > 300 d
w2 + h2 > 90000 d2
我们也可以看到,这是在乘不变w
,h
并且d
由相同数量的x
:
w2 + h2 > 90000 d2
(x w)2 + (x h)2 > 90000 (x d)2
x2 (w2 + h2) > 90000 x2 d2
w2 + h2 > 90000 d2
有几种方法可以对一元数求平方,但是我们将使用身份
n2 = Σi=1..2n ⌊i/2⌋
这为我们提供了一种仅使用整数算术(以一元表示整数)解决问题的方法。
让我们看一下代码。每对线都是一个正则表达式替换。
+`\.(\d)(.+)( .+)
$1.$2_$3_
在宽度和高度乘以10(x
以上)的同时,这会反复将密度的小数点向右移动。这是为了确保所有数字都是整数。我没有附加零,而是附加了_
,以后将其视为零。(这是一个打高尔夫球的技巧,因为否则我需要写出来...${3}0
以避免与产生歧义$30
。)+
regex前面的内容告诉Retina重复此替换,直到结果停止更改为止(这种情况是模式不再匹配的情况) 。
\b
#
我们正在准备将三个数字转换为一元。原则上,我们需要#
在每个数字的前面加上一个标记(),但是在每个数字的末尾也加一个标记会更短,这不会影响转换步骤。
+`(\d*)#((((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|\w)
$1$1$1$1$1$1$1$1$1$1$3$4$5$6$7$8$9$10$11#
这是使用dan1111开发的技巧转换为一元。本质上,我将每个数字转换为其自身的代表数字,同时将现有数字乘以10(#
在过程中将标记向右移动)。该二进制表示形式将是由不同数字组成的混杂物,但是总数将等于原始整数的值。请注意\w
最后-通常是just 0
,但我们也希望将其_
视为零(在正则表达式中被视为单词字符)。
\d
11
我们将每个数字转换为两个1
s,从而a)确保所有数字相同(稍后将需要)和b)将每个数字加倍。
(?=(1*)\1)[^.]
$1
这样做有两件事:对所有数字求平方(或通过对求和,求出每个数字的一半2n
),然后将宽度和高度的平方相加。请注意[^.]
匹配1
s,#
标记和空格。如果是a #
或空格,则前瞻不会捕获任何内容,这意味着所有内容都将被删除,即,将宽度和高度的结果连接/相加。小数点.
仍保留以将结果与小数点分开d
。如果[^.]
匹配a 1
,则前瞻确保我们1
在group中捕获了它后的s(向下取整)的一半1
。这将计算出我上面提到的总和,然后将得出原始数字的平方。
^(1+)\.\1{90000}1+
Retina!
现在,字符串是(一元),然后是,然后是(一元)。我们想知道第一个一进制数是否小于第二个。我们可以使用捕获组和重复语法轻松地进行此乘法。之后,我们使用(而不是)来确保第二个数字实际上大于该数字,而不仅仅是相等。如果是这样,我们将全部替换为。d2
.
w2 + h2
90000
{n}
1+
1*
Retina!
1.+
Trash!
如果第二个数字不够大,则上一步将保持不变,字符串仍将以开头1
。如果是这种情况,我们只需将整个字符串替换为Trash!
并完成。