Sorun
Normal ifade ile permütasyon almanın kolay bir yolu yoktur.
- Permütasyonu: Bir alınıyor kelime başka bir siparişe ( "aabc"), sayı değiştirmeden veya tür mektupların.
- Normal ifade : Düzenli ifade.
Doğrulama için:
- "Tekrarlama içermeyen normal ifade permütasyonları" Yanıt, daha basit olacağını varsayarak normal ifade yerine JavaScript kodu oluşturur.
- "Belirli bir metnin belirli bir metindeki tüm permütasyonları nasıl bulunur" - Cevapta normal ifadeler de kullanılmaz.
- "Tekrarlama olmadan tüm {1, 2, 3, 4} ile eşleşecek şekilde normal ifade" - Yanıt normal ifadeleri kullanır, ancak ne uyarlanabilir ne de basittir.
- Bu yanıt bile iddia ediyor: "Normal bir ifade istediğini yapamaz. Bir dizeden permütasyon üretemez" .
Aradığım çözüm türü
Şu şekilde olmalıdır:
- »Aabc« (veya açılış ve kapanış parantezlerini kullanabileceğiniz herhangi bir şey)
- (Aabc)! ((abc)? ye benzer ancak sonunda başka bir sembolle birlikte)
- [Aabc]! ([abc] + 'ya benzer ancak sonunda başka bir sembol bulunur)
Bu çözümlerin avantajları
Onlar:
- kolay
- uyarlanabilir
- yeniden kullanılabilir
Bu neden var olmalı
- Normal ifadeler, normal bir dilin gramerini tanımlamanın bir yoludur. Her türlü normal dil olma gücüne sahiptirler.
- Diyelim ki normal diller permütasyonlar için yeterince güçlü (aşağıda kanıt) - bunu ifade etmenin neden kolay bir yolu yok?
Benim sorum şu:
- (Neden) Kanıtım yanlış mı?
- Eğer doğruysa: Neden permütasyonları ifade etmenin kolay bir yolu yok?
Kanıt
- Düzenli ifadeler, normal bir dilin gramerini not etmenin bir yoludur. Normal dil gramerini tanımlayabilirler.
- Herhangi bir normal dili (alfabe içinde sonlu sayıda harf içeren) dilbilgisini tanımlamanın başka bir yolu da belirleyici olmayan Otomatondur (sınırlı sayıda durumla).
Sonlu sayıda harfle bu otomatı oluşturabilirim: (Örnek. Resmi: aşağıya bakınız)
"Abbc" nin permütasyonlarını kabul eden dilbilgisi:
(üstte sayılar için sry, belki birisi bu parçanın nasıl daha iyi görüneceğini bilir)
s -> ah¹
s -> bh²
s -> ch³
h¹ -> bh¹¹
h¹ -> ch¹²
h² -> ah¹¹ (yazım hatası! denklik yok)
h² -> bh²²
h² -> ch²³
h³ -> ah¹²
h³ -> bh²³
h¹¹ -> m.ö.
h¹¹ -> cb
h¹² -> bb
h²² -> ac
h²² -> ca
h²³ -> ab
h²³ -> ba
Daha resmi: (sonlu durum otomatı kullanarak, ancak bu dilbilgisi ile de yapılabilir)
- Herhangi bir permütasyonun kabul eden bir duruma ulaşması gereken q kelimesi (sonlu uzunlukta).
- X, sonlu alfabe.
- Durum kümesi S, q uzunluğuna kadar herhangi bir harf sırası içerir. (Yani S'nin boyutu sonludur.) Artı bir "artık kelime" durumu.
- bir harf alıp sözcüğün şimdi okunan kısmına karşılık gelen durum üzerinde hareket eden durum geçiş fonksiyonu d.
- F, q'nun kesin permütasyonları olan bir dizi durumdur.
Böylece, belirli bir kelimenin permütasyonlarını kabul etmek için sonlu durumlu bir otomat oluşturmak mümkündür.
Kanıtla devam etmek
Bu yüzden normal dillerin permütasyonları kontrol etme gücüne sahip olduğunu kanıtladım, değil mi?
Peki neden Regexes ile buna ulaşmak için bir yaklaşım yok? Yararlı bir işlevsellik.
^(a()|a()|b()|c()){4}\2\3\4\5$
gibi görünüyor : işe yarıyor gibi görünüyor (bkz. Regex101.com/r/9URPpg/4/tests ).