Bu açıkça görevin görevi için doğru dil. : ^ D
s:({c<L>}{c<R>}0[(<R> <L>)(<L> <R>)_?])%{30}
c:0 *$
Geçerli bir yılansa, tüm girişi eşleştirir; değilse eşleşemez. Burada dene!
açıklama
SnakeEx bir 2-B desen eşleştirme dilidir . Bir program, girdi eşleştirme karakterleri etrafında gezinen, yönleri değiştiren ve diğer yılanları yumurtlayan "yılanlar" için bir tanım listesinden oluşur. Programımızda iki yılan tanımlarız sve c.
Biz başlayacağız cdaha basit olduğu için. Tanımı, 0 *$eğer regex: eşleşirse 0, sıfır, ya da daha fazla boşluk, ardından ızgara kenarı izlerseniz, okunabilir olmalıdır . Burada ana yakalama: bu eşleşme herhangi bir yöne ilerleyebilir. Her sütunda cfazladan 0s olmadığını doğrulamak için yılandan yukarı ve aşağı doğru kullanacağız .
Şimdi ana yılan için s. Bu halini alır (...)%{30}kez her biri için - vasıta "parantez 30 kez içeriklerini eşleştirme", 0yılanda. Çok uzak çok iyi. Parantezin içine ne giriyor?
{c<L>}
Bu, yeni bir cyılan ortaya çıkardı , 90 derece sola döndü. Yön, syılanın yönüne göredir, bu nedenle yeni yılan, şebekenin üstüne doğru hareket eder (ana yılan sağa doğru hareket eder). cMevcut ızgara hücre, bir yılan kontrol 0yukarıda her hücrenin bir boşluk olduğu ve. Başarısız olursa, tüm maç başarısız olur. Eğer başarılı olursa, devam ediyoruz.
{c<R>}
aynı şeyi yapan, sadece sağa (ızgaraya doğru) döndü.
Bu yumurtların eşleştiricinin ana yılandaki konumunu etkilemediğine dikkat edin. Regex'te biraz görünüşlüler. (Belki burada onlara "bakıcılığımız" diyebiliriz?) Öyleyse, a'yı işaret ettiğimizi 0ve sütunun geri kalanında sadece boşluklar bulunduğunu doğruladıktan sonra , aslında 0:
0
Şimdi eşleşme işaretçisi, sağındaki karakterin üzerindedir 0. Üç farklı seçeneği kontrol etmemiz gerekiyor: yılan açıları aşağı, yılan açıları yukarı veya yılan düz gidiyor. Bunun için bir OR ifadesi kullanabiliriz:
[...]
Ameliyathanemizde üç olasılık var:
(<R> <L>)
Sağa dönün, bir boşluk eşleştirin ve tekrar sola dönün (yılan açıları aşağıya doğru).
(<L> <R>)
Sola dönün, bir boşluk eşleştirin ve tekrar sağa dönün (yılan açıları yukarı).
_?
Sıfır veya bir alt çizgi eşleştirin. Girişte alt çizgi olmadığından, bu her zaman boş bir eşleşme olur (yılan düz gider).
Yukarıdaki üç seçenekten birini eşleştirdikten sonra, eşleme işaretçisinin 0, parantez içindeki ifadeyi tekrar eşleştirmeye hazır olan sonraki sütunda göstermesi gerekir .