Обертання інваріантного відбитків пальців


15

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

Наприклад, якщо у нас є L-тетроміно

x
x
xx

ми хотіли б, щоб він мав такий самий відбиток пальців, як і будь-який із цих:

         xx
  x       x      xxx
xxx  ,    x  or  x

Примітка. Ми допускаємо обертання лише на площині (тобто вони є односторонніми полиоминосами), і тому наступне поліоміно буде іншим:

 x
 x
xx 

Виклик

Завданням цього завдання є реалізація функції відбитків пальців / програми, яка займає м×н булева / 0,1 матрицю кодує поліоміно та повертає рядок - відбиток поліоміно . Відбиток пальця повинен бути рівним для всіх можливих обертів (загалом 4).

Введення-виведення

  • м1 ін1 (тобто немає порожнього полиомино)
  • Ви гарантовано гарантуєте, що м,н є настільки маленькими, наскільки це можливо (тобто всі 0 оброблені так, щоб відповідати м і н
  • Ви гарантуєте, що вхід є
    • просто підключений
    • не має отворів
  • Вихід повинен бути рядком, який однаковий для кожного можливого обертання поліоміно

Приклади

Ось кілька класів еквівалентності, для кожного класу відбиток пальців повинен бути однаковим, а для будь-яких двох поліомінів з двох різних класів вони повинні відрізнятися.

Обертання L-тетроміно з прикладу:

[[1,0],[1,0],[1,1]]
[[0,0,1],[1,1,1]]
[[1,1],[0,1],[0,1]]
[[1,1,1],[1,0,0]]

J-тетроміно:

[[0,1],[0,1],[1,1]]
[[1,1,1],[0,0,1]]
[[1,1],[1,0],[1,0]]
[[1,0,0],[1,1,1]]

Одиниця полиомино:

[[1]]

А 5×1 бар:

[[1,1,1,1,1]]
[[1],[1],[1],[1],[1]]

2×2 кут:

[[1,1],[1,0]]
[[1,0],[1,1]]
[[0,1],[1,1]]
[[1,1],[0,1]]

W-пентоміно:

[[1,0,0],[1,1,0],[0,1,1]]
[[0,0,1],[0,1,1],[1,1,0]]
[[1,1,0],[0,1,1],[0,0,1]]
[[0,1,1],[1,1,0],[1,0,0]]


Якщо я завжди виводжу ""(порожній рядок), чи задовольняю я всі вимоги?
Даніель Вагнер

@DanielWagner: "[..] для будь-яких двох поліомінів з двох різних класів [відбитки пальців] повинні відрізнятися " - так ні, це було б недійсно.
ბიმო

Чи виводить усі можливі обертання масиву послідовно відсортовані? Приклад
Shaggy

1
@Shaggy: Так, це відповідало б усім критеріям.
ბიმო

Відповіді:


7

Python 2 , 48 байт

f=lambda l,z=5:z and max(l,f(zip(*l)[::-1],z-1))

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

Бере найбільший із чотирьох обертів із точки зору порівняння списку. На основі рішення FlipTack .

Код використовує можливість Python 2 порівнювати об'єкти різних типів. Базова величина регістру 0нешкідлива, maxоскільки вона менша за будь-який список. Крім того, zipстворюється список кортежів, тоді як вхідні дані - це список списків, але кортежі є більшими за списки, тому вхідні списки списків ніколи не є суперником. Ось чому ми обертаємося в 5 разів, а не в 4, щоб повернутися до затвердженої версії початкового списку. (Створення списку кортежів також може спрацювати, якщо це дозволена форма введення даних.)


4

Python 3 , 63 байти

def f(m):M=[];exec("m=[*zip(*m[::-1])];M+=m,;"*4);return min(M)

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

Знаходить обертання з лексографічним мінімумом і друкує це.

Форма лямбда складається з того ж числа байтів:

lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M[-4:])

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


Переписування в якості lambdaможе привести вас до 58 lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M). Працює, бо execзавжди повертається None.
nedla2004

@ nedla2004 Це можна запустити лише один раз, а потім стає хитрим, як Mуже заселене ...
FlipTack

@ nedla2004 ... але облік проблеми з M[-4:]може привести вас до тієї ж кількості байтів.
FlipTack

Я бачу, тест, який я використовував, просто перевіряв вхідні дані з таким самим "хешем", тому я ніколи не стикався з цим. Що має сенс.
nedla2004

2

Желе , 5 байт

ZU$ƬṂ

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

Повна програма.

Просто генерує всі можливі обертання та підбирає лексикографічний мінімум.

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


коли я читав виклик, я знав, що це станеться :)
ngn


2

К (нг / к) , 16 байт

{a@*<a:3{+|x}\x}

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

хв обертів

{ } функція з аргументом x

{+|x}обертати, тобто обернути ( |) і перемістити ( +)

3{ }\застосовувати 3 рази із збереженням проміжних результатів; це повертає список із 4 обертів

a: призначити a

< висхідний (обчислити перестановку за сортуванням)

* спочатку

a@індекс aз цим


1

Japt -g, 6 байт

4Æ=zÃñ

Спробуй це

           :Implicit input of 2d-array U
4Æ         :Map the range [0,4)
   z       :  Rotate U 90 degrees
  =        :  Reassign to U
    Ã      :End map
     ñ     :Sort
           :Implicit output of first element

Чи -gпотрібен прапор? Сортування повинно означати, що всі початкові обертання закінчуються тим самим списком, щоб повний список працював чудово як відбиток пальців, якщо я щось не пропускаю.
Каміль Дракарі

@KamilDrakari, ти цілком можеш мати рацію - як я вже сказав, я не впевнений, що повністю зрозумів виклик. Не шкодуючи, залишаючи це, хоча це не коштує жодних байт.
Кудлатий

@KamilDrakari: Це не обов'язково, але це не шкода, оскільки він не зараховується до рахунку.
ბიმო

1

J , 16 байт

-2 байти завдяки Шаггі

[:/:~|.@|:^:(<4)

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

J , 18 байт

0{[:/:~|.@|:^:(<4)

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

Повертає перший елемент у списку лексикографічно відсортованих обертів поліоміно.

Пояснення:

            ^:(<4)  - do the verb on the left 4 times, storing all the steps
       |.@|:        - tranpose and reverse
    /:~             - sort up the 4 matrices
  [:                - cap the fork
0{                  - take the first matrix  

@Shaggy Дякую!
Гален Іванов

0

05AB1E , 10 8 байт

3FÂø})Σ˜

-2 байти завдяки @Shaggy .

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

3F  }       # Loop 3 times
  Â         #  Bifurcate (short for Duplicate & Reverse) the top of the stack
            #  (which is the input-matrix implicitly the first iteration)
   ø        #  Transpose: swap rows/columns
     )      # After the loop, wrap everything on the stack in a list
      Σ˜    # Sort this list of matrices by their flattened array (and output implicitly)

ПРИМІТКА: Взяття мінімуму з ßабо Wнеявно сплющується, таким чином виводиться 0. І сортування за допомогою {, здається, не працює для списку матриць, саме тому я використовую Σ˜натомість.


1
@Shaggy Дякую! :) У цьому випадку останні два байти можна видалити, оскільки }це робиться неявно, якщо після цього нічого не відбувається.
Кевін Кройсейсен

1
Сьогодні я дізнався щось про 05AB1E! :) Те саме в Japt.
Кудлатий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.