Retina'da golf için ipuçları


11

Retina'da golf oynamak için hangi genel ipuçlarınız var ? Ben genel olarak en azından biraz Retina özgü (örneğin "yorumları kaldırmak" bir cevap değildir) kod golf sorunlarına uygulanabilecek fikirler arıyorum. Lütfen cevap başına bir ipucu gönderin.

Referans olarak, çevrimiçi derleyici burada .

@ Sp3000 , Regex Golf için ipuçları da olduğunu belirtti . Buradaki yanıtlar, genel regex golf ipuçlarına değil, özellikle Retina özelliklerine odaklanmalıdır.


2
İlgili:
Normal

Hmmm, Retina hala geliştirme aşamasında olduğu için bunu yayınlamaya devam ediyorum ve çoğu yanıtın Retina'ya çok özel olmayan düz regex golf ipuçları olacağından korkuyordum. Ama biz de bir şans verebiliriz, sanırım ... :)
Martin Ender

@ MartinBüttner Siz ve bazılarınız Retina'ya bakmaya başladığımdan beri bana çok iyi ipuçları ve ipuçları verdiniz, bu yüzden muhtemelen bunun için zaman olduğunu düşünüyorum. Genel regex ipuçlarının bağlantılı soruya gitmesi gerektiğine dair bir açıklama ekledim.
Dijital Travma

1
@ MartinBüttner İşte sorabileceğiniz kadar iyi bir yer - Bir süredir merak ediyorum - meraktan "Retina" adı için ilham kaynağı nedir? "Re" kısmının Düzenli İfade için olduğunu varsayıyorum, ama "tina" ne olacak?
Dijital Travma

3
@DigitalTrauma Kısaltma olarak çalışacak, ancak başarısız olacak güzel bir kelime bulmaya çalışıyordum. "Retina" kelimesi bazı girişimlere oldukça yakındı ve bu kelimeyi beğendim. Asla bir kısaltma haline getirmeyi başaramadım ve o zamandan beri vazgeçtim. Evet, "yeniden" bir tür "düzenli ifadeler" ve belki de ".NET" için "n", ama sonuçta sadece kulağa hoş gelen bir kelimedir.
Martin Ender

Yanıtlar:


3

Mümkünse döngüleri birleştirin

Önemsiz hesaplamalarda, genellikle verileri işlemek için birkaç döngü kullandığınızı görürsünüz:

+`stage1
+`stage2
+`stage3

Böylece bu stage1, çıktı yakınsamaya stage2kadar , daha sonra çıktı yakınsamaya ve daha sonra stage3da çıktı yakınsamaya kadar çalışır.

Ancak, aşamaları her zaman ayrıntılı olarak incelemeye değer. Bazen döngüyü aralıklı bir şekilde çalıştırmak mümkündür stage1, stage2, stage3, stage1, stage2, stage3, ...(bu aşamaların gerçekte ne yaptığına çok bağlıdır, ancak bazen tamamen dikey değişiklikler yaparlar veya bir boru hattı olarak iyi çalışırlar). Bu durumda, baytları tek bir döngüde sararak kaydedebilirsiniz:

{`stage1
stage2
}`stage3

Eğer stage1ilk aşamadır veya stage3(bu can şimdiden iki aşamadan bir döngü için bayt tasarruf anlamına gelir) sonra bile de bu parantez üzerinde atlayabilirsiniz programın son aşamadır.

Bu tekniğin yakın tarihli bir kullanımı bu cevapta görülebilir .


2

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 = 2ya n = 3o 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 = 3yaparak 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, Mkodun 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}

Bir dizeyi değişken uzunlukta tam olarak yarıya bölmek bir şekilde mümkün mü? Öyleyse 123456olur 123\n456ve 1234567890olur 12345\n67890?
Kevin Cruijssen

1
@KevinCruijssen Bunun için belirli bir özellik eklediğimi sanmıyorum. Muhtemelen dengeleme grupları kullanmanız gerekecektir: tio.run/##K0otycxLNPyvquGe8D/YIEHD3sZWQ09TW1PD3hbI1jW0A3JUNP//… Sondaki bir satır beslemesine aldırmazsanız , atlayabilirsiniz ?=.
Martin Ender

Farklı bir şekilde ihtiyacım olduğunu düşündüğüm zorlukları tamamlayabildim, ama dengeleme grupları gerçekten çok faydalı! Bu çizgide bir şey olması gerektiğini biliyordum, ama regex / Retina becerilerim neredeyse yeterince iyi değil. Cevabın için teşekkür ederim! :)
Kevin Cruijssen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.