โซลูชันดั้งเดิม: JavaScript - 261 255 228 227 179 153 ตัวอักษร
/(\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'
สมมติว่าสตริงที่จะทดสอบอยู่ในตัวแปรs
(เพื่อให้เป็นฟังก์ชันf
แล้วเพิ่มf=s=>
ไปยังจุดเริ่มต้นของโค้ดหรือมิฉะนั้นเพื่อรับอินพุตจากพรอมต์จากนั้นแทนที่s
ด้วยprompt()
)
ผลลัพธ์คือคอนโซล
3 rdแก้ไข: JavaScript (ECMAScript 6) - 178 ตัวอักษร
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'
ผมเอา 2 ครั้งวิธีการแก้ปัญหาด้านล่าง (ซึ่งใช้การแสดงออกปกติเพื่อตรวจสอบตัวอักษรในการกำหนดค่าบางอย่าง) และนํามันเพียงแค่ตรวจสอบสตริงสำหรับตัวอักษรที่เหมือนกันในการกำหนดค่าเดียวกันโดยไม่ต้องใช้การแสดงผลปกติ
สตริง Base-36 "2313ab1b8a2a78188h9haj9j8iaiir9r"
ให้อ็อฟเซ็ตคู่เพื่อตรวจสอบ - เช่นคู่23
ส่งผลให้เกิดการตรวจสอบว่าตัวอักษรi thเหมือนกับอักขระ (i + 2) thและอักขระ (i + 3) th (เทียบเท่ากับนิพจน์ทั่วไป(.).\1\1
- ด้วยการตรวจสอบเพิ่มเติมบางอย่างเพื่อให้แน่ใจว่าอักขระที่ไม่เหมือนกันไม่ใช่บรรทัดใหม่)
2 ครั้งการแก้ไข: JavaScript (ECMAScript 6) - 204 ตัวอักษร
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'
สร้างการแสดงออกปกติหลายรายการ (ดูรายละเอียดเพิ่มเติมด้านล่าง) โดยใช้คู่ของค่าที่นำมาจากสตริง Base-18 10907160789879h8
และOR
ทำการทดสอบทั้งหมด หากต้องการลดให้มากขึ้นคุณสามารถทราบว่านิพจน์ทั่วไปมาเป็นคู่โดยที่หนึ่งคือ "ย้อนกลับ" ของอีกรายการหนึ่ง (ละเว้นนิพจน์ปกติสำหรับ 3-in-row ในแนวนอนและแนวตั้งเนื่องจากสถานะ OP จะไม่มีการนำเสนอ - หากคุณต้องการเพิ่มการทดสอบเหล่านั้นกลับมาในผนวก0088
เข้ากับสตริง Base-18)
คำอธิบาย
เริ่มต้นด้วยนิพจน์ทั่วไป 16 นิพจน์ที่ครอบคลุมการกำหนดค่าที่เป็นไปได้ทั้งหมดของการย้ายที่ถูกต้อง:
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
];
( หมายเหตุ: regexs สำหรับ 3-in-a-row ในแนวนอน (0 th ) และแนวตั้ง (ส่วนหนึ่งของ 9 th ) ไม่เกี่ยวข้องเนื่องจาก OP ระบุว่าอินพุตที่ตรงกับสิ่งเหล่านี้จะไม่ปรากฏ )
การทดสอบแต่ละรายการกับอินพุตจะเป็นตัวกำหนดว่าการย้ายที่ถูกต้องของการกำหนดค่านั้นสามารถพบได้
อย่างไรก็ตามสามารถรวมนิพจน์ทั่วไปเพื่อให้ 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
สิ่งเหล่านี้สามารถรวมกันเป็นนิพจน์ปกติเดียว:
/(\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/
ซึ่งเพียงแค่ต้องทดสอบกับอินพุต
กรณีทดสอบ
กรณีทดสอบบางรายการที่คนอื่นอาจพบว่ามีประโยชน์ (ไม่สอดคล้องกับรูปแบบการป้อนข้อมูลของการใช้ตัวเลข 1-7 เท่านั้น แต่สามารถแก้ไขได้อย่างง่ายดายและเป็นเพียงตาราง 8x4 - เนื่องจากเป็นค่าต่ำสุดที่จำเป็นสำหรับการทดสอบอินพุตที่ถูกต้องทั้งหมด )
ในรูปแบบของแผนที่จากสตริงอินพุตซึ่งมี 16 นิพจน์ปกติด้านบนที่ตรงกัน
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
};
แก้ไข 1
แทนที่\d
s ด้วย.
- บันทึก 6 ตัวอักษร
แก้ไข 2
แทนที่(?:.|\n)
ด้วย[\s\S]
และลบกลุ่มที่ไม่ได้ดักจับและลบการอ้างอิงกลับที่อัปเดต (แนะนำโดยm-buettner ) และเพิ่มในเอาต์พุตใช่ / ไม่ใช่
แก้ไข 3
- เพิ่มโซลูชัน ECMAScript 6 เพื่อสร้างนิพจน์ปกติแต่ละรายการจากสตริง Base-18
- ลบการทดสอบสำหรับ 3-in-a-row ในแนวนอน (ตามที่m-buettner แนะนำ )
แก้ไข 4
เพิ่มโซลูชันอื่น (สั้นกว่า) และอีกสองกรณีทดสอบที่ไม่ตรงกัน
แก้ไข 5
- โซลูชันดั้งเดิมแบบย่อโดยแทนที่บรรทัดใหม่ด้วยอักขระที่ไม่ใช่ตัวเลข (ตามที่แนะนำโดยVadimR )
แก้ไข 6
- โซลูชันดั้งเดิมที่สั้นลงโดยรวมบิตของนิพจน์ทั่วไป (ตามที่แนะนำโดยVadimR )