Quylthulg , Chris Pressey'nin panfix dediği şeyi kullanarak infix gösterimi sorununu çözmeye çalışan bir dildir :
postfix gibi, panfix de varsayılan operatör önceliğini geçersiz kılmak için parantez gibi gizli gizliliklerin konuşlandırılmasını gerektirmez. Aynı zamanda, panfix, terimlerin infix ile aynı sırada ve şekilde belirtilmesine izin verir, bu, alışmış olanlara tartışılmaz derecede doğal ve sezgisel bir gösterimdir.
Ön ek veya postfix'in belirsizliği ile birlikte infix gösteriminin rahatlığını nasıl elde edersiniz? Elbette üçünü de kullanın!
=y=+*3*x*+1+=
Daha resmi olarak, +
bir operatör a
ve b
ifadeler olsun. Sonra (a+b)
geçerli (parantez içine alınmış) bir infix ifadesidir, bu ifadenin panfix temsili +a+b+
, burada yan yana yerleştirme birleşmeyi temsil eder.
Amacınız bir panfix dizesi alıp tam parantez içine alınmış infix'e dönüştürmektir:
(y=((3*x)+1))
Basit olması için aşağıdaki değişiklikleri yapacağız:
- İşleçler yalnızca iki benzersiz karakterden oluşabilir (herhangi birini seçebilirsiniz, ancak burada
*
ve kullanacağım+
). - Başka bir belirgin karakterden oluşan sadece bir değişmez var (herhangi birini seçebilirsiniz, ancak burada kullanacağım
_
). - Giriş, iyi biçimlendirilmiş bir panfix ifadesi olacaktır.
İçin karmaşıklığı , aşağıdaki değişiklik yapacağız:
- İşleçler yalnızca bir karakterden değil , herhangi bir pozitif karakterden oluşabilir .
Bu, zorluğu daha zor hale getirir, çünkü belirli bir operatör karakter alt dizesinin dizenin geri kalanına bakmadan nasıl bölümlendiğini belirleyemezsiniz.
İşte @ user202729'un izniyle meydan okuma için bir referans uygulaması .
Test Durumları
format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)
Bu meydan okuma için infix dizeleri oluşturmak için bu programı kullandım (panfix dönüştürmek önemsiz, ama ters değil).
**_**_**_*_****_*
. Test ettiğim cevapların hepsi başarısız oldu.
(_ + _)
mi , örneğin ?