-2 vì chúng tôi không còn cần phải xử lý danh sách trống
-1 chuyển từ tham gia, j@
sang ghép nối, ;
(mục bị bỏ lỡ không cần phải gặp ở giữa đối với phương thức được sử dụng, khi bắt đầu bộ ba là ổn )
-2 chuyển từ P¬aSH
đến oSH
(OK để có hai kết quả vì chúng ta san bằng, một nửa 1
là 0.5
được lọc ra dù sao, và có nhiều kết quả tương đương đã không ảnh hưởng đến các phương pháp sử dụng một trong hai)
-1 Nhờ ông Xcoder (0-lập chỉ mục đầu vào được cho phép)
d3ZIỊoSH;µƝFf9Ḷ¤Q⁼
Một liên kết đơn âm lấy danh sách các số nguyên trong [0,8]
và trả về giá trị trung thực ( 1
) nếu hợp pháp và giá trị falsey ( 0
) nếu không.
Hãy thử trực tuyến! hoặc xem một bộ thử nghiệm .
Làm sao?
Nhìn vào từng cặp nút 0 chỉ mục liền kề trong danh sách đầu vào. Nếu phép chia số nguyên cho ba trong số hai khác nhau cho 2 thì chúng nằm ở hàng trên cùng và dưới cùng, nếu modulo bằng ba trong số hai khác nhau thì chúng nằm ở cột bên trái và bên phải. Tổng của các cặp như vậy chia cho hai là nút giữa được lập chỉ mục 0 của một dòng ba nút hoặc giá trị không nguyên - vì vậy các giá trị này trước tiên được chèn vào trước cặp 0 được lập chỉ mục và sau đó bất kỳ các nút không có thật (như 0.5
hoặc3.5
) được xóa, danh sách kết quả của danh sách được làm phẳng và sau đó được sao chép lại (để mang lại các mục duy nhất, được bảo toàn theo thứ tự) và cuối cùng được so sánh với đầu vào - đối với một lần vuốt hợp pháp, tất cả những điều này sẽ trở thành không có trong khi bất hợp pháp những cái sẽ thêm các nút giữa bị thiếu và / hoặc loại bỏ các nút trùng lặp (lưu ý rằng không có vỏ đặc biệt nào được yêu cầu cho danh sách đầu vào có độ dài 1 vì nó không có cặp liền kề):
d3ZIỊoSH;µƝFf9Ḷ¤Q⁼ - left input is a list of integers e.g. [3,4,7,1,2,8,3]
µƝ - perform the chain to the left for adjacent pairs:
- e.g. for [a,b] in: [3,4] [4,7] [7,1] [1,2] [2,8] [8,3]
d3 - divmod by 3 [[1,0],[1,1]] [[1,1],[2,1]] [[2,1],[0,1]] [[0,1],[0,2]] [[0,2],[2,2]] [[2,2],[1,0]]
Z - transpose [[1,1],[0,1]] [[1,2],[1,1]] [[2,0],[1,1]] [[0,0],[1,2]] [[0,2],[2,2]] [[2,1],[2,0]]
I - differences [0,1] [1,0] [-2,0] [0,1] [2,0] [-1,-2]
Ị - abs(v)<=1 [1,1] [1,1] [0,1] [1,1] [0,1] [1,0]
S - sum (of [a,b]) 7 11 8 3 10 11
o - OR (vectorises) [1,1] [1,1] [8,1] [1,1] [10,1] [1,11]
H - halve (vectorises) [0.5,0.5] [0.5,0.5] [4,0.5] [0.5,0.5] [5,0.5] [0.5,5.5]
; - concatenate [0.5,0.5,3,4] [0.5,0.5,4,7] [4,0.5,7,1] [0.5,0.5,1,2] [5,0.5,2,8] [0.5,5.5,8,3]
F - flatten [0.5,0.5,3,4, 0.5,0.5,4,7, 4,0.5,7,1, 0.5,0.5,1,2, 5,0.5,2,8, 0.5,5.5,8,3]
¤ - nilad followed by link(s) as a nilad:
9 - literal nine
Ḷ - lowered range = [0,1,2,3,4,5,6,7,8]
f - filter keep [ 3,4, 4,7, 4, 7,1, 1,2, 5, 2,8, ,8,3]
Q - deduplicate [3,4,7,1,2,5,8]
⁼ - equal to the input? e.g. 0 (here because 5 was introduced AND because 3 was removed from the right)
Phương pháp trước
Thạch , 36 35 byte
9s3;Z$;“Æ7a‘DZ¤;U$;©0m€2iị®oµƝFQ⁼ȧȦ
Hãy thử trực tuyến! hoặc xem một bộ thử nghiệm .
Làm sao?
Tương tự như trên nhưng xây dựng tất cả các khả năng ba nút và thực hiện tra cứu (thay vì kiểm tra khi nó sử dụng divmod để kiểm tra và giảm một nửa tổng cho nút giữa).
Đầu tiên là việc xây dựng danh sách ba nút-dòng:
9s3;Z$;“Æ7a‘DZ¤;U$;©0
9s3 - nine (implicit range) split into threes = [[1,2,3],[4,5,6],[7,8,9]]
$ - last two links as a monad:
Z - transpose = [[1,4,7],[2,5,8],[6,7,9]]
; - concatenate = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9]]
¤ - nilad followed by link(s) as a nilad:
“Æ7a‘ - code-page index list = [13,55,97]
D - decimal (vectorises) = [[1,3],[5,5],[9,7]]
Z - transpose = [[1,5,9],[3,5,7]]
; - concatenate = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]
$ - last two links as a monad:
U - upend = [[3,2,1],[6,5,4],[9,8,7],[7,4,1],[8,5,2],[9,6,3],[9,5,1],[7,5,3]]
; - concatenate = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7],[3,2,1],[6,5,4],[9,8,7],[7,4,1],[8,5,2],[9,6,3],[9,5,1],[7,5,3]]
0 - literal zero (to cater for non-matches in the main link since ị, index into, is 1-based and modular the 0th index is the rightmost)
; - concatenate = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7],[3,2,1],[6,5,4],[9,8,7],[7,4,1],[8,5,2],[9,6,3],[9,5,1],[7,5,3],0]
© - copy the result to the register
Bây giờ việc ra quyết định:
...m€2iị®oµƝFQ⁼ȧȦ - left input is a list of integers e.g. [4,5,8,2,3,9,4]
µƝ - perform the chain to the left for adjacent pairs:
- i.e. for [a,b] in [[4,5],[5,8],[8,2],[2,3],[3,9],[9,4]]
... - perform the code described above = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7],[3,2,1],[6,5,4],[9,8,7],[7,4,1],[8,5,2],[9,6,3],[9,5,1],[7,5,3],0]
m€2 - modulo-2 slice €ach = [[1,3],[4,6],[3,9],[1,7],[2,8],[6,9],[1,9],[3,7],[3,1],[6,4],[9,7],[7,1],[8,2],[9,3],[9,1],[7,3],[0]]
i - index of [a,b] in that (or 0 if not there) e.g. [0,0,13,0,6,0]
® - recall from register = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7],[3,2,1],[6,5,4],[9,8,7],[7,4,1],[8,5,2],[9,6,3],[9,5,1],[7,5,3],0]
ị - index into (1-based & modular) e.g. [0,0,[8,5,2],0,[3,6,9],0]
o - OR [a,b] e.g. [[4,5],[5,8],[8,5,2],[2,3],[3,6,9],[9,4]]
F - flatten e.g. [4,5,5,8,8,5,2,2,3,3,6,9,9,4]
Q - deduplicate e.g. [4,5,8,2,3,6,9]
⁼ - equal to the input? e.g. 0 (here because 6 was introduced AND because 4 was removed from the right)
Ȧ - any and all? (0 if input is empty [or contains a falsey value when flattened - no such input], 1 otherwise)
ȧ - AND (to force an empty input to evaluate as 1 AND 0 = 0)