Yeni bir regex golf mücadelesi denemek istiyorum. Bu, regex ikameinden başka hiçbir şey olmadan önemsiz hesaplama işlemlerini çözmenizi ister. Bunu daha mümkün ve daha az bir angarya yapmak için, birbiri ardına birkaç ikame başvurusu yapmanıza izin verilecek.
Meydan okuma
Basit başlayalım: iki pozitif tamsayı içeren bir dize verildiğinde, a ile ayrılan ondalık sayılar ,
, toplamlarını içeren bir dize, aynı zamanda ondalık sayı olarak da oluşturur. Yani, çok basit
47,987
dönüşmeli
1034
Cevabınız keyfi pozitif tamsayılar için çalışmalıdır.
Biçim
Her cevap bir değiştirme dizisi olmalı , her adım bir regex ve değiştirme dizgisinden ibarettir. İsteğe bağlı olarak, dizideki bu adımların her biri için, dize değişimini durdurana kadar ikame işlemini tekrarlamayı seçebilirsiniz. İşte bir örnek gönderme (yok hangi değil yukarıdaki sorunu çözmek):
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
Girdi verildiğinde 123,456
, bu gönderim girişi şu şekilde işler: ilk yer değiştirme bir kez uygulanır ve elde edilen verim:
|123,|456
Şimdi ikinci ikame, dize değişmeyi bırakana kadar bir döngüde uygulanır:
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
Ve son olarak, üçüncü oyuncu değişikliği bir kez uygulanır:
111111
Döngüler için sonlandırma kriterinin, dizgenin değişip değişmediğini, regex'in bir eşleşme bulup bulmadığını unutmayın. (Yani, bir eşleşme bulursanız da sona erebilir, ancak değiştirme eşleşmeyle aynıdır.)
puanlama
Birincil puanınız, gönderiminizdeki ikame adımlarının sayısı olacaktır. Her tekrarlanan değiştirme 10 adım için geçerli olacaktır . Yani yukarıdaki örnek puan verecekti 1 + 10 + 1 = 12
.
(Çok muhtemel olmayan) bir beraberlik durumunda, ikincil puan, tüm adımların boyutlarının toplamıdır. Her adım için regex ( sınırlayıcılar olmadan ), değiştiriciler ve ikame dizgisini ekleyin . Yukarıdaki örnek için bu olacaktır (6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
.
Çeşitli Kurallar
Herhangi bir regex aroması kullanabilirsiniz (belirtmeniz gerekir), ancak tüm adımların aynı aromayı kullanması gerekir. Ayrıca, gereken değil yedek geri aramaları veya Perl gibi, aroma ana bilgisayar dilinin özelliklerini kullanmak e
Perl kodu değerlendirir değiştirici. Tüm manipülasyon sadece regex ikamesi yoluyla gerçekleşmelidir.
Lezzetinize ve değiştiricilerinize, her bir değişimin tüm oluşumların yerine mi yoksa yalnızca bir tanesinin mi değiştirildiğine bağlı olduğunu unutmayın. Örneğin, ECMAScript lezzetini seçerseniz, tek bir adım, değiştiriciyi kullanmadığınız sürece, varsayılan olarak yalnızca bir oluşumu g
değiştirir. Öte yandan, .NET lezzetini kullanıyorsanız, her adım her zaman tüm oluşumların yerini alacaktır.
Tek ve genel değişim için farklı ikame yöntemlerine sahip olan diller için (örneğin Ruby'nin sub
vs. gsub
), tek değişimin varsayılan olduğunu varsayalım ve global değişime bir g
değiştirici gibi davranın .
Test yapmak
Seçtiğiniz lezzet .NET veya ECMAScript ise, gönderinizi test etmek için Retina'yı kullanabilirsiniz (Bana söyleniyor, Mono'da da çalışıyor). Diğer tatlar için muhtemelen ev sahibi dilinde değiştirmeleri uygulayan küçük bir program yazmanız gerekecektir. Bunu yaparsanız, lütfen bu test programını cevabınıza ekleyin.