Belirli bir ızgara yapılandırmasının belirli bir tarifle eşleşip eşleşmediğini görmek, 3x3 ızgarasını bir dize olarak kodlarsanız ve normal ifade eşleşmesi kullanıyorsanız kolaydır . Aramayı hızlandırmak, sonunda konuşacağım farklı bir konudur. Daha fazla bilgi için okumaya devam edin.
Adım 1) Izgarayı String olarak kodla
Her bir hücreye bir karakter numarası verin ve her şeyi yan yana sıralayın:
123
456 => 123456789
789
Daha somut bir örnek olarak, W'nin ahşabın durduğu ve E'nin boş bir hücre olduğu (sadece boş bir char '' kullanabilirsiniz):
EEE
WEE => EEEWEEWEE
WEE
Adım 2) Normal İfadeyi Kullanarak Reçeteyi Eşleştir (veya String.Concon veri üzerinde biraz işlem yapar)
Yukarıdaki örnekten devam edersek, formasyonu hareket ettirsek bile, ipte hala bir desen vardır (her iki tarafta E tarafından doldurulmuş WEEW):
EEW
EEW => EEWEEWEEE
EEE
Bu yüzden, çubuğu nereye hareket ettirdiğiniz önemli değil, yine de aşağıdaki normal ifadeyle eşleşecektir: /^E*WEEWE*$/
Normal ifadeler ayrıca belirttiğiniz koşullu davranışı gerçekleştirmenize de izin verir. Mesela (tarifte hazırlanmış), aynı sonucu vermek için demir veya taştan yapılmış bir kazma istiyorsanız , yani:
III SSS
EWE or EWE
EWE EWE
Her ikisini de normal ifadede birleştirebilirsiniz: /^(III)|(SSS)EWEEWE$/
Yatay çeviriler de aynı şekilde kolayca eklenebilir (| operatörünü kullanarak).
Düzenleme: Neyse, regex kısmı kesinlikle gerekli değildir. Sorunu tek bir ifadeyle kapamanın yalnızca bir yolu Ancak değişken konum sorunu için, herhangi bir doldurma boşluğunun (veya bu örnekte E'nin) ızgara dizesini düzeltebilir ve bir String.Contains () yapabilirsiniz. Çoklu bileşen problemi veya aynalı tarifler için hepsini aynı çıktıya sahip çoklu (yani ayrı) tarifler olarak kullanabilirsiniz.
Adım 3) Arama hızlandırmak
Aramayı azaltmak için, tarifleri birlikte gruplamak ve aramaya yardımcı olmak için bazı veri yapıları oluşturmanız gerekecektir. Kılavuzun sicim olarak işlenmesi burada da bazı avantajlara sahiptir :
Bir tarifin "uzunluğunu", boş olmayan ilk karakter ile boş olmayan son karakter arasındaki mesafe olarak tanımlayabilirsiniz. Basit bir Trim().Length()
bilgi size bu bilgiyi verir. Yemek tarifleri uzunluğa göre gruplandırılmış ve bir sözlükte saklanmış olabilir.
veya
Alternatif bir "uzunluk" tanımı boş olmayan karakterlerin sayısı olabilir. Başka hiçbir şey değişmez. Siz de tarifleri bu kritere göre gruplandırabilirsiniz.
Eğer 1 numaralı nokta yeterli değilse, tarifler ayrıca tarifte görünen ilk bileşenin türüne göre de gruplandırılabilir. Bu yapmak kadar basit olabilir Trim().CharAt(0)
(ve Trim'e karşı boş bir dizgeyle sonuçlanan koruma).
Mesela tarifleri a:
Dictionary<int, Dictionary<char, List<string>>> _recipes;
Ve aramayı aşağıdaki gibi yapın:
// A string encode of your current grid configuration
string grid;
// Get length and first char in our grid
string trim = grid.Trim();
int length = trim.Length();
char firstChar = length==0 ? ' ' : trim[0];
foreach(string recipe in _recipes[length][firstChar])
{
// Check for a match with the recipe
if(Regex.Match(grid, recipe))
{
// We found a matching recipe, do something with it
}
}