Bu meydan okuma, Nisan 2018 LotM yarışmasının bir parçası olarak ve Brain- flak'ın 2. doğum günü için yayınlandı.
Brain-flak programlarını kodlamanın en etkili yolunun ne olacağını düşünüyordum. Yapılacak en açık şey, yalnızca 8 geçerli karakter olduğundan, her bir karakteri 3 bitlik bir sırayla eşlemektir. Bu kesinlikle çok etkili, ama yine de çok fazlalık var. Şifrelemeyi kısaltmak için faydalanabileceğimiz beyin-laf kodunun bazı özellikleri var.
Hepsi birbiriyle eşleşen 2 parantez ile temsil edilen tırnaklar, gerçekten 2 yerine tek bir bilgi birimi olarak işlev görür.
Bu daha az açıktır, ancak monadların kapanış baytları da gereksizdir.
'?'
Aşağıdaki pasajda karakterlerin neyi temsil ettiğini tahmin edebileceğinizi mi düşünüyorsunuz ?{(({}?<>?<>?
Girdilerin geçerli beyin-flak kodu olduğunu varsayarsak, bu soru işaretlerinin her biri için yalnızca bir seçenek vardır. Bu, her kapanış braketini temsil etmek için açıkça yakın bir monad karakteri kullanabileceğimiz anlamına gelir . Bu, karakter kümesini küçük tutmanın ek avantajına sahiptir; bu, bir huffman kodlaması kullanmak istiyorsak büyük ölçüde yardımcı olacaktır. Yana yakın monad karakteri büyük olasılıkla açık farkla en yaygın karakter olacak o derece verimli olan tek bir bit ile temsil olabilir.
Bu iki püf noktası beyin-laf kodunu aşağıdaki algoritma ile sıkıştırmamıza izin verecek:
Bir monanın her kapatma braketini ile değiştirin
|
. Başka bir deyişle, açılış maçından önce gelmemiş olan her kapatma braketini bir çubukla değiştirin. Yani...(({})<(()()())>{})
olacaktı
(({}|<(()()()||{}|
Her niladı kapama braketi ile değiştirin. Bu nedenle, içinde hiçbir şey bulunmayan eşleşen braketler aşağıdaki eşlemeyi kullanır:
() --> ) {} --> } [] --> ] <> --> >
Şimdi son örneğimiz:
((}|<()))||}|
İzleyen
|
karakterleri kaldırın . Toplam çubuk sayısının toplam({[<
karakter sayısına eşit olması gerektiğini bildiğimiz için, sonunda eksik çubuk varsa, bunları çıkartabiliriz. Yani şöyle bir örnek:({({})({}[()])})
olacaktı
({(}|(}[)
Bugün için zorluk, bu süreci tersine çevirmektir.
Sadece karakterleri içeren bir dizi sıkıştırılmış beyin-lafı verildiğinde (){}[]<>|
, onu orijinal beyin-lapa koduna genişletin. Girişin her zaman geçerli beyin flakasına genişleyeceğini varsayabilirsiniz. Girdinin hiçbir önek zamankinden daha içerecek Bu araçlar |
daha ({[<
karakterler.
Giriş, sondaki |
karakterleri içermez . Bunlar bağlamdan çıkarılmalıdır.
Her zamanki gibi, tam bir program veya bir işlev sunabilirsiniz ve giriş / çıkış biçimlerine izin verilir. Bu bir kod golfü olduğundan, kodunuz bayt cinsinden kaynak kodun uzunluğu ile puanlanacak, puan ne kadar küçük olursa o kadar iyi olur.
Test durumları
İşte bazı test durumları. Daha fazlasını isterseniz, bu test senaryosuyla ve bu test senaryolarının çoğunun geldiği Brain-Flak Wiki ile kendi test durumlarınızı oluşturabilirsiniz .
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}