Tetangga Levenshtein

20

Kebanyakan nomor persegi memiliki setidaknya 1 jumlah persegi yang berbeda dengan yang mereka jarak Levenshtein persis 1. Untuk diberikan persegi x , setiap persegi yang memenuhi kondisi ini disebut tetangga Levenshtein dari x . Misalnya, 36 adalah tetangga Levenshtein dari 16 , karena hanya 1 sunting ( 13 ) diperlukan. Namun, 64 bukan tetangga Levenshtein dari 16 , karena membutuhkan minimal 2 suntingan. Angka-angka yang memiliki 0s terkemuka ( 2025025 ) bukan tetangga Levenshtein.

Tugas Anda adalah mengambil nomor kuadrat sebagai input dan output, dalam format apa pun yang masuk akal, daftar lengkap tetangga Levenshtein itu. Anda dapat memasukkan tetangga berulang dalam daftar, jika Anda mau, tetapi Anda tidak dapat memasukkan input asli, karena itu bukan tetangga Levenshtein itu sendiri.

Setiap format yang masuk akal harus mencakup semacam pemisah antara output, seperti ,atau baris baru, dan dapat menampilkan karakter dengan nilai Unicode yang sesuai (yaitu brainfuck) daripada angka itu sendiri. Urutan output tidak masalah.

Input ini akan selalu berupa angka kuadrat, lebih besar dari 0 . Program Anda seharusnya tidak memiliki batas teoretis , tetapi jika gagal untuk jumlah besar karena alasan praktis (misalnya di luar angka 32-bit), itu sama sekali baik-baik saja.

Jika input tidak memiliki tetangga Levenshtein, output harus dengan jelas mencerminkan ini, seperti tidak menghasilkan apa-apa, array / string kosong, bilangan bulat negatif, 0 , dll.

Ini adalah , jadi kode terpendek dalam byte menang.

Uji kasus

Ini adalah hasil untuk kuadrat 1 hingga 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

Selain itu, 1024tidak memiliki tetangga, jadi ini adalah ujian yang baik.

caird coinheringaahing
sumber
3
Yang lebih menarik adalah tetangganya 2025.
Neil
6
Kecuali saya kehilangan sesuatu, 32 * 32 = 1024tidak memiliki tetangga Levenshtein persegi.
xnor
2
@ xnor Ya, saya percaya Anda benar, 1024tidak memiliki tetangga Levenshtein, saya akan mengedit contoh itu di
caird coinheringaahing
6
Untuk semua pernyataan dalam bentuk "Untuk semua ...", jika contoh tandingan dapat ditemukan, maka ini adalah penolakan keras terhadap pernyataan tersebut. (Tetapi jika saya salah, saya akan menerima contoh tandingan sebagai penolakan keras.)
Neil
2
Bisakah kita memasukkan nomor asli dalam output? Misalnya 49 -> 4, 9, 49.
Robin Ryder

Jawaban:

7

05AB1E ,  11 10  6 byte

-4 terima kasih kepada Grimy !! (kotak pertama daripada mencari kotak menyimpan 3; gunakan 10 ^ n menyimpan 1)

°Lnʒ.L

Mengambil bilangan bulat, mengeluarkan daftar, mungkin kosong, daftar

Cobalah online! - Ini gila-lambat karena°, jadi tidak ada gunanya mencobanya bahkan untuk9.
Atau Coba versi yang sedikit lebih cepat - Yang ini malah menambahkan delapan dengan8+kemudian menggunakan pendekatan yang sama.

Bagaimana?

°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
Jonathan Allan
sumber
1
Dalam 9s«11-byter Anda bisa saja . Jawaban to-the-point yang bagus! +1 dari saya.
Kevin Cruijssen
Lambat 7: т+Lnʒ.L. Ridiculously lambat 6: °Lnʒ.L. Jauh memperlambat 5: ∞nʒ.L.
Grimmy
1
@Grimy Terima kasih - kenapa saya tidak berpikir untuk menyadur dulu: /. Apakah yang tak terbatas dapat diterima untuk pertanyaan "tunjukkan semua"? (Saya melihat kita dapat mengirimkan generator sebagai pengiriman fungsi, tetapi jika tidak ada titik berhenti berkode maka kita tidak bisa tahu kapan itu memberi kita nilai akhir).
Jonathan Allan
Saya pikir ∞nʒ.Litu tidak dapat diterima sebagai jawaban karena kiriman harus diakhiri . Tidak terkait: TIO link Anda menggunakan versi 7-byte , yang ~ 100x lebih lambat daripada T+untuk jumlah besar. Komentar saya dulu т+(tambah 100) aman, tapi ternyata 8+sudah cukup dalam semua kasus.
Grimmy
@ Ups kotor, terima kasih. Saya pikir 100 terlalu banyak karena saya hanya perlu memeriksa 9 kotak pertama.
Jonathan Allan
5

