Сусіди Левенштейна


20

Більшість квадратних чисел мають щонайменше 1 різних квадратних чисел, з якими їх відстань Левенштейна дорівнює рівно 1. Для даного квадрата кожен квадрат, який відповідає цій умові, називається сусідом Левенштейна з . Наприклад, є Левенштейн сусідом , так як тільки 1 редагування ( ) не потрібно. Однак не є сусідом Левенштейна з , оскільки для цього потрібно як мінімум 2 редагування. Числа, які мають провідні 0 ( ), не є сусідами Левенштейна.xx 36 16 1 3 64 16 2025 025x36161364162025025

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

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

Цей вхід завжди буде квадратним числом, більшим за . У вашій програмі не повинно бути теоретичного обмеження, але якщо вона не спрацьовує для великих чисел з практичних причин (наприклад, понад 32-бітові числа), це абсолютно добре.0

Якщо на вході немає сусідів Левенштейна, вихід повинен чітко відображати це, наприклад, нічого не виводить, порожній масив / рядок, від'ємне ціле число, тощо.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 Так, я вважаю, що ти маєш рацію, 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-byter могло бути . Хороша точкова відповідь, хоча! +1 від мене.
Кевін Крейссен

Повільніше 7: т+Lnʒ.L. Безглуздо сповільнить 6: °Lnʒ.L. Нескінченно повільний 5: ∞nʒ.L.
Grimmy

1
@Grimy Спасибі - чому на землі я не думав спочатку площу: /. Це нескінченне прийнятне для питання "показати всім"? (Я бачу, що ми можемо подати генератори як подання функцій, але якщо немає кодованої точки зупинки, ми не можемо знати, коли це дано нам остаточне значення).
Джонатан Аллан

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

@Grimy на жаль, спасибі Я порахував, що 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

Спробуйте в Інтернеті! Пояснення:

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

Для кожної цифри спробуйте а) видалити її б) передуючи її з іншою цифрою в) змінивши її на іншу цифру. На даний момент інша цифра позначена символом a #.

#
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]

Спробуйте в Інтернеті!

n91n1911009100(9n)2=81n2n>181n2>91nn=119191 не квадрат, у нас все добре.

1(9n)2


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! байт thx Джонатану Аллану .


Збережіть 48 . [p for p in...]є зайвим. Ми можемо повернути набір (або дублікати). '0'<v[:1]може бути '1'<=v. Це набагато повільніше, але range(len(a)+1)може бути range(n). Щоб уникнути суми, використовуйте змінну для iта i+1фрагментів. Використовуйте лямбда. EDIT збережіть 48 від попереднього.
Джонатан Аллан

@ Джонатан Аллан: Я вже вніс кілька таких же змін; але, безумовно, ціную 18 байт!
Час Браун


@Jonathan Allan: Приємно! Зараз це ледве читається :).
Час Браун

1
@ Джонатан Аллан: Лол, я просто перестану оновлюватись - я не можу йти в ногу! :)
Час Браун

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.