Tìm ra mô hình khóa Android


26

Hãy nói rằng bạn đã thấy bạn của mình nhập mật khẩu của họ vào điện thoại Android của họ. Bạn không nhớ họ đã tạo ra mẫu như thế nào nhưng bạn nhớ mẫu đó trông như thế nào. Là người bạn quan tâm mà bạn muốn biết mật khẩu của họ an toàn đến mức nào. Công việc của bạn là tính toán tất cả các cách mà một mẫu cụ thể có thể được thực hiện.

Cách thức hoạt động của các mẫu Android

Các mẫu được vẽ trên lưới 3x3 của các nút. Trong một mẫu người ta truy cập một loạt các nút mà không bao giờ nhấc ngón tay khỏi màn hình. Mỗi nút họ truy cập được kết nối với nút trước đó bằng một cạnh. Có hai quy tắc cần ghi nhớ.

  • Bạn không thể truy cập bất kỳ một nút nào nhiều lần

  • Một cạnh có thể không đi qua một nút không mong muốn

Lưu ý rằng, mặc dù thường rất khó thực hiện và do đó không phổ biến lắm trong các kết hợp khóa Android thực sự, có thể di chuyển như một Hiệp sĩ . Đó là, có thể di chuyển từ một bên đến một góc không liền kề hoặc cách khác xung quanh. Dưới đây là hai ví dụ về các mẫu sử dụng một động thái như vậy:

Đây là một Gif hoạt hình của nó đang được thực hiện.

Giải quyết một mô hình

Một mô hình điển hình có thể trông giống như thế này:

Với một mẫu đơn giản như thế này, có hai cách để vẽ mẫu. Bạn có thể bắt đầu ở một trong hai đầu lỏng lẻo và đi qua các nút được tô sáng đến nút kia. Mặc dù điều này đúng với nhiều mẫu đặc biệt là các mẫu mà con người thường sử dụng nhưng điều này không đúng với tất cả các mẫu.

Hãy xem xét các mẫu sau:

Có hai giải pháp có thể nhận ra ngay lập tức. Một bắt đầu ở phía trên bên trái:

Và một bắt đầu ở trung tâm dưới cùng:

Tuy nhiên, vì một dòng được phép đi qua một điểm khi nó đã được chọn, có một mẫu bổ sung bắt đầu ở giữa trên cùng:

Mẫu cụ thể này có 3 giải pháp nhưng mẫu có thể có bất kỳ chỗ nào giữa 1 và 4 giải pháp [cần dẫn nguồn] .

Dưới đây là một số ví dụ về mỗi:

1.

2.

3.

4.

Tôi / O

Một nút có thể được biểu diễn dưới dạng các số nguyên từ 0 đến 9, bao gồm các chuỗi tương đương hoặc các ký tự từ a đến i (hoặc A đến I). Mỗi nút phải có một đại diện duy nhất từ ​​một trong các bộ này.

Một giải pháp sẽ được đại diện bởi một thùng chứa có thứ tự chứa các biểu diễn nút. Các nút phải được sắp xếp theo thứ tự mà chúng được truyền qua.

Một mẫu sẽ được đại diện bởi một thùng chứa các cặp nút không có thứ tự. Mỗi cặp đại diện cho một cạnh bắt đầu kết nối hai điểm trong cặp. Mô hình đại diện không phải là duy nhất.

Bạn sẽ lấy một biểu diễn mẫu làm đầu vào thông qua các phương thức nhập chuẩn và xuất tất cả các giải pháp có thể tạo ra cùng một mẫu thông qua các phương thức đầu ra tiêu chuẩn.

Bạn có thể giả sử mỗi đầu vào sẽ có ít nhất một giải pháp và sẽ kết nối ít nhất 4 nút.

Bạn có thể chọn sử dụng một container được đặt hàng thay cho một container không có thứ tự, nếu bạn rất muốn hoặc bị buộc phải lựa chọn ngôn ngữ.

Các trường hợp thử nghiệm

Với các nút được sắp xếp theo mẫu sau:

0 1 2
3 4 5
6 7 8

Hãy {...}là một container không có thứ tự, [...]là một container được đặt hàng và (...)là một cặp.

Các đầu vào và đầu ra sau phải khớp

{(1,4),(3,5),(5,8)} -> {[1,4,3,5,8]}
{(1,4),(3,4),(5,4),(8,5)} -> {[1,4,3,5,8]}
{(0,4),(4,5),(5,8),(7,8)} -> {[0,4,5,8,7],[7,8,5,4,0]}
{(0,2),(2,4),(4,7)} -> {[0,1,2,4,7],[1,0,2,4,7],[7,4,2,1,0]}
{(0,2),(2,6),(6,8)} -> {[0,1,2,4,6,7,8],[1,0,2,4,6,7,8],[8,7,6,4,2,1,0],[7,8,6,4,2,1,0]}
{(2,3),(3,7),(7,8)} -> {[2,3,7,8],[8,7,3,2]}
{(0,7),(1,2),(1,4),(2,7)} -> {[0,7,2,1,4],[4,1,2,7,0]}
{(0,4),(0,7),(1,3),(2,6),(2,8),(3,4),(5,7)} -> {[1,3,4,0,7,5,8,2,6]}
{(1,3),(5,8)} -> {}

Một album imgur của tất cả các trường hợp thử nghiệm như hình ảnh có thể được tìm thấy ở đây . Các mẫu là trong các giải pháp màu xanh trong màu đỏ.

Chấm điểm

