เพื่อนบ้าน Levenshtein


20

ตารางตัวเลขส่วนใหญ่จะมีที่แตกต่างกันจำนวนตารางอย่างน้อย 1 กับที่พวกเขาLevenshtein ระยะทางเป็นสิ่งที่ 1. สำหรับตารางที่กำหนดxแต่ละตารางที่ตรงตามเงื่อนไขนี้จะเรียกว่าเป็นเพื่อนบ้าน Levenshteinของxxตัวอย่างเช่น36เป็นเพื่อนบ้านของ Levenshtein ที่16เนื่องจากต้องการเพียง 1 การแก้ไข ( 13 ) อย่างไรก็ตาม64ไม่ใช่เพื่อนบ้านของ Levenshtein ที่16เนื่องจากต้องมีการแก้ไขอย่างน้อย 2 ครั้ง ตัวเลขที่มีผู้นำ 0s ( 2025025 ) ไม่ใช่เพื่อนบ้านของ Levenshtein

งานของคุณคือการใช้หมายเลขสแควร์เป็นอินพุตและเอาต์พุตในรูปแบบที่สมเหตุสมผลรายการทั้งหมดของเพื่อนบ้าน Levenshtein คุณอาจรวมเพื่อนบ้านซ้ำในรายการหากคุณต้องการ แต่คุณไม่สามารถรวมอินพุตต้นฉบับเนื่องจากไม่ใช่เพื่อนบ้านของ Levenshtein

รูปแบบที่เหมาะสมควรมีตัวคั่นบางประเภทระหว่างผลลัพธ์เช่น,หรือขึ้นบรรทัดใหม่และสามารถส่งออกอักขระด้วยค่า Unicode ที่สอดคล้องกัน (เช่น brainfuck) แทนที่จะเป็นตัวเลขเอง ลำดับของเอาต์พุตไม่สำคัญ

การป้อนข้อมูลนี้จะเป็นจำนวนตารางมากกว่า00โปรแกรมของคุณไม่ควรมีข้อ จำกัดทางทฤษฎีแต่ถ้ามันล้มเหลวสำหรับคนจำนวนมากด้วยเหตุผลเชิงปฏิบัติ (เช่นเกิน 32- บิต) นั่นเป็นเรื่องที่สมบูรณ์

หากอินพุตไม่มีเพื่อนบ้านของ Levenshtein ผลลัพธ์จะต้องสะท้อนสิ่งนี้อย่างชัดเจนเช่นไม่มีอะไรออกมาอาเรย์ / สตริงว่างเปล่าจำนวนเต็มลบ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มี
Neil

6
เว้นแต่ฉันจะทำบางสิ่งบางอย่าง32 * 32 = 1024ไม่มีเพื่อนบ้าน Levenshtein ที่มีรูปสี่เหลี่ยม
xnor

2
@xnor ใช่ฉันเชื่อว่าคุณถูกต้อง1024ไม่มีเพื่อนบ้าน Levenshtein ฉันจะแก้ไขตัวอย่างใน
caird coinheringaahing

6
สำหรับคำแถลงทั้งหมดของแบบฟอร์ม "สำหรับทุกคน ... " หากพบตัวอย่างตัวอย่างนี่จะเป็นการป้องกันการปิดงบอย่างเข้มงวด (แต่ถ้าฉันผิดฉันจะตอบโต้ตัวอย่างที่ไม่สามารถป้องกันได้อย่างเข้มงวด)
นีล

2
เราอาจรวมหมายเลขเดิมในผลลัพธ์ได้หรือไม่ ตัวอย่างเช่น 49 -> 4, 9, 49
Robin Ryder

คำตอบ:


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 จากฉัน
Kevin Cruijssen

ช้าลง т+Lnʒ.L7: ช้าขัน °Lnʒ.L6: ช้าอนันต์ที่ ∞nʒ.L5:
Grimmy

