莱文施泰因邻居


20

最平方数具有至少1个不同的平方数与它们的Levenshtein距离正好1.对于一个给定的正方形,每个满足该条件被称为正方形的Levenshtein邻居的。例如,是Levenshtein的邻居,因为只需要1次编辑()。但是,不是Levenshtein的邻居,因为它至少需要进行2次编辑。具有前导0的数字()不是 Levenshtein邻居。xx 36 16 1 3 64 16 2025 025x36161364162025025

您的任务是将平方数用作输入,并以任何合理的格式输出Levenshtein邻居的完整列表。如果愿意,您可以在列表中包括重复的邻居,但是您可以不包括原始输入,因为它本身不是Levenshtein邻居。

任何合理的格式都应在输出之间包含某种分隔符(例如,或换行符),并且可以输出具有相应Unicode值(即Brainfuck)而不是数字本身的字符。输出的顺序无关紧要。

此输入将始终是大于的平方数。您的程序应该没有理论上的限制,但是如果由于实际原因(例如超过32位数字)而导致大量失败,那就完全可以了。0

如果输入没有任何Levenshtein邻居,则输出必须清楚地反映这一点,例如不输出任何内容,空数组/字符串,负整数,等。0

这是,因此以字节为单位的最短代码获胜。

测试用例

这些是到的平方的结果:120

  1: 4, 9, 16, 81
  4: 1, 9, 49, 64
  9: 1, 4, 49
 16: 1, 36, 169, 196
 25: 225, 256, 625
 36: 16, 361
 49: 4, 9
 64: 4
 81: 1, 841
100: 400, 900, 1600, 8100
121: 1521
144: 1444
169: 16, 1369
196: 16, 1296, 1936
225: 25, 625, 1225, 2025, 4225, 7225
256: 25
289: 2809
324: 3249
361: 36, 961
400: 100, 900, 4900, 6400

另外,1024没有任何邻居,因此是一个很好的测试用例。


3
更有趣的是邻居2025
尼尔

6
除非我缺少任何东西,否则32 * 32 = 1024就不会有Levenshtein广场的邻居。
xnor

2
@xnor是的,我相信你是对的,1024没有任何的Levenshtein邻居,我将修改在该示例
凯尔德coinheringaahing

6
对于形式为“对于所有人...”的所有语句,如果可以找到反例,则这是对该语句的严格抵制。(但是,如果我错了,我会接受一个严格的反例作为反例。)
Neil

2
我们可以在输出中包含原始数字吗?实施例49 - >图4,图9,49
罗宾莱德

Answers:


7

05AB1E 11 10  6 字节

-4感谢Grimy!(先是正方形,而不是寻找正方形可节省3;使用10 ^ n可节省1)

°Lnʒ.L

取一个整数,输出一个可能为空的列表

在线尝试!-由于太慢了°,所以即使尝试也没有意义9
尝试使用速度稍快的版本 -该版本会增加八个,8+然后使用相同的方法。

怎么样?

°Lnʒ.L - f(integer)    stack = n
°      - push 10^n             10^n
 L     - range                 [1,2,3,...,10^n]
  n    - square                [1,4,9,...,10^2n]
   ʒ   - filter keep if == 1:
    .L -   Levenshtein distance

1
9s«在您的11 byter本来。不过,这是一个很好的答案!向我+1。
凯文·克鲁伊森

较慢的7 :т+Lnʒ.L。荒谬地慢6 :°Lnʒ.L。无限慢5 :∞nʒ.L
Grimmy

1
@肮脏的谢谢-为什么我没有想到首先平方:/。“显示全部”问题是否可以接受无限个?(我看到我们可以将生成器作为函数提交提交,但是如果没有编码的停止点,那么我们将无法知道何时将其赋给最终值)。
乔纳森·艾伦

我不认为这∞nʒ.L是可以接受的答案,因为提交必须终止。无关:您的7字节版本的TIO链接使用,这比T+大数字要慢100倍。我的评论使用了т+(增加100)是安全的,但事实证明8+,在所有情况下都足够。
Grimmy

@Grimy哎呀,谢谢。我认为100是过度杀伤力的,因为1只需要检查前9个正方形。
乔纳森·艾伦

5

视网膜0.8.2142个 138字节

.?
$'¶$`#$&$'¶$`#$'¶$`$&
#
0$%'¶$%`1$%'¶$%`2$%'¶$%`3$%'¶$%`4$%'¶$%`5$%'¶$%`6$%'¶$%`7$%'¶$%`8$%'¶$%`9
A`^0
Dr`
\d+
$*
-2G`(\b1|11\1)+\b
%`1

在线尝试!说明:

.?
$'¶$`#$&$'¶$`#$'¶$`$&

对于每个数字,请尝试a)将其删除b)在其前面加上另一个数字c)将其更改为另一个数字。目前,其他数字标有#