Retina 0.8.2 , 142 138 byte

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

Cobalah online! Penjelasan:

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

Untuk setiap digit, cobalah a) menghapusnya b) mendahuluinya dengan digit berbeda c) mengubahnya menjadi digit berbeda. Untuk saat ini, digit yang berbeda ditandai dengan a #.

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

Untuk setiap digit potensial yang berbeda, gantikan setiap digit yang mungkin.

A`^0

Hapus angka yang sekarang dimulai dengan nol.

Dr`

Hapus semua nomor yang digandakan. (Ini hanya meninggalkan garis kosong.)

\d+
$*

Konversikan ke unary.

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

Simpan semua angka kuadrat kecuali yang terakhir (yang selalu merupakan nomor input).

%`1

Konversi angka yang tersisa kembali ke desimal.

Neil
sumber
5

R , 42 41 byte

(9n)2

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

Cobalah online!

n91n1911009100(9n)2=81n2n>181n2>91nn=119191 bukan persegi, kami baik-baik saja.

1(9n)2

Robin Ryder
sumber
4

Python 2 , 173 167 149 148 147 144 139 138 byte

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}

Cobalah online!

19 + 3 + 5 + 1 = 28! byte thx ke Jonathan Allan .

Chas Brown
sumber
Hemat 48 . [p for p in...]berlebihan. Kami dapat mengembalikan satu set (atau duplikat). '0'<v[:1]bisa '1'<=v. Ini jauh lebih lambat tetapi range(len(a)+1)bisa range(n). Gunakan variabel untuk idan i+1irisan untuk menghindari jumlah. Gunakan lambda. EDIT, simpan 48 dari yang sebelumnya.
Jonathan Allan
@ Jonathan Allan: Saya sudah melakukan beberapa perubahan yang sama; tapi pasti menghargai 18 byte!
Chas Brown
Satu lagi
Jonathan Allan
@ Jonathan Allan: Bagus! Sekarang hampir tidak bisa dibaca :).
Chas Brown
1
@ Jonathan Allan: Lol, saya hanya akan berhenti memperbarui - Saya tidak bisa mengikuti! :)
Chas Brown
3

Oracle SQL, 93 byte

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

Uji dalam 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.
Dr Y Wit
sumber
2

PHP , 62 byte

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

Cobalah online!

Skrip ini mencetak Levenshtein tetangga input yang dipisahkan oleh _pemisah trailing, dan jika tidak ada tetangga yang ditemukan, tidak mencetak apa pun.

Untungnya PHP memiliki built-in untuk jarak Levenshtein ! Skrip ini memotong semua angka kuadrat dari 1 hingga input * 91, karena semua tetangga Levenshtein yang valid (jarak 1) berada dalam kisaran itu. Kemudian cetak setiap angka dalam rentang yang memiliki jarak Levenshtein 1 dengan input.

Night2
sumber
2

JavaScript (V8) ,  129 125  123 byte

Mengambil input sebagai string. Mencetak tetangga Levenshtein ke 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)}

Cobalah online!

Berkomentar

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
}                             //
Arnauld
sumber
Saya tahu SpiderMonkey memilikinya print()tetapi saya tidak menyadari bahwa Node juga memilikinya ...
Neil
@ Neil Sebenarnya, itu tidak ada di Node. Saya pikir versi ini hanyalah cangkang dari V8 - yang jauh lebih dekat dengan versi browser.
Arnauld
2

Jelly , 53 38 byte

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

Cobalah online!

Tidak ada built-in untuk jarak Levenshtein sehingga menghasilkan semua kemungkinan edit 1-jarak dan kemudian mengecualikan mereka dengan nol di depan dan hanya menyimpan kotak yang sempurna. Tidak memfilter duplikat (sebagaimana diizinkan).

Nick Kennedy
sumber