Dizeleri eşit uzunlukta parçalara bölme n
Çoğu "normal" dilde olduğu gibi TMTOWTDI (bunu yapmanın birden fazla yolu vardır). Burada girdinin satır besleme içermediğini ve "bölmenin" satırlara bölünmesi anlamına geldiğini varsayıyorum. Ancak oldukça farklı iki hedef vardır: Eğer dizgenin uzunluğu yığın uzunluğunun katı değilse, eksik sondaki parçayı tutmak mı yoksa atmak mı istersiniz?
Eksik bir sonlu yığın tutma
Genel olarak, Retina'daki bölünme hakkında üç yol vardır. Burada her üç yaklaşımı da sunuyorum, çünkü bunları ilgili bir soruna uyarlamaya çalıştığınızda daha büyük bir fark yaratabilirler. Bir yedek kullanabilir ve her bir eşleşmeye satır besleme ekleyebilirsiniz:
.{n}
$&¶
Yani (eğer biraz daha az veya 8 bayt var n = 2
ya n = 3
o zaman kullanabilir çünkü ..
ya ...
sırasıyla). Dizi uzunluğu eğer ek bir satır besleme ekler: gerçi bu bir sorunu var olan öbek uzunluğunun katı.
Ayrık bir aşama da kullanabilir ve yakalamaların bölmede tutulduğu gerçeğinden yararlanabilirsiniz:
S_`(.{n})
_
Seçenek aksi maçları ile tüm dizeyi kapsayan doğuracağı boş satırları kaldırır. Bu 9 bayt, ancak sondaki satır beslemesi eklemiyor. İçin n = 3
's 8 byte ve için n = 2
' s 7 bayt. Boş satırlar madde yok genel eğer bir bayt kurtarabilir Not (örn yalnızca boş olmayan satırları işleme olacak ve daha sonra yine linefeeds kurtulmak için): o zaman kaldırabilirsiniz _
.
Üçüncü seçenek bir eşleşme kullanmaktır. !
Seçeneği ile tüm maçları yazdırabiliriz. Ancak, sondaki yığını eklemek için değişken bir eşleşme uzunluğuna izin vermeliyiz:
M!`.{1,n}
Bu da 9 bayttır ve sondaki satır besleme içermez. Bu da n = 3
yaparak 8 bayt olur ..?.?
. Ancak 6 bayta düştüğünü unutmayın, n = 2
çünkü şimdi sadece ihtiyacımız var ..?
. Ayrıca M
, programınızdaki son aşama ise, düşürülebilir ve her durumda bir bayt kaydedilebilir.
Eksik bir sondaki yığını atma
Bir yedek ile yapmaya çalışırsanız bu gerçekten uzun sürer, çünkü sondaki parçayı hiçbir şeyle (varsa) ve ayrıca bir bölünmeyle değiştirmeniz gerekir. Böylece bunları güvenle görmezden gelebiliriz. İlginçtir, maç yaklaşımı için tam tersi: kısalıyor:
M!`.{n}
Yani 7 bayt veya daha az var n = 2
, n = 3
. Yine, M
kodun son aşaması ise, atlayabileceğinizi unutmayın .
Burada bir satır sonu besleme istiyorsanız |$
, normal ifadeye ekleyerek bunu alabilirsiniz .
Bonus: örtüşen parçalar
Bunun M
, &
çakışan eşleşmeleri döndüren seçeneği olduğunu unutmayın (normal olarak normal ifadeyle mümkün değildir). Bu, belirli bir uzunlukta bir dizenin tüm çakışan parçalarını (alt dizeleri) almanızı sağlar:
M!&`.{n}