Đây là mã golf. Ít byte nhất sẽ thắng.


1
Câu hỏi hay, tôi thường tự hỏi tương tự ở riêng. :)
ThreeFx

Bạn sẽ trả lời câu hỏi này trong brainflak? Bây giờ sẽ là ấn tượng. : P
DJMcMayhem

Đó là một mô hình mà chỉ có thể được giải quyết một cách? Tôi nghĩ rằng bạn có ít nhất 2 chỉ bằng cách đảo ngược các mũi tên.
ThreeFx

@DJMcMayhem Tôi sẽ thử nhưng tôi không thể thực hiện bất kỳ lời hứa nào
Thuật sĩ lúa mì

@ThreeFx Hãy thử cái này cho chính mình. Bởi vì bạn không thể dừng lại ở một nút đã được truy cập nhưng bạn có thể chuyển qua một mẫu có thể được định hướng.
Thuật sĩ lúa mì

Câu trả lời:


3

Python 2.7, 493 430 byte

exec("L=['012','345','678','036','147','258','048','246'];L+=[i[::-1]IL];S=sorted;F=lambda t:''.join(str(i)It)\ndef N(x):\n s=' '.join(F(S(i))Ix)\nIL:s=s.replace(i[::2],i[:2]+' '+i[1:])\n return S(set(s.split()))\ndef P(s):\n e=0\nIL:e|=-1<s.find(i[::2])<s.find(i[1])\n return[zip(s[:-1],s[1:]),L][e]\nx=N(input());print[F(i)I__import__('itertools').permutations({iI`x`if i.isdigit()})if x==N(P(F(i)))]".replace('I',' for i in '))

Phiên bản một dòng kết thúc chương trình với exec("...".replace('I',' for i in '))tất cả các vòng lặp và trình tạo có thể được rút ngắn bằng một lần duy nhất Ivà tiết kiệm 15 byte so với phiên bản dễ đọc hơn này:

L=['012','345','678','036','147','258','048','246'];L+=[i[::-1]for i in L]
S=sorted;F=lambda t:''.join(str(i)for i in t)
def N(x):
 s=' '.join(F(S(i))for i in x)
 for i in L:s=s.replace(i[::2],i[:2]+' '+i[1:])
 return S(set(s.split()))
def P(s):
 e=0
 for i in L:e|=-1<s.find(i[::2])<s.find(i[1])
 return[zip(s[:-1],s[1:]),L][e]
x=N(input())
print[F(i)for i in __import__('itertools').permutations({i for i in`x`if i.isdigit()})if x==N(P(F(i)))]

Chương trình lấy đầu vào theo cách hiển thị (ví dụ {(1,4),(3,4),(5,4),(8,5)}) hoặc dưới dạng danh sách chuỗi (ví dụ ['14','34','54','85']) (hoặc ở các định dạng thân thiện với python khác) và trả về đầu ra dưới dạng danh sách các chuỗi. Vì vậy, về mặt kỹ thuật, chúng tôi có một container chứa các container được đặt hàng.

Hàm Nbình thường hóa một mẫu để có thể dễ dàng so sánh hai mẫu. Chuẩn hóa sắp xếp các cặp biểu thị các cạnh (vì vậy '02'thay vì '20'), sử dụng thay thế chuỗi để mở rộng các cạnh kép (ví dụ: '02'trở thành '01 12'), chia các cạnh thành một tập hợp để loại bỏ trùng lặp và sắp xếp kết quả.

Hàm này Flàm phẳng các bộ dữ liệu ints / chuỗi thành chuỗi, vì vậy chúng ta có thể chuẩn hóa các đường dẫn được tạo theo các cách khác nhau.

Danh sách Lchứa tất cả các dòng trên màn hình.

Sau đó, chúng tôi lấy từng hoán vị của tất cả các chữ số trong mẫu đã chuẩn hóa và tính toán một đường dẫn hợp lệ hoặc Lnếu không hợp lệ (không bao giờ bình thường hóa thành danh sách các cặp như đường dẫn thực) hoặc danh sách các cặp chỉ ra các nút thứ tự được truy cập nếu hợp lệ. Nếu điều này bình thường hóa theo cùng một mẫu thì chúng ta có một giải pháp hợp lệ và đưa nó vào danh sách cuối cùng.

Vui lòng cung chính cần thiết để xác nhận một hoán vị như là một chuỗi s-1<s.find(i[::2])<s.find(i[1]), trong đó phát hiện một lỗi với một dòng i. Ví dụ với dòng '210'mã sẽ phát hiện lỗi nếu '20'xảy ra (nghĩa là chỉ số của nó lớn hơn -1) và '1'xảy ra sau nó. Chúng ta không phải lo lắng về việc 1 không xảy ra vì 1 sẽ xuất hiện trong mẫu đã chuẩn hóa khi không có trong đầu vào.


LƯU Ý: Tôi biết thay thế str(i)for i in t bằng map(str,t) {i for i in`x`if i.isdigit()} bằng set('012345678')&set(`x`) sẽ làm cho mã gốc ngắn hơn, nhưng điều này vẫn sẽ dài hơn một chút so với thay thế I .


2
Falsecó thể 1<0và có một khoảng trắng vô dụng tại F(i) for. +1.
Yytsi

@TuukkaX Cảm ơn, tôi tái mặt khi thấy tôi rời đi False.
Linus

['012','345','678','036','147','258','048','246']có thể '012 345 678 036 147 258 048 246'.split()'cho -1 byte.
Ông Xcoder
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.