Perl 5 , -p0 105 101 96 93 90 89 bayt
Girdi byerine 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!
sSatı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 bharflerden 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 cve tekrarlanan uygulama bir bağlı bileşenin ctohumdan 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 zgitmeyi istiyorum . Bu zaten c$2cdeğ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 corijinal olduğunu bilmiyorum z. Onun yerine kullanıyorum
s#(\w)(.{columns}|)(?!\1)(\w)#$&|a.$2.a#se
b | aolduğunu c, b | colduğunu cve z | aolduğunu {. Böylece, yollardan oluşan bir labirentte ve ilk adımdaki bbir 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ğinzbcz{\wc
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 zsel-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 zve taşkın dolgu:
- -
- -
--z-- stays --z--
- -
- -
zSonunda 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 ztohum pozisyonunda kod içeriden parçası çoğunlukla hiçbir şey dönen birçok kez idam edilecek ama 1her zaman bir komşu kol sel dolu alır. Etkili bir şekilde $_yok edilir ve 1bağ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 1saniyeden fazla) varsa. Bu regex kullanılarak kontrol edilebilir /\B/(bu eski perl sürümleri 0yerine 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 :segher zaman yaparak bu yüzden bir tek sayısını döndürmek için tasarlanmış &olan /\B/bu verecektir 0ya 1.
Geriye kalan tek şey tüm girdi dizisini ve her yürünebilir pozisyon tohumunda zbağ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 0olduğu için, orijinal giriş dizisinin 0yürünemez konumlarda olması ve orijinal ikamedeki 0eşleşmelerde \wolması ve taşkın dolgularını tetiklemesi gerektiği anlamına gelir . Onun için \pLkullanıyorum (sadece harfleri eşleştir).