レーベンシュタインの隣人


20

ほとんどの平方数には、そのレーベンシュタイン距離が正確に1 である少なくとも1つの異なる平方数があります。与えられた平方x、この条件を満たす各平方はxのレーベンシュタイン近傍と呼ばれます。たとえば、はレーベンシュタインネイバーです。1つの編集()のみが必要です。ただし、は最低2回の編集が必要なため、レーベンシュタインネイバーではありません。先頭に0が付いている数値()はレーベンシュタインの隣人ではありませんx36161364162025025

あなたの仕事は、入力として平方数を取り、その合理的なフォーマットで、レーベンシュタインの隣人の完全なリストを出力することです。必要に応じて、リストにリピートネイバーを含めることができますが、元の入力は、それ自体のレーベンシュタインネイバーではないため、含めることはできません。

合理的な形式では、出力,や改行などの出力の間に何らかの区切り文字を含める必要があり、数字自体ではなく、対応するUnicode値(つまりBrainfuck)を持つ文字を出力できます。出力の順序は関係ありません。

この入力は、常により大きい平方数になり。プログラムには理論的な制限はありませんが、実際的な理由(たとえば32ビット数を超える)で大きな数で失敗する場合は、まったく問題ありません。0

入力にレーベンシュタインの隣人がいない場合、出力は何も出力しない、空の配列/文字列、負の整数、など、これを明確に反映する必要があります。0

これはであるため、バイト単位の最短コードが優先されます。

テストケース

これらはの正方形の結果です1にスルー20

  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正方形のレーベンシュタインの隣人はいません。
xnor

2
@xnorはい、私はあなたが正しいと信じて、1024任意のレーベンシュタイン隣人を持っていない、私はその中で例を編集します
coinheringaahing caird

6
「For all ...」という形式のすべてのステートメントについて、反例を見つけることができる場合、これはステートメントの厳密な反証です。(しかし、私が間違っていれば、反証を厳格な反証として受け入れます。)
ニール

2
出力に元の番号を含めることはできますか?> 4、9、49 -例えば49
ロビンライダー

回答:


7

05AB1E 11 10  6 バイト

-4グリミーに感謝!! (正方形を探すのではなく、最初に正方形を保存すると3が節約され、10 ^ nを使用すると1が節約されます)

°Lnʒ.L

整数を取り、空のリストを出力します

オンラインでお試しください!-これはの°ために非常に遅いので、でも試してみても意味がありません9
または、わずかに速いバージョンを試してください -これは8を追加する代わり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
グリムミー

1
@Grimy Thanks-なぜ私は最初に二乗することを考えなかったのか:/ 「すべて表示」の質問には、その無限のものは受け入れられますか?(ジェネレーターを関数サブミットとしてサブミットできますが、コード化されたストップポイントがない場合は、いつ最終値が与えられたかわかりません)。
ジョナサンアラン

提出は終了しなければならないので、私は∞nʒ.L答えとして受け入れられるとは思いません。無関係:7バイトバージョンのTIOリンクはを使用します。これは、大きな数値の場合よりも最大で100倍遅くなります。私のコメントは安全のために(100を追加)使用しましたが、判明しましたT+т+8+、すべての場合で十分である。
グリムミー

@Grimyおっと、ありがとう。1は最初の9個の正方形をチェックするだけでよいため、100個は過剰であると考えました。
ジョナサンアラン

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

残りの数値を10進数に変換します。


5

R42 41バイト

-1バイト、バウンド9n2

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

オンラインでお試しください!

n91n19110091009n2=81n2n>181n2>91nn=119191 正方形ではありません、大丈夫です。

19n2


4

パイソン2173 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!ジョナサンアランへのバイトthx 。


保存48[p for p in...]冗長です。セット(または複製)を返すことができます。'0'<v[:1]することができます'1'<=v。それははるかに遅いですが、range(len(a)+1)することができますrange(n)。合計を避けるためにiand i+1スライスの変数を使用します。ラムダを使用します。編集すると、前のファイルから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._);

オンラインでお試しください!

このスクリプトは、入力のレーベンシュタインネイバーを _は、末尾の区切り文字でし、ネイバーが見つからない場合は何も出力しません。

幸いにも、PHPにはレーベンシュタイン距離用のビルトインがあります!このスクリプトinput * 91は、すべての有効なレーベンシュタインネイバー(距離1)がその範囲内にあるため、1〜のすべての平方数をループします。次に、その範囲内のすべての数値を入力します。この数値は、入力で1のレーベンシュタイン距離を持ちます。


2

JavaScript(V8) 129125123 バイト

入力を文字列として受け取ります。レーベンシュタインの隣人を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()...しかし、私は、ノードが同様にそれを持っていた気づいていなかった
ニール・

@Neil実際には、Nodeには存在しません。このバージョンは、V8のシェルビルドにすぎないと思います。これは、ブラウザーバージョンに非常に近いものです。
アーナウド

2

ゼリー53 38バイト

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

オンラインでお試しください!

レーベンシュタイン距離には組み込み機能がないため、可能なすべての1距離編集を生成し、先頭にゼロのあるものを除外し、完全な正方形のみを保持します。(許可されているように)重複をフィルタリングしません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.