#
0$%'¶$%`1$%'¶$%`2$%'¶$%`3$%'¶$%`4$%'¶$%`5$%'¶$%`6$%'¶$%`7$%'¶$%`8$%'¶$%`9

对于每个可能的不同数字,请替换每个可能的数字。

A`^0

删除现在以零开头的数字。

Dr`

删除所有重复的数字。(这只是将行留空。)

\d+
$*

转换为一元。

-2G`(\b1|11\1)+\b

保留除最后一个(始终是输入数字)以外的所有平方数。

%`1

将剩余的数字转换回十进制。


5

R42 41字节

(9n)2

function(n,y=(1:(9*n))^2)y[adist(n,y)==1]

在线尝试!

n91n1911009100(9n)2=81n2n>181n2>91nn=119191 不是正方形,我们很好。

1(9n)2


4

Python 2中173 167 149 148 147 144个 139 138字节

lambda n,I=int:{(I(I(v)**.5)**2==I(v))*I(v)for v in[`n`[:i]+`j-1`[:j]+`n`[i+k:]or 0for j in range(11)for i in range(n)for k in 0,1]}-{0,n}

在线尝试!

19 + 3 + 5 + 1 = 28!乔纳森·艾伦Jonathan Allan)的字节数。


保存48[p for p in...]是多余的。我们可以返回一组(或重复的)。'0'<v[:1]可以'1'<=v。它要慢得多,但是range(len(a)+1)可以range(n)。对ii+1切片使用变量,以避免求和。使用lambda。编辑保存以前的48。
乔纳森·艾伦

@乔纳森·艾伦:我已经做了一些相同的改变。但一定要感谢18个字节!
查斯·布朗


@乔纳森·艾伦:太好了!现在几乎不可读:)。
查斯布朗

1
@乔纳森·艾伦:大声笑,我只是要停止更新-我跟不上!:)
Chas Brown

3

Oracle SQL,93个字节

select level*level from t where utl_match.edit_distance(x,level*level)=1connect by level<10*x

在SQL * PLus中测试。

SQL> set heading off
SQL> with t(x) as (select 225 from dual)
  2  select level*level from t where utl_match.edit_distance(x,level*level)=1connect by level<10*x
  3  /

         25
        625
       1225
       2025
       4225
       7225

6 rows selected.

2

PHP,62字节

for(;$argn*92>$n=++$i**2;levenshtein($argn,$n)==1&&print$n._);

在线尝试!

该脚本输出_用尾随分隔符分隔的输入的Levenshtein邻居,如果找不到邻居,则不打印任何内容。

令人高兴的是,PHP内置了Levenshtein距离!该脚本循环从1到的所有平方数input * 91,因为所有有效的Levenshtein邻居(距离1)都在该范围内。然后在输入范围内打印该区域中Levenshtein距离为1的每个数字。


2

JavaScript(V8) 129125123 字节

将输入作为字符串。将Levenshtein邻居打印到STDOUT。

s=>{for(t=9+s;t;t--)(t+='')**.5%1||(g=m=>m*n?1+g(m,--n)*(g(--m)-(s[m]==t[n++]))*g(m):m+n)(s.length,n=t.length)-1||print(t)}

在线尝试!

已评论

s => {                        // s = input
  for(                        // loop:
    t = 9 + s;                //   start with t = '9' + s
    t;                        //   repeat while t > 0
    t--                       //   decrement t after each iteration
  )                           //
    (t += '')                 //   coerce t to a string
    ** .5 % 1 ||              //   abort if t is not a square
    ( g =                     //   g is a recursive function to test whether the
                              //   Levenshtein distance between s and t is exactly 1
      m =>                    //   m = pointer into s (explicit parameter)
                              //   n = pointer into t (defined in the global scope)
        m * n ?               //     if both m and n are greater than 0:
          1 +                 //       add 1 to the final result and add the product of:
          g(m, --n) * (       //         - a recursive call with m and n - 1
            g(--m) -          //         - a recursive call with m - 1 and n - 1
            (s[m] == t[n++])  //           minus 1 if s[m - 1] = t[n - 1]
          ) *                 //
          g(m)                //         - a recursive call with m - 1 and n
        :                     //       else:
          m + n               //         stop recursion and return m + n
    )(s.length, n = t.length) //   initial call to g with m = s.length, n = t.length
    - 1 ||                    //   abort if the final result is not 1
    print(t)                  //   otherwise, print t
}                             //

我知道SpiderMonkey拥有,print()但我不知道Node也有它……
尼尔

@Neil实际上,它在Node中不存在。我认为此版本只是V8的Shell构建-与浏览器版本更接近。
Arnauld

2

果冻53 38字节

D;Ɱ⁵ṭJœP,œṖjþ⁵Ẏṭ@ḢF${ʋʋ€$ƲẎ%⁵1ị$ƇḌƲƇḟ

在线尝试!

Levenshtein距离没有内置功能,因此会生成所有可能的1距离编辑,然后排除前导零的编辑,仅保留完美的正方形。不过滤重复项(允许)。


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.