Левенштейн Соседи


20

Большинство квадратных чисел имеют по крайней мере 1 другое квадратное число, с которым их расстояние Левенштейна равно 1. Для данного квадрата x каждый квадрат, который удовлетворяет этому условию, называется соседом Левенштейна от x . Например, 36 является соседом Левенштейна из 16 , так как требуется только 1 правка ( 13 ). Однако 64 не является соседом Левенштейна из 16 , так как требует минимум 2 правок. Числа с начальными 0 ( 2025025 ) не являются соседями Левенштейна.

Ваша задача - взять квадратное число в качестве входных данных и вывести в любом разумном формате полный список его соседей Левенштейна. Вы можете включить в список повторных соседей, если хотите, но не можете включать исходный ввод, поскольку он не является соседом Левенштейна.

Любой разумный формат должен включать в себя какой-то разделитель между выходами, например ,или символ новой строки, и может выводить символы с соответствующим значением Unicode (например, brainfuck), а не сами цифры. Порядок вывода не имеет значения.

Этот вход всегда будет квадратным числом больше 0 . Ваша программа не должна иметь никаких теоретических ограничений, но если она не подходит для больших чисел по практическим причинам (например, за пределами 32-разрядных чисел), это вполне нормально.

Если входные данные не имеют соседей Левенштейна, выходные данные должны четко отражать это, например, ничего не выводить, пустой массив / строка, отрицательное целое число, 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.
Нил

6
Если только я что-то упустил, 32 * 32 = 1024у Левенштейна нет соседей.
xnor

2
@xnor Да, я думаю , что вы правы, 1024не имеет соседей Левенштейн, я буду редактировать этот пример в
Caird coinheringaahing

6
Для всех утверждений вида «Для всех ...», если можно найти контрпример, это строгое опровержение утверждения. (Но если я ошибаюсь, я приму контрпример как строгое опровержение.)
Нил

2
Можем ли мы включить исходный номер в вывод? Например 49 -> 4, 9, 49.
Робин Райдер

Ответы:


7

05AB1E ,  11 10  6 байтов

-4 спасибо грими !! (сначала квадрат вместо поиска квадратов сохраняет 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-байт может быть . Хороший точный ответ, хотя! +1 от меня.
Кевин Круйссен

Медленнее 7: т+Lnʒ.L. Нелепо замедлит 6: °Lnʒ.L. Бесконечно медленный 5: ∞nʒ.L.
Grimmy

1
@ Грими Спасибо - с какой стати я не подумал сначала возвести в квадрат: /. Является ли этот бесконечный вопрос приемлемым для вопроса «показать все»? (Я вижу, что мы можем отправлять генераторы как функции представления, но если нет закодированной точки останова, мы не можем знать, когда она дала нам окончательное значение).
Джонатан Аллан

Я не думаю, что ∞nʒ.Lэто приемлемо в качестве ответа, потому что представления должны быть прекращены . Не связано: ваша ссылка TIO для 7-байтовой версии использует , что примерно в 100 раз медленнее, чем T+для больших чисел. Мой комментарий использовался т+(добавьте 100), чтобы быть безопасным, но оказывается, 8+что этого достаточно во всех случаях.
Grimmy

@ Грими, ой, спасибо. Я считал, что 100 было излишним, так как 1 нужно проверить только первые 9 клеток.
Джонатан Аллан

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

Попробуйте онлайн! Объяснение:

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

Для каждой цифры попробуйте: а) удалить ее; б) поставить перед ней другую цифру; в) изменить ее на другую цифру. На данный момент другая цифра помечена знаком #.

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

Для каждой потенциальной разной цифры подставьте каждую возможную цифру.

A`^0

Удалите числа, которые теперь начинаются с нуля.

Dr`

Удалить все дублированные номера. (Это просто оставляет строки пустыми.)

\d+
$*

Преобразовать в одинарный.

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

Сохраните все квадратные числа, кроме последнего (который всегда является входным числом).

%`1

Преобразуйте оставшиеся числа обратно в десятичные.


5

Р , 42 41 байт

(9N)2

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

Попробуйте онлайн!

N91N1911009100(9N)2знак равно81N2N>181N2>91NNзнак равно119191 не квадрат, у нас все хорошо.

1(9N)2


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: я уже сделал некоторые из тех же самых изменений; но определенно оцените 18 байтов!
Час Браун


@ Джонатан Аллан: Отлично! Теперь это едва читаемо :).
Час Браун

1
@Jonathan Allan: Lol, я просто перестану обновлять - я не могу идти в ногу! :)
Час Браун

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._);

Попробуйте онлайн!

Этот скрипт печатает соседние входные данные Левенштейна, разделенные _конечным разделителем, и, если соседей нет, ничего не печатает.

К счастью, в PHP есть встроенное расстояние Левенштейна ! Этот сценарий проходит по всем квадратным числам от 1 до input * 91, поскольку все действительные соседи Левенштейна (расстояние 1) находятся в этом диапазоне. Затем печатает каждое число в этом диапазоне, у которого расстояние Левенштейна равно 1, с вводом.


2

JavaScript (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()но я не понимал, что у Нода это тоже было ...
Нил

@Neil На самом деле, он не существует в Node. Я думаю, что эта версия - просто оболочка V8, которая намного ближе к версии браузера.
Арно

2

Желе , 53 38 байт

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

Попробуйте онлайн!

Там нет встроенного для расстояния Левенштейна, поэтому генерирует все возможные правки с 1-го расстояния, а затем исключает те, которые имеют начальный ноль, и сохраняет только идеальные квадраты. Не фильтрует дубликаты (как разрешено).


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.