레 벤슈 테인 이웃


20

대부분의 정사각 수는있는 적어도 한 다른 평방 숫자가 Levenshtein 거리가 정확히 주어진 사각형의 경우 1입니다 하는 호출이 조건을 충족하는 각 평방 Levenshtein 이웃 의 . 예를 들어, 은 1의 편집 ( ) 만 필요하므로 의 Levenshtein 이웃입니다 . 그러나 는 최소 2 개의 편집이 필요하기 때문에 16 의 Levenshtein 이웃이 아닙니다 . 선행 0을 갖는 숫자 ( 2025 \ to 025 )는 레 벤슈 테인 이웃 이 아닙니다 .xx36161364162025025

당신의 임무는 입력으로 제곱 수를 취하고 레 벤슈 테인 이웃의 전체 목록을 합리적인 형식으로 출력하는 것입니다. 원하는 경우 목록에 반복 이웃을 포함 할 수 있지만, Levenshtein 이웃이 아니므로 원래 입력을 포함 할 수 없습니다.

합리적인 형식에는 출력 (예 : ,줄 바꿈)과 같은 출력 사이에 일종의 구분 기호가 포함되어야 하며 숫자 자체가 아니라 해당 유니 코드 값 (예 : brainfuck)으로 문자를 출력 할 수 있습니다. 출력 순서는 중요하지 않습니다.

이 입력은 항상 0 보다 큰 제곱 수 입니다. 프로그램에는 이론적 인 제한 이 없어야 하지만 실제 이유로 (예를 들어 32 비트 수를 초과하여) 많은 수로 실패하면 완전히 괜찮습니다.

입력에 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벤슈 테인 광장에는 광장이 없습니다.
xnor

2
@xnor 예, 당신이 옳다고 생각합니다. 1024Levenshtein 이웃이 없습니다. 나는 그 예를 다음에서 편집 할 것입니다
caird coinheringaahing

6
"모두를 위해 ..."형식의 모든 진술에 대해, 반대의 예를 찾을 수 있다면, 이것은 그 진술에 대한 엄격한 증거입니다. (그러나 내가 틀렸다면, 엄격한 반대 책으로 반례를 받아 들일 것입니다.)
Neil

2
출력에 원래 번호를 포함시킬 수 있습니까? 예 : 49-> 4, 9, 49.
Robin Ryder

답변:


7

05AB1E ,  11 10  6 바이트

Grimy 덕분에 -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
Kevin Cruijssen

느린 7 : т+Lnʒ.L. 웃기 6 둔화 : °Lnʒ.L. 무한히 느리게 5 : ∞nʒ.L.
그리미

1
@ 그림 고마워-왜 지구상에서 내가 먼저 사각형을 생각하지 않았다 : /. "모두 표시"질문에 대해 무한한 것이 허용됩니까? (제너레이터를 함수 제출로 제출할 수 있지만 코딩 된 정지 점이 없으면 최종 값이 언제 제공되는지 알 수 없습니다).
Jonathan Allan

제출이 종료되어야∞nʒ.L 하므로 답변으로 받아 들일 수 없다고 생각 합니다 . 관련 없음 : 7 바이트 버전의 TIO 링크는을 사용하는데 , 이는 T+큰 숫자 보다 ~ 100 배 느립니다 . 내 의견 т+은 안전하기 위해 (100을 추가) 사용 했지만 8+모든 경우에 충분합니다.
그리미

@Grimy 죄송합니다. 나는 1이 처음 9 개의 사각형을 확인하기 만하면 100이 과도하다고 생각했습니다.
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

이제 0으로 시작하는 숫자를 제거하십시오.

Dr`

중복 된 숫자를 모두 제거하십시오. (이것은 단지 줄을 비워 둡니다.)

\d+
$*

단항으로 변환합니다.

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

마지막 숫자 (항상 입력 숫자)를 제외한 모든 제곱 숫자를 유지하십시오.

%`1

나머지 숫자를 다시 십진수로 변환하십시오.


5

R , 42 41 바이트

(9)2

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

온라인으로 사용해보십시오!

911911009100(9)2=812>1, 812>91그래서 우리는 괜찮습니다. 에 대한=1,이 경계는 한 레 벤슈 테인 이웃을 그리워합니다. 191; 이후91 사각형이 아닙니다, 우리는 괜찮습니다.

사이의 모든 제곱 수를 나열합니다 1(9)2Levenshtein 거리를 1로 유지합니다.


4

파이썬 (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 에게 thx .


저장 48 . [p for p in...]중복됩니다. 우리는 세트 (또는 중복)를 반환 할 수 있습니다. '0'<v[:1]일 수 있습니다 '1'<=v. 훨씬 느리지 만 range(len(a)+1)가능합니다 range(n). 합계를 피하려면 변수 ii+1슬라이스를 사용하십시오 . 람다를 사용하십시오. 편집 이전에서 48을 저장하십시오.
Jonathan Allan

@Jonathan Allan : 이미 같은 내용을 변경했습니다. 그러나 확실히 18 바이트를 주셔서 감사합니다!
Chas Brown


@ 조나단 앨런 : 니스! 이제 거의 읽을 수 없습니다 :).
Chas Brown

1
@Jonathan Allan : Lol, 난 그냥 업데이트를 멈출거야-계속 못해요! :)
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 거리 에 대한 내장 기능이 있습니다 ! input * 91유효한 모든 Levenshtein 이웃 (거리 1)이 해당 범위에 있기 때문에이 스크립트는 1에서 모든 제곱 수를 반복 합니다. 그런 다음 입력과 함께 Levenshtein 거리가 1 인 해당 범위의 모든 숫자를 인쇄합니다.


2

자바 스크립트 (V8) ,  129 (125)  123 바이트

입력을 문자열로받습니다. 레 벤슈 테인 이웃을 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의 쉘 빌드 일 뿐이며 브라우저 버전에 훨씬 가깝습니다.
Arnauld

2

젤리 , 53 38 바이트

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

온라인으로 사용해보십시오!

Levenshtein 거리에 대한 내장 기능이 없으므로 가능한 모든 1- 거리 편집을 생성 한 다음 0이 선행하는 것을 제외하고 완벽한 정사각형 만 유지합니다. 중복을 필터링하지 않습니다 (허용 된대로).


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.