JavaScript (ES6), 83 ... 74 73 byte
Đưa đầu vào dưới dạng một chuỗi.
n=>1/([a,b,c]=[...n].map(v=>--v+v/3|0))||45242>>(a^b)&(~c&&n<99|b*2==a+c)
Đã lưu 3 byte nhờ vào ETHproductions
Làm thế nào nó hoạt động
Chúng tôi biến đổi bàn phím số bằng cách áp dụng một phần bù cho mỗi chữ số theo hàng mà nó thuộc về:
- +1 cho hàng trên cùng
- 0 cho hàng giữa
- -1 cho hàng dưới cùng.
Tất cả các mã dưới đây được thể hiện dưới dạng thập lục phân.
7 8 9 8 9 A (+1)
4 5 6 => 4 5 6 (unchanged)
1 2 3 0 1 2 (-1)
Hãy xem xét tất cả các kết hợp XOR của các mã khóa mới này. Các phím liền kề được tô sáng bằng dấu ngoặc.
XOR| 0 1 2 4 5 6 8 9 A
---+------------------------------------
0 | 0 [1] 2 [4] [5] 6 8 9 A
1 | [1] 0 [3] [5] [4] [7] 9 8 B
2 | 2 [3] 0 6 [7] [4] A B 8
4 | [4] [5] 6 0 [1] 2 [C] [D] E
5 | [5] [4] [7] [1] 0 [3] [D] [C] [F]
6 | 6 [7] [4] 2 [3] 0 E [F] [C]
8 | 8 9 A [C] [D] E 0 [1] 2
9 | 9 8 B [D] [C] [F] [1] 0 [3]
A | A B 8 E [F] [C] 2 [3] 0
Chúng ta có thể thấy rằng hai khóa liền kề nhau khi và chỉ khi XOR mã của chúng dẫn đến một trong các giá trị sau:
1, 3, 4, 5, 7, C, D, F
Danh sách này có thể được đóng gói vào mặt nạ nhị phân sau:
FEDCBA9876543210
----------------
0b1011000010111010 = 0xB0BA = 45242
Do đó, kiểm tra để xác định xem hai mã khóa (a, b) có tương ứng với hai khóa liền kề hay không:
45242 >> (a ^ b) & 1
Đối với ba mã khóa (a, b, c), chúng tôi cần thử nghiệm bổ sung này:
b * 2 == a + c
Thí dụ:
a = 0xA
b = 0x6
c = 0x2
0xB0BA >> (0xA ^ 0x6) & 1 == 0xB0BA >> 0xC & 1 == 1
=> 0xA and 0x6 are contiguous key codes
0x6 * 2 == 0xA + 0x2
=> 0xA, 0x6 and 0x2 are contiguous key codes on the same row, column or diagonal
Bản giới thiệu
Đoạn mã này đưa ra danh sách các giá trị trung thực.
let f =
n=>1/([a,b,c]=[...n].map(v=>--v+v/3|0))||45242>>(a^b)&(~c&&n<99|b*2==a+c)
console.log([...Array(1000).keys()].filter(n=>n && f(n+'')).join(' '))