Vicini di Levenshtein


20

La maggior parte dei numeri quadrati ha almeno 1 diverso numero quadrato con cui la loro distanza di Levenshtein è esattamente 1. Per un dato quadrato , ogni quadrato che soddisfa questa condizione è chiamato vicino di Levenshtein di . Ad esempio, è un vicino di Levenshtein di , poiché è richiesta solo 1 modifica (da ). Tuttavia, non è un vicino di Levenshtein di , poiché richiede un minimo di 2 modifiche. I numeri che hanno 0 iniziali (da ) non sono vicini di Levenshtein.xx36161364162025025

Il tuo compito è prendere un numero quadrato come input e produrre, in qualsiasi formato ragionevole, l'elenco completo dei vicini di Levenshtein. Se lo desideri, puoi includere vicini ripetuti nell'elenco, ma potresti non includere l'input originale, poiché non è un vicino di Levenshtein di per sé.

Qualsiasi formato ragionevole dovrebbe includere una sorta di separatore tra le uscite, come ,o una nuova riga, e può produrre caratteri con il corrispondente valore Unicode (cioè brainfuck) anziché i numeri stessi. L'ordine dell'output non ha importanza.

Questo input sarà sempre un numero quadrato, maggiore di . Il tuo programma non dovrebbe avere limiti teorici , ma se fallisce per grandi numeri per motivi pratici (es. Oltre i numeri a 32 bit), va benissimo.0

Se l'input non ha vicini di Levenshtein, l'output deve riflettere chiaramente questo, come l'output di nulla, una matrice / stringa vuota, un numero intero negativo, , ecc.0

Questo è , quindi vince il codice più breve in byte.

Casi test

Questi sono i risultati per i quadrati da a 20 :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

Inoltre, 1024non ha vicini, quindi è un buon caso di prova.


3
Più interessante sarebbe quello che sono i vicini di casa 2025.
Neil,

6
A meno che non mi manchi qualcosa, 32 * 32 = 1024non ha vicini quadrati di Levenshtein.
xnor

2
@xnor Sì, credo che tu abbia ragione, 1024non ha vicini di Levenshtein, modificherò questo esempio in
caird coinheringaahing

6
Per tutte le dichiarazioni del modulo "Per tutti ...", se è possibile trovare un controesempio, si tratta di una rigorosa confutazione dell'istruzione. (Ma se sbaglio, accetterò un controesempio come un rigoroso disproof.)
Neil

2
Possiamo includere il numero originale nell'output? Ad esempio 49 -> 4, 9, 49.
Robin Ryder,

Risposte:


7

05AB1E ,  11 10  6 byte

-4 grazie a Grimy !! (piazza prima invece di cercare i quadrati salva 3; usa 10 ^ n salva 1)

°Lnʒ.L

Accetta un numero intero, genera un elenco, possibilmente vuoto,

Provalo online! - Questo è pazzesco a causa del°, quindi non c'è motivo di provarlo anche per9.
Oppure prova una versione leggermente più veloce : questa ne aggiunge otto invece con8+lo stesso approccio.

Come?

°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
Il 9s«nel tuo 11-byter avrebbe potuto essere . Bella risposta al punto, però! +1 da me.
Kevin Cruijssen,

Più lento 7: т+Lnʒ.L. Incredibilmente lento 6: °Lnʒ.L. Infinitamente lento 5: ∞nʒ.L.
Grimmy,

1
@Grimy Grazie - perché mai non ho pensato di quadrare prima: /. Quella infinita è accettabile per una domanda "mostra tutto"? (Vedo che possiamo inviare generatori come invii di funzioni, ma se non esiste un punto di arresto codificato, non possiamo sapere quando ci viene fornito il valore finale).
Jonathan Allan,

Non credo ∞nʒ.Lsia accettabile come risposta perché le comunicazioni devono terminare . Non correlato: utilizza il collegamento TIO per la versione a 7 byte , che è ~ 100 volte più lento rispetto T+ai numeri di grandi dimensioni. Il mio commento ha usato т+(aggiungere 100) per sicurezza, ma risulta 8+sufficiente in tutti i casi.
Grimmy,

@Grimy oops, grazie. Ho pensato che 100 fosse eccessivo poiché 1 ho solo bisogno di controllare i primi 9 quadrati.
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

Provalo online! Spiegazione:

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

Per ogni cifra, prova a) rimuovendola b) precedendola con una cifra diversa c) cambiandola in una cifra diversa. Per ora, la cifra diversa è contrassegnata con a #.

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

Per ogni potenziale cifra diversa, sostituire ogni cifra possibile.

A`^0

Rimuovi i numeri che ora iniziano con zero.

Dr`

Rimuovi tutti i numeri duplicati. (Questo lascia solo le righe vuote.)

\d+
$*

Converti in unario.

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

Mantieni tutti i numeri quadrati tranne l'ultimo (che è sempre il numero di input).

%`1

Converti i numeri rimanenti in decimali.


5

R , 42 41 byte

(9n)2

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

Provalo online!

n91n1911009100(9n)2=81n2n>181n2>91nn=119191 non è un quadrato, stiamo bene.

1(9n)2


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}

Provalo online!

19 + 3 + 5 + 1 = 28! grazie grazie a Jonathan Allan .


Salva 48 . [p for p in...]è ridondante. Possiamo restituire un set (o duplicati). '0'<v[:1]può essere '1'<=v. È molto più lento ma range(len(a)+1)può esserlo range(n). Utilizzare una variabile per ie i+1sezioni per evitare la somma. Usa una lambda. EDIT salva 48 dal tuo precedente.
Jonathan Allan, il

@Jonathan Allan: avevo già apportato alcune delle stesse modifiche; ma apprezzo sicuramente i 18 byte!
Chas Brown,


@Jonathan Allan: Nice! Ora è appena leggibile :).
Chas Brown,

1
@Jonathan Allan: Lol, smetterò solo di aggiornarmi - Non riesco a tenere il passo! :)
Chas Brown il

3

Oracle SQL, 93 byte

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

Test in 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 byte

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

Provalo online!

Questo script stampa i vicini di input di Levenshtein separati da _un separatore finale e, se non viene trovato alcun vicino, non stampa nulla.

Happily PHP ha un built-in per la distanza Levenshtein ! Questo script scorre su tutti i numeri quadrati da 1 a input * 91, poiché tutti i vicini di Levenshtein validi (distanza di 1) si trovano in quell'intervallo. Quindi stampa ogni numero in quell'intervallo che ha una distanza di Levenshtein pari a 1 con l'ingresso.


2

JavaScript (V8) ,  129 125  123 byte

Accetta l'input come stringa. Stampa i vicini di Levenshtein su 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)}

Provalo online!

Commentate

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
}                             //

Sapevo che lo aveva fatto SpiderMonkey print()ma non mi rendevo conto che anche Node lo avesse ...
Neil, il

@Neil In realtà, non esiste in Node. Penso che questa versione sia solo una build shell di V8, che è molto più vicina alla versione del browser.
Arnauld, il

2

Gelatina , 53 38 byte

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

Provalo online!

Non esiste un built-in per la distanza di Levenshtein, quindi genera tutte le possibili modifiche a 1 distanza e quindi esclude quelle con zero iniziale e mantiene solo i quadrati perfetti. Non filtra i duplicati (come consentito).


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.