Orijinal Çözüm: JavaScript - 261 255 228 227 179 153 Karakterler
/(\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'
Testine dize değişkeni olduğunu varsayarsak s
(bir işlev yapmak f
sonra ekleyin f=s=>
sonra yerini bir istem girdi almak, aksi takdirde, kod ya başlangıcına s
ile prompt()
).
Çıkışlar konsola gelir.
3 rd Çözüm: JavaScript (ECMAScript 6) - 178 Karakterler
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'
Aşağıdaki 2. çözümü aldım (belirli yapılandırmalardaki karakterleri kontrol etmek için düzenli ifadeler kullanır) ve düzenli ifadeler kullanmadan aynı yapılandırmalardaki özdeş karakterleri dizede kontrol etmek için yeniden çalıştım.
Baz-36 dizisi "2313ab1b8a2a78188h9haj9j8iaiir9r"
, yani çift - ofsetlerin çiftleri kontrol etmek veren 23
sonuçlar kontrol i ise inci karakter (i + 2) aynı olan inci karakter ve (i + 3) inci karakter (normal ifade eşdeğer (.).\1\1
- aynı olmayan karakterin yeni satır olmadığından emin olmak için bazı ek denetimlerle).
2 nd Çözüm: JavaScript (ECMAScript 6) - 204 Karakterler
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 dizesinden alınan değer çiftlerini kullanarak birden fazla normal ifade oluşturur (daha fazla ayrıntı için aşağıya bakın) 10907160789879h8
ve OR
tüm testleri alır. Daha da azaltmak için, normal ifadelerin birinin diğerinin "tersi" olduğu çiftler halinde geldiğini not edebilirsiniz (OP'nin hiç olmayacaklarını belirttiği için 3'lü satırda Normal İfadeleri yatay ve dikey olarak görmezden gelmek - bu testleri 0088
Base-18 dizesine ekte tekrar eklemek isterseniz ).
açıklama
Geçerli hamlelerin tüm olası yapılandırmalarını kapsayan 16 normal ifade ile başlayın:
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
];
( Not: 3-in-a-satır yatay (0 regexs th ) ve dikey olarak 9 (parça th ) bu eşleme girişleri mevcut asla OP durumları gibi dışındadır. )
Bunların her birinin girişe karşı test edilmesi, söz konusu yapılandırmanın geçerli bir hareketinin bulunup bulunamayacağını belirler.
Bununla birlikte, düzenli ifadeler bu 6'yı vermek için birleştirilebilir:
/(\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
Bunlar daha sonra tek bir normal ifadede birleştirilebilir:
/(\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/
Hangi sadece girişe karşı test edilmesi gerekiyor.
Test Durumları
Diğer kişilerin yararlı bulabileceği bazı test senaryoları (yalnızca 1-7 rakamlarını kullanma giriş formatına uymaz, ancak bu kolayca düzeltilebilir ve sadece 8x4 ızgaradır - çünkü bu, tüm geçerli girişlerin testi için minimumdur. ).
Girdi dizesinden, üstündeki 16 normal ifadenin eşleştiği bir harita biçiminde.
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
};
Düzenle 1
Değiştir \d
ile s .
- 6 karakter kazandırır.
Düzenle 2
Ek yakalamayan gruplar ve güncellenmiş geri referanslar (?:.|\n)
ile değiştirilir [\s\S]
ve kaldırılır ( m-buettner tarafından önerildiği gibi ) ve evet / hayır çıktısında eklenir.
Düzenle 3
- Bir Base-18 dizesinden tek tek Normal İfadeler oluşturmak için ECMAScript 6 çözümü eklendi.
- Testleri 3'lü sırada yatay olarak ( m-buettner tarafından önerildiği gibi ) kaldırdı .
Düzenle 4
Başka (daha kısa) bir çözüm ve eşleşmeyen iki test örneği daha eklendi.
Düzenleme 5
Düzenle 6