1
@Grimy Thanks - ทำไมบนโลกฉันไม่คิดว่าจะสแควร์ก่อน: / คำถามนี้ไม่สิ้นสุดสำหรับคำถาม "แสดงทั้งหมด" หรือไม่? (ฉันเห็นว่าเราสามารถส่งเครื่องกำเนิดไฟฟ้าเป็นฟังก์ชั่นการส่ง แต่ถ้าไม่มีจุดหยุดการเข้ารหัสแล้วเราไม่สามารถรู้ได้ว่ามันให้คุณค่าสุดท้ายกับเราเมื่อใด)
Jonathan Allan

ฉันไม่คิดว่า∞nʒ.Lเป็นที่ยอมรับเป็นคำตอบเพราะการส่งต้องยุติ ไม่เกี่ยวข้อง: ลิงค์ TIO ของคุณสำหรับรุ่น 7 ไบต์ใช้ซึ่งช้ากว่า ~ 100x T+สำหรับจำนวนมาก ความคิดเห็นของฉันใช้т+(เพิ่ม 100) เพื่อความปลอดภัย แต่ปรากฎว่า8+เพียงพอในทุกกรณี
Grimmy

@Grimy อุ๊ปซ์ขอบคุณ ฉันคิดว่ามันเกิน 100 เพราะ 1 แค่ต้องการตรวจสอบ 9 ช่องแรกเท่านั้น
Jonathan Allan

5

เรติน่า 0.8.2 , 142 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

R , 42 41 ไบต์

(9n)2

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

ลองออนไลน์!

nมีขนาดเล็กกว่า91n ยกตัวอย่างเช่น 191 หรือ 1009100) ที่นี่ฉันใช้แทนขอบเขต(9n)2=81n2. สำหรับn>1, 81n2>91nดังนั้นเราสบายดี สำหรับn=1ข้อ จำกัด นี้พลาดไม่ได้กับเพื่อนบ้านเลเวนเซเตนหนึ่งคน: 191; ตั้งแต่91 ไม่ใช่ตารางเราสบายดี

แสดงหมายเลขสแควร์ทั้งหมดระหว่าง 1 และ (9n)2และรักษาผู้ที่มีระยะทาง Levenshtein เท่ากับ 1


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 ! ไบต์ขอบคุณไปยังโจนาธานอัลลัน


บันทึก 48 [p for p in...]ซ้ำซ้อน เราสามารถส่งคืนชุด (หรือซ้ำ) สามารถ'0'<v[:1] '1'<=vมันช้ามาก แต่สามารถrange(len(a)+1) range(n)ใช้ตัวแปรสำหรับiและi+1ชิ้นเพื่อหลีกเลี่ยงผลรวม ใช้แลมบ์ดา แก้ไขบันทึก 48 จากที่ผ่านมาของคุณ
Jonathan Allan

@ Jonathan Allan: ฉันได้ทำการเปลี่ยนแปลงบางอย่างแล้ว; แต่ขอขอบคุณ 18 ไบต์!
Chas Brown


@ Jonathan Allan: ดีมาก! ตอนนี้อ่านไม่ได้แล้ว :)
Chas Brown

1
@Janathan Allan: ฮ่า ๆ ฉันจะหยุดการอัปเดต - ฉันไม่สามารถติดตามได้! :)
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) ,  129 125  123 ไบต์

รับอินพุตเป็นสตริง พิมพ์เพื่อนบ้าน 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

@Neil จริงๆแล้วมันไม่มีอยู่ในโหนด ฉันคิดว่ารุ่นนี้เป็นเพียงโครงสร้างของ V8 - ซึ่งใกล้เคียงกับเบราว์เซอร์มากขึ้น
Arnauld

2

เจลลี่ , 53 38 ไบต์

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

ลองออนไลน์!

ไม่มีระยะทางในตัวสำหรับ Levenshtein ดังนั้นสร้างการแก้ไขระยะทาง 1 ทางที่เป็นไปได้ทั้งหมดจากนั้นแยกส่วนที่มีศูนย์นำหน้าและรักษารูปสี่เหลี่ยมที่สมบูรณ์แบบเท่านั้น ไม่กรองข้อมูลซ้ำ (ตามที่อนุญาต)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.