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 s
ve c
.
Biz başlayacağız c
daha 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 c
fazladan 0
s 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", 0
yılanda. Çok uzak çok iyi. Parantezin içine ne giriyor?
{c<L>}
Bu, yeni bir c
yılan ortaya çıkardı , 90 derece sola döndü. Yön, s
yı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). c
Mevcut ızgara hücre, bir yılan kontrol 0
yukarı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 0
ve 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 .