Xoay dấu vân tay bất biến


15

Hãy tưởng tượng chúng ta có một số polyomino và muốn xác định duy nhất chúng, tuy nhiên polyominos có thể được xoay, do đó, việc băm chúng một cách mù quáng sẽ không cho chúng ta cùng một dấu vân tay và một vòng quay của chúng (nói chung).

Ví dụ: nếu chúng ta có L-tetromino

x
x
xx

chúng tôi muốn nó có cùng dấu vân tay như bất kỳ thứ nào trong số này:

         xx
  x       x      xxx
xxx  ,    x  or  x

Lưu ý: Chúng tôi chỉ cho phép quay trên mặt phẳng (nghĩa là chúng là polyominos một phía) và do đó polyomino sau sẽ là một dạng khác:

 x
 x
xx 

Thử thách

Nhiệm vụ cho thử thách này là triển khai chức năng / chương trình lấy dấu vân tay, lấy m×n Boolean / 0,1 ma trận -valued / danh sách liệt kê / chuỗi / .. mã hóa một polyomino và trả về một chuỗi - dấu vân tay của một polyomino . Dấu vân tay phải bằng nhau cho tất cả các phép quay có thể (nói chung 4).

Đầu ra đầu vào

  • m1n1 (tức. không polyomino trống)
  • bạn được đảm bảo rằng m,n càng nhỏ càng tốt (ví dụ: tất cả 0 được cắt bớt để phù hợp với mn
  • bạn được đảm bảo rằng đầu vào là
    • kết nối đơn giản
    • không có lỗ
  • đầu ra phải là một chuỗi giống nhau cho mỗi vòng quay có thể có của một polyomino

Ví dụ

Dưới đây là một số lớp tương đương, đối với mỗi lớp, dấu vân tay phải giống nhau & đối với bất kỳ hai polyominos nào từ hai lớp khác nhau, chúng phải khác nhau.

Các phép quay của L-tetromino từ ví dụ:

[[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-tetromino:

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

Các polyomino đơn vị:

[[1]]

Một thanh 5×1 :

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

Một 2×2 góc:

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

W-pentomino:

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


Nếu tôi luôn xuất ""(chuỗi rỗng), tôi đã thỏa mãn tất cả các yêu cầu chưa?
Daniel Wagner

@DanielWagner: "[..] đối với bất kỳ hai polyominos nào từ hai lớp riêng biệt [dấu vân tay] phải khác nhau " - vì vậy, điều đó sẽ không hợp lệ.
17/12/18

Là xuất ra tất cả các phép quay có thể của một mảng, được sắp xếp nhất quán hợp lệ? Ví dụ
Shaggy

1
@Shaggy: Vâng, điều đó sẽ đáp ứng tất cả các tiêu chí.
17/12/18

Câu trả lời:


7

Python 2 , 48 byte

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

Hãy thử trực tuyến!

Lấy số lớn nhất trong bốn phép quay về mặt so sánh danh sách. Dựa trên giải pháp của FlipTack .

Mã này sử dụng khả năng của Python 2 để so sánh các đối tượng thuộc các loại khác nhau. Giá trị trường hợp cơ bản 0là vô hại maxvì nó nhỏ hơn bất kỳ danh sách nào. Ngoài ra, ziptạo một danh sách các bộ dữ liệu trong khi đầu vào là danh sách các danh sách, nhưng các bộ dữ liệu lớn hơn danh sách để danh sách đầu vào của danh sách không bao giờ là đối thủ. Đây là lý do tại sao chúng tôi xoay 5 lần thay vì 4, để chúng tôi quay lại phiên bản tuplified của danh sách ban đầu. (Lấy danh sách các bộ dữ liệu cũng sẽ hoạt động, nếu đó là một dạng đầu vào được phép.)


4

Python 3 , 63 byte

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

Hãy thử trực tuyến!

Tìm phép quay với mức tối thiểu từ vựng và in ra.

Một dạng lambda xuất hiện ở cùng một số byte:

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

Hãy thử trực tuyến!


Viết lại như một lambdacó thể đưa bạn đến 58 lambda m,M=[]:exec("m=[*zip(*m[::-1])];M+=m,;"*4)or min(M).. Hoạt động vì execluôn luôn trở lại None.
nedla2004

@ nedla2004 Điều đó chỉ có thể được chạy một lần, và sau đó trở nên tinh ranh như Mđã được đưa vào ...
FlipTack

@ nedla2004 ... nhưng việc tính toán vấn đề có M[-4:]thể đưa bạn đến cùng số byte.
FlipTack

Tôi thấy, bài kiểm tra tôi đang sử dụng chỉ là kiểm tra các đầu vào có cùng "hàm băm", vì vậy tôi không bao giờ chạy vào đó. Điều đó có ý nghĩa.
nedla2004

2

Thạch , 5 byte

ZU$ƬṂ

Hãy thử trực tuyến!

Chương trình đầy đủ.

Đơn giản chỉ cần tạo ra tất cả các phép quay có thể và chọn mức tối thiểu từ vựng.

Lưu ý rằng danh sách singleton không được bao bọc trong []đầu ra. Điều đó không thành vấn đề, vì trường hợp duy nhất mà danh sách đơn lẻ tồn tại trong đầu vào sẽ là một đường thẳng đứng (bao gồm cả polyomino đơn vị), giống như một đường ngang có cùng kích thước (nơi các danh sách không được bọc ). Trường hợp duy nhất mà bên ngoài []sẽ không tồn tại là polyomino đơn vị.


khi tôi đọc những thách thức tôi biết điều này sẽ xảy ra :)
NGN

2

Sạch , 136 byte

import StdEnv,Data.List
r=reverse;t=transpose;f=flatten
$l=[if((a==b)==(c==d))'x''X'\\a<-f l&b<-f(r(map r l))&c<-f(r(t l))&d<-f(t(r l))]

Hãy thử trực tuyến!

Bao gồm kiểm tra xác minh.


2

K (ngn / k) , 16 byte

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

Hãy thử trực tuyến!

phút quay

{ } chức năng với đối số x

{+|x}xoay, tức là đảo ngược ( |) và hoán vị ( +)

3{ }\áp dụng 3 lần bảo quản kết quả trung gian; cái này trả về một danh sách 4 phép quay

a: giao cho a

< tăng dần (tính toán hoán vị tăng dần)

* Đầu tiên

a@chỉ số avới điều đó


1

Japt -g, 6 byte

4Æ=zÃñ

Thử nó

           :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

-gcờ cần thiết? Sắp xếp có nghĩa là tất cả các phép quay ban đầu kết thúc với cùng một danh sách để danh sách đầy đủ sẽ hoạt động tốt như dấu vân tay trừ khi tôi thiếu thứ gì đó.
Kamil Drakari

@KamilDrakari, bạn cũng có thể đúng - như tôi đã nói, tôi không chắc là tôi hiểu đầy đủ về thử thách. Mặc dù vậy, không có hại khi để nó vào, tuy nhiên, nó không tốn bất kỳ byte nào.
Shaggy

@KamilDrakari: Điều đó là không cần thiết, nhưng nó cũng không có hại vì nó không được tính vào bytecount.
17/12/18

1

J , 16 byte

-2 byte nhờ Shaggy

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

Hãy thử trực tuyến!

J , 18 byte

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

Hãy thử trực tuyến!

Trả về mục đầu tiên trong danh sách các phép quay được sắp xếp theo từ vựng của polyomino.

Giải trình:

            ^:(<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 Cảm ơn!
Galen Ivanov

0

05AB1E , 10 8 byte

3FÂø})Σ˜

-2 byte nhờ @Shaggy .

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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)

LƯU Ý: Lấy mức tối thiểu bằng ßhoặc Wsẽ hoàn toàn làm phẳng, do đó sẽ xuất ra 0. Và sắp xếp với {dường như không hoạt động cho một danh sách ma trận, đó là lý do tại sao tôi sử dụng Σ˜thay thế.


1
@Shaggy Cảm ơn! :) Trong trường hợp đó, hai byte cuối cùng có thể được loại bỏ, vì }nó được thực hiện hoàn toàn nếu không có gì đến sau nó.
Kevin Cruijssen 17/12/18

1
Hôm nay tôi đã học được vài điều về 05AB1E! :) Nó giống nhau trong Japt.
Xù xì
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.