Vizinhos de Levenshtein

20

A maioria dos números quadrados ter pelo menos 1 número quadrado diferente com que sua distância Levenshtein é exatamente 1. Para um dado quadrado x , cada quadrado que atenda esta condição é chamada um vizinho Levenshtein de x . Por exemplo, 36 é um vizinho de 16 de Levenshtein , pois apenas 1 edição ( 13 ) é necessária. No entanto, 64 não é um vizinho de Levenshtein de 16 , pois exige um mínimo de 2 edições. Os números com 0 iniciais ( 2025025 ) não são vizinhos de Levenshtein.

Sua tarefa é pegar um número quadrado como entrada e gerar, em qualquer formato razoável, a lista completa dos vizinhos de Levenshtein. Você pode incluir vizinhos repetidos na lista, se desejar, mas não incluir a entrada original, pois não é um vizinho de Levenshtein.

Qualquer formato razoável deve incluir algum tipo de separador entre as saídas, como ,ou uma nova linha, e pode gerar caracteres com o valor Unicode correspondente (por exemplo, cérebro), em vez dos próprios números. A ordem da saída não importa.

Essa entrada sempre será um número quadrado maior que 0 . Seu programa não deve ter limite teórico , mas se falhar por grandes números por motivos práticos (por exemplo, além dos números de 32 bits), tudo bem.

Se a entrada não tiver vizinhos de Levenshtein, a saída deve refletir claramente isso, como a saída de nada, uma matriz / string vazia, um número inteiro negativo, 0 etc.

Isso é , então o código mais curto em bytes vence.

Casos de teste

Estes são os resultados para os quadrados de 1 a 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

Além disso, 1024não possui vizinhos, por isso é um bom caso de teste.

caird coinheringaahing
fonte
3
Mais interessante seria o que os vizinhos 2025são.
Neil
6
A menos que esteja faltando alguma coisa, 32 * 32 = 1024não há vizinhos Levenshtein quadrados.
xnor 17/08
2
@xnor Sim, acredito que você esteja certo, 1024não tem vizinhos Levenshtein, vou editar esse exemplo em
caird coinheringaahing 17/08
6
Para todas as declarações do formulário "Para todos ...", se um contra-exemplo puder ser encontrado, essa é uma rigorosa reprovação da declaração. (Mas, se estiver errado, aceitarei um contra-exemplo como uma rigorosa reprovação.)
Neil
2
Podemos incluir o número original na saída? Por exemplo 49 -> 4, 9, 49.
Robin Ryder

Respostas:

7

05AB1E ,  11 10  6 bytes

-4 graças a Grimy !! (coloque primeiro o quadrado em vez de procurar os quadrados com 3; use 10 ^ n com 1)

°Lnʒ.L

Pega um número inteiro, gera uma lista possivelmente vazia

Experimente online! - Isso é muito lento devido ao°, então não adianta tentar nem por isso9.
Ou Tente uma versão um pouco mais rápida - esta adiciona oito8+e usa a mesma abordagem.

Quão?

°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
fonte
1
O 9s«seu 11-byter poderia ter sido . Boa resposta direta, no entanto! +1 de mim.
Kevin Cruijssen 19/08
Mais lento 7: т+Lnʒ.L. Ridiculamente lento 6: °Lnʒ.L. Infinitamente lenta 5: ∞nʒ.L.
Grimmy 19/08
1
@ Grimy Obrigado - por que diabos eu não pensei em quadrado primeiro: /. Esse infinito é aceitável para uma pergunta "mostrar tudo"? (Vejo que podemos enviar geradores como envios de funções, mas se não houver um ponto de parada codificado, não saberemos quando ele nos fornecerá o valor final).
Jonathan Allan
Não acho que ∞nʒ.Lseja aceitável como resposta porque os envios precisam terminar . Independente: o link do seu TIO para a versão de 7 bytes é aproximadamente 100x mais lento do que T+para números grandes. Meu comentário costumava т+(adicione 100) ser seguro, mas acontece que 8+é suficiente em todos os casos.
Grimmy 19/08
@ Grimy oops, obrigado. Achei que 100 era um exagero, pois só preciso verificar os 9 primeiros quadrados.
Jonathan Allan
5

Retina 0.8.2 , 142 138 bytes

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

Experimente online!Explicação:

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

Para cada dígito, tente a) removê-lo b) precedendo-o com um dígito diferente c) alterando-o para um dígito diferente. Por enquanto, o dígito diferente está marcado com um# .

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

Para cada dígito potencial diferente, substitua cada dígito possível.

A`^0

Remova os números que agora começam com zero.

Dr`

Remova todos os números duplicados. (Isso deixa as linhas em branco.)

\d+
$*

Converta para unário.

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

Mantenha todos os números quadrados, exceto o último (que é sempre o número de entrada).

%`1

Converta os números restantes novamente em decimal.

Neil
fonte
5

R , 42 bytes

(9n)2

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

Experimente online!

n91n1911009100(9n)2=81n2n>181n2>91nn=119191 não é um quadrado, estamos bem.

1(9n)2

Robin Ryder
fonte
4

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

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}

Experimente online!

19 + 3 + 5 + 1 = 28! bytes thx para Jonathan Allan .

Chas Brown
fonte
Economize 48 . [p for p in...]é redundante. Podemos retornar um conjunto (ou duplicatas). '0'<v[:1]pode ser '1'<=v. É muito mais lento, mas range(len(a)+1)pode ser range(n). Use uma variável para ie i+1fatias para evitar a soma. Use uma lambda. EDIT salvar 48 do seu anterior.
Jonathan Allan
@ Jonathan Allan: eu já tinha feito algumas das mesmas alterações; mas definitivamente aprecio os 18 bytes!
Chas Brown
Outro
Jonathan Allan
@ Jonathan Allan: Bom! Agora é dificilmente legível :).
Chas Brown
1
@ Jonathan Allan: Lol, vou parar de atualizar - não consigo acompanhar! :)
Chas Brown
3

Oracle SQL, 93 bytes

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

Teste no 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
fonte
2

PHP , 62 bytes

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

Experimente online!

Esse script imprime os vizinhos de entrada de Levenshtein separados por _um separador à direita e, se nenhum vizinho for encontrado, não imprime nada.

Felizmente, o PHP possui uma distância embutida para Levenshtein ! Esse script percorre todos os números quadrados de 1 a input * 91, pois todos os vizinhos válidos de Levenshtein (distância de 1) estão nesse intervalo. Em seguida, imprime todos os números nesse intervalo que possuem uma distância de Levenshtein de 1 com a entrada.

Night2
fonte
2

JavaScript (V8) ,  129 125  123 bytes

Recebe a entrada como uma sequência. Imprime os vizinhos de Levenshtein em 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)}

Experimente online!

Comentado

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
fonte
Eu sabia que o SpiderMonkey tinha, print()mas não sabia que o Node também o tinha ...
Neil
@ Neil Na verdade, ele não existe no Node. Penso que esta versão é apenas uma versão shell do V8 - muito mais próxima da versão do navegador.
Arnauld
2

Geléia , 53 38 bytes

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

Experimente online!

Não existe uma distância interna para a distância de Levenshtein, portanto gera todas as edições possíveis de uma distância e exclui aquelas com zero à esquerda e mantém apenas quadrados perfeitos. Não filtra duplicatas (conforme permitido).

Nick Kennedy
fonte