Perl 5 , -p0
105 101 96 93 90 89 bayt
Girdi b
yerine kullanır 1
.
STDIN üzerindeki matrisin bir satırsonu ile sonlandığından emin olun
#!/usr/bin/perl -p0
s%b%$_="$`z$'";s:|.:/
/>s#(\pL)(.{@{-}}|)(?!\1)(\pL)#$&|a.$2.a#se&&y/{c/z />0:seg&/\B/%eg
Çevrimiçi deneyin!
3 ikame seviyesi kullanır!
Bu 87 baytlık sürümün hem giriş hem de çıkış biçiminde yorumlanması daha kolaydır, ancak çıkışta 3 farklı karakter kullandığından rekabet etmez:
#!/usr/bin/perl -0p
s%b%$_="$`z$'";s:|.:/
/>s#(\w)(.{@{-}}|)(?!\1)(\w)#$&|a.$2.a#se&&y/{c/z />0:seg&/\B/%eg
Çevrimiçi deneyin!
s
Satır sonlandırıcı olarak farklı bir (alfasayısal olmayan) karakter (satırsonu yerine) kullanarak başka bir bayt (regex değiştirici) her iki sürümde kaydetmek kolaydır , ancak bu giriş tekrar okunamaz hale gelir.
Nasıl çalışır
Değişikliği düşünün
s#(\w)(.{columns}|)(?!1)(\w)#c$2c#s
Bu, yatay ve dikey olarak farklı ve yan yana olan iki harfi bularak yerini alacaktır c
. Yolları tamamen b
harflerden oluşan bir labirentte, harfler aynı olduğu için hiçbir şey olmayacaktır, ancak harflerden biri diğeriyle değiştirilir değiştirilmez (örn. z
) Bu harf ve bir komşu ile değiştirilir c
ve tekrarlanan uygulama bir bağlı bileşenin c
tohumdan taşkın dolgusu z
.
Ancak bu durumda tam bir taşkın dolgu istemiyorum. Komşu kollardan sadece birini doldurmak istiyorum z
, bu yüzden ilk adımdan sonra z
gitmeyi istiyorum . Bu zaten c$2c
değiştirme ile çalışıyor , ancak daha sonra aynı noktadan başlayarak başka bir kol boyunca bir taşkın dolgusunu yeniden başlatmak istiyorum ve hangisinin artık c
orijinal olduğunu bilmiyorum z
. Onun yerine kullanıyorum
s#(\w)(.{columns}|)(?!\1)(\w)#$&|a.$2.a#se
b | a
olduğunu c
, b | c
olduğunu c
ve z | a
olduğunu {
. Böylece, yollardan oluşan bir labirentte ve ilk adımdaki b
bir tohum yerine geçecek ve yerini alacak ve bir harf değil, eşleşmeyecek ve daha fazla doluma neden olmayacaktır. Ancak gidiş bir başka sel dolgu tutacak ve tohumun bir komşu kolu doldurulur. Örneğinz
b
c
z
{
\w
c
b c
b c
bbzbb becomes bb{bb
b b
b b
Sonra olmayan bazı harf (örn bütün c yerini alabilir -
) ve değiştirme {
yoluyla z
sel-dolgu yeniden başlatmak için tekrar:
- -
- -
bbzbb becomes cc{bb
b b
b b
ve tohumun tüm komşuları dönüştürülene kadar bu işlemi tekrarlayın. Sonra bir kez daha değiştirin {
tarafından z
ve taşkın dolgu:
- -
- -
--z-- stays --z--
- -
- -
z
Sonunda geride kalır bir dönüşüm yapmak için hiçbir komşu olduğundan. Bu, aşağıdaki kod parçasında neler olduğunu netleştirir:
/\n/ >
İlk yeni satırı bulun. Başlangıç ofseti şimdi@-
s#(\w)(.{@{-}}|)(?!\1)(\w)#$&|a.$2.a#se
Yukarıda @{-}
sütun sayısı olarak tartışılan normal ifade (düz @-
perl ayrıştırıcısını karıştırdığı ve düzgün bir şekilde yer değiştirmediği için)
&&
Her /\n/
zaman başarılı olur ve sübvansiyonu doldurabildiğimiz sürece oyuncu değişikliği doğrudur. Böylece, &&
bir kolun taşkın dolgusu yapılırsa sonraki kısım yürütülür. Değilse, sol taraf boş bir dize olarak değerlendirilir
y/{c/z / > 0
Taşkın dolgusunu yeniden başlatın ve önceki taşkın dolgusu bir şey yaptıysa 1 değerini döndürün. Else boş dizeyi döndürür. Bu kodun tamamı içeri sarılmış
s:|.: code :seg
Bu bir başlangıç ipe yürütüldüğünde Yani eğer $_
bir ile z
tohum pozisyonunda kod içeriden parçası çoğunlukla hiçbir şey dönen birçok kez idam edilecek ama 1
her zaman bir komşu kol sel dolu alır. Etkili bir şekilde $_
yok edilir ve 1
bağlı bileşenler olduğu kadar çok s ile değiştirilir z
. Döngünün bileşen boyutu + silah sayısı toplamına kadar yürütülmesi gerektiğine dikkat edin, ancak sorun yok, çünkü "yeni satırlar * 2 + 1 dahil karakter sayısı".
Labaratörün bağlantısı yoksa 1
(boş dize, yalıtılmış bir tepe noktası) veya 1'den fazla kol (2 1
saniyeden fazla) varsa. Bu regex kullanılarak kontrol edilebilir /\B/
(bu eski perl sürümleri 0
yerine verir 1
. Hangisinin yanlış olduğu tartışılabilir). Ne yazık ki bu eşleşmezse bunun yerine boş bir dize verir 0
. Ancak s:|.: code :seg
her zaman yaparak bu yüzden bir tek sayısını döndürmek için tasarlanmış &
olan /\B/
bu verecektir 0
ya 1
.
Geriye kalan tek şey tüm girdi dizisini ve her yürünebilir pozisyon tohumunda z
bağlı kollarla yürümek ve saymaktır. Kolayca şu şekilde yapılır:
s%b%$_="$`z$'"; code %eg
Tek sorun, yürünemeyen pozisyonlarda eski değerin korunmasıdır. Buraya ihtiyacımız 0
olduğu için, orijinal giriş dizisinin 0
yürünemez konumlarda olması ve orijinal ikamedeki 0
eşleşmelerde \w
olması ve taşkın dolgularını tetiklemesi gerektiği anlamına gelir . Onun için \pL
kullanıyorum (sadece harfleri eşleştir).