Giải pháp gốc: JavaScript - 261 255 228 227 179 153 Ký tự
/(\d)(\1(\d|.{6}|.{9})|(\d|.{6}|.{9})\1|.{7}\1(.|.{9})|(.|.{9})\1.{7}|(.{7,9}|.{17})\1.{8}|.{8}\1(.{7,9}|.{17}))\1/.test(s.replace(/\n/g,'A'))?'yes':'no'
Giả sử rằng chuỗi cần kiểm tra nằm trong biến s
(để biến nó thành hàm f
sau đó thêm f=s=>
vào phần đầu của mã hoặc, nếu không, để lấy đầu vào từ một dấu nhắc sau đó thay thế s
bằng prompt()
).
Đầu ra là vào bàn điều khiển.
Giải pháp thứ 3 : JavaScript (ECMAScript 6) - 178 ký tự
p=x=>parseInt(x,36);for(t="2313ab1b8a2a78188h9haj9j8iaiir9r",i=v=0;s[i];i++)for(j=0;t[j];v|=s[i]==s[i+a]&s[i]==s[i+b]&i%9<8&(b>3|(i+b-a)%9<8))a=p(t[j++]),b=p(t[j++]);v?'yes':'no'
Tôi đã lấy giải pháp thứ 2 , bên dưới, (sử dụng các biểu thức thông thường để kiểm tra các ký tự trong các cấu hình nhất định) và làm lại nó để chỉ kiểm tra chuỗi cho các ký tự giống hệt nhau trong cùng cấu hình mà không sử dụng các biểu thức thông thường.
Chuỗi Base-36 "2313ab1b8a2a78188h9haj9j8iaiir9r"
mang đến cho các cặp offsets để kiểm tra - tức là cặp 23
kết quả trong việc kiểm tra nếu tôi thứ nhân vật giống với (i + 2) thứ nhân vật và (i + 3) lần thứ ký tự (tương đương với biểu thức chính quy(.).\1\1
- với một số kiểm tra bổ sung để đảm bảo rằng ký tự không giống nhau không phải là một dòng mới).
2 nd Giải pháp: JavaScript (ECMAScript 6) - 204 Nhân vật
p=x=>parseInt(x,18);g=a=>a?a>1?"(.|\\n){"+a+"}":".":"";f=(x,a,b)=>RegExp("(.)"+g(a)+"\\1"+g(b)+"\\1").test(x);for(t="10907160789879h8",i=v=0;t[i];v|=f(s,x,y)||f(s,y,x))x=p(t[i++]),y=p(t[i++]);v?'yes':'no'
Xây dựng nhiều biểu thức chính quy (xem bên dưới để biết thêm chi tiết) bằng cách sử dụng các cặp giá trị được lấy từ chuỗi Base-18 10907160789879h8
và thực hiện OR
tất cả các bài kiểm tra. Để giảm thêm, bạn có thể lưu ý rằng các biểu thức chính quy đi theo cặp trong đó một biểu thức là "đảo ngược" của biểu thức khác (bỏ qua Biểu thức chính quy cho 3 hàng liên tiếp theo chiều ngang và chiều dọc như trạng thái OP sẽ không bao giờ xuất hiện - nếu bạn muốn thêm các thử nghiệm đó trở lại trong phần bổ sung 0088
vào chuỗi Base-18).
Giải trình
Bắt đầu với 16 biểu thức chính quy bao gồm tất cả các cấu hình có thể có của các bước di chuyển hợp lệ:
REs=[
/(\d)\1\1/, // 3-in-a-row horizontally
/(\d).\1\1/, // 3-in-a-row horizontally after left-most shifts right
/(\d)\1.\1/, // 3-in-a-row horizontally after right-most shifts left
/(\d)(?:.|\n){9}\1\1/, // 3-in-a-row horizontally after left-most shifts down
/(\d)(?:.|\n){7}\1.\1/, // 3-in-a-row horizontally after middle shifts down
/(\d)(?:.|\n){6}\1\1/, // 3-in-a-row horizontally after right-most shifts down
/(\d)\1(?:.|\n){6}\1/, // 3-in-a-row horizontally after left-most shifts up
/(\d).\1(?:.|\n){7}\1/, // 3-in-a-row horizontally after middle shifts up
/(\d)\1(?:.|\n){9}\1/, // 3-in-a-row horizontally after right-most shifts up
/(\d)(?:.|\n){7,9}\1(?:.|\n){8}\1/, // 3-in-a-row vertically (with optional top shifting left or right)
/(\d)(?:.|\n){7}\1(?:.|\n){9}\1/, // 3-in-a-row vertically after middle shifts right
/(\d)(?:.|\n){9}\1(?:.|\n){7}\1/, // 3-in-a-row vertically after middle shifts left
/(\d)(?:.|\n){8}\1(?:.|\n){7}\1/, // 3-in-a-row vertically after bottom shifts right
/(\d)(?:.|\n){8}\1(?:.|\n){9}\1/, // 3-in-a-row vertically after bottom shifts left
/(\d)(?:.|\n){17}\1(?:.|\n){8}\1/, // 3-in-a-row vertically after top shifts down
/(\d)(?:.|\n){8}\1(?:.|\n){17}\1/, // 3-in-a-row vertically after bottom shifts up
];
( Lưu ý: các regexs cho 3 trong một hàng ngang (0 ngày ) và theo chiều dọc (một phần của 9 ngày ) không liên quan như các tiểu bang OP mà đầu vào phù hợp với những sẽ không bao giờ có mặt. )
Việc kiểm tra từng cái dựa trên đầu vào sẽ xác định xem có thể tìm thấy di chuyển hợp lệ của cấu hình đó hay không.
Tuy nhiên, các biểu thức chính quy có thể được kết hợp để đưa ra 6:
/(\d)(?:.|(?:.|\n){9}|(?:.|\n){6})?\1\1/ // Tests 0,1,3,5
/(\d)\1(?:.|(?:.|\n){9}|(?:.|\n){6})?\1/ // Tests 0,2,6,8
/(\d)(?:.|\n){7}\1(?:.|(?:.|\n){9})\1/ // Tests 4,10
/(\d)(?:.|(?:.|\n){9})\1(?:.|\n){7}\1/ // Tests 7,11
/(\d)(?:(?:.|\n){7,9}|(?:.|\n){17})\1(?:.|\n){8}\1/ // Tests 9,14
/(\d)(?:.|\n){8}\1(?:(?:.|\n){7,9}|(?:.|\n){17})\1/ // Tests 9a,12,13,15
Chúng sau đó có thể được kết hợp thành một biểu thức chính quy duy nhất:
/(\d)(?:.|(?:.|\n){9}|(?:.|\n){6})?\1\1|(\d)\2(?:.|(?:.|\n){9}|(?:.|\n){6})?\2|(\d)(?:.|\n){7}\3(?:.|(?:.|\n){9})\3|(\d)(?:.|(?:.|\n){9})\4(?:.|\n){7}\4|(\d)(?:(?:.|\n){7,9}|(?:.|\n){17})\5(?:.|\n){8}\5|(\d)(?:.|\n){8}\6(?:(?:.|\n){7,9}|(?:.|\n){17})\6/
Mà chỉ cần được kiểm tra đối với đầu vào.
Các trường hợp thử nghiệm
Một số trường hợp thử nghiệm mà người khác có thể thấy hữu ích (không tuân thủ định dạng đầu vào chỉ sử dụng các chữ số 1-7 nhưng điều đó dễ dàng sửa chữa và chỉ là lưới 8x4 - vì đó là yêu cầu tối thiểu để kiểm tra tất cả các đầu vào hợp lệ ).
Trong định dạng của bản đồ từ chuỗi đầu vào tới 16 biểu thức chính quy ở trên phù hợp.
Tests={
"12345678\n34567812\n56781234\n78123456": -1, // No Match
"12345678\n34969912\n56781234\n78123456": 1, // 3-in-a-row horizontally after left-most shifts right
"12345678\n34567812\n59989234\n78123456": 2, // 3-in-a-row horizontally after right-most shifts left
"12345978\n34567899\n56781234\n78123456": 3, // 3-in-a-row horizontally after left-most shifts down
"12345978\n34569892\n56781234\n78123456": 4, // 3-in-a-row horizontally after middle shifts down
"12345678\n34967812\n99781234\n78123456": 5, // 3-in-a-row horizontally after right-most shifts down
"12399678\n34967812\n56781234\n78123456": 6, // 3-in-a-row horizontally after left-most shifts up
"12345678\n34597912\n56789234\n78123456": 7, // 3-in-a-row horizontally after middle shifts up
"12345998\n34567819\n56781234\n78123456": 8, // 3-in-a-row horizontally after right-most shifts up
"12945678\n34597812\n56791234\n78123456": 9, // 3-in-a-row vertically after top shifts right
"12349678\n34597812\n56791234\n78123456": 9, // 3-in-a-row vertically after top shifts left
"12345978\n34569812\n56781934\n78123456": 10, // 3-in-a-row vertically after middle shifts right
"92345678\n39567812\n96781234\n78123456": 11, // 3-in-a-row vertically after middle shifts left
"12945678\n34967812\n59781234\n78123456": 12, // 3-in-a-row vertically after bottom shifts right
"12349678\n34569812\n56781934\n78123456": 13, // 3-in-a-row vertically after bottom shifts left
"12395678\n34567812\n56791234\n78193456": 14, // 3-in-a-row vertically after top shifts down
"12345698\n34567892\n56781234\n78123496": 15, // 3-in-a-row vertically after bottom shifts up
"12345678\n34567899\n96781234\n78123456": -1, // No match - Matches (.)\1.\1 but not 3 in a row
"12345679\n99567812\n56781234\n78123456": -1, // No match - Matches (.).\1\1 but not 3 in a row
};
Chỉnh sửa 1
Thay \d
s bằng .
- lưu 6 ký tự.
Chỉnh sửa 2
Thay thế (?:.|\n)
bằng [\s\S]
và loại bỏ nhóm phi chụp thêm và tham khảo lại được cập nhật (theo đề nghị của m-Buettner ) và được thêm vào trong có / không có đầu ra.
Chỉnh sửa 3
- Đã thêm giải pháp ECMAScript 6 để xây dựng các Biểu thức chính quy riêng lẻ từ chuỗi Base-18.
- Đã xóa các bài kiểm tra cho 3 hàng liên tiếp theo chiều ngang (như được đề xuất bởi m-buettner ).
Chỉnh sửa 4
Đã thêm một giải pháp (ngắn hơn) và hai trường hợp kiểm tra không phù hợp hơn.
Chỉnh sửa 5
- Rút ngắn giải pháp ban đầu bằng cách thay thế các dòng mới bằng một ký tự không phải là số (như được đề xuất bởi VadimR ).
Chỉnh sửa 6
- Rút ngắn giải pháp ban đầu bằng cách kết hợp các bit của biểu thức chính quy (như được đề xuất bởi VadimR ).