Bu soru, Brain-Flak'ın ilk Doğum Günü'nü kutlamak için tasarlanmış birkaç Brain-flak Doğum Günü zorluklarının ilkidir! Brain-Flak'ın Doğum Günü hakkında daha fazla bilgiyi burada bulabilirsiniz
Geçen yaz Brain-flak Tamsayı Metagolf'umuz vardı o zamandan bu yana verilen cevaplar Brain-Flak topluluğu için çok faydalı oldu. Tamsayı Metagolf'u bu kadar verimli yapan ana şey, Çarpma kodlama adı verilen bir tekniktir.
Brain-Flak'ta çalışma zamanı çarpımı son derece pahalıdır. Bilinen en kısa çarpma snippet'i:
({}<>)({<({}[()])><>({})<>}{}<><{}>)
Megatom tarafından keşfedildi
Ancak derleme zamanı çarpımı oluşturmanın çok basit bir yolu vardır. Örneğin, aşağıdaki kod 5 ile çarpılır:
(({})({})({})({}){})
Bu, ardışık ifadeler birlikte eklendiği için çalışır. Her ({})
biri yığına hiçbir şey yapmaz ({}
açılır ve(..)
hemen geriye doğru iter iter) ve yığının üstündeki her şeyi değerlendirir. Tüm bu ifadeler birlikte yığının tepesinde ne varsa beş kata kadar toplanır.
Herhangi için n
aşağıdaki dize ifadesi yığını tarafından üst çarpacaktır bir pasajı yapacak n
:
"("+"({})"*(n-1)+"{})"
Bu n
, yığının en üstünde değerlendirilen ifadeler yaparak işe yarar. İlkn-1
aslında hiçbir şeyi değiştirmez ve sonuncusu itmeden önce destenin üstünü kaldırır.
Kompozit sayılar için, baytlardan tasarruf etmek üzere birden çok küçük ifadeyi birbirine zincirleyebilirsiniz. Örneğin, 5'i 5 ile çarparak 25 ile çarpabilirsiniz:
(({})({})({})({}){})(({})({})({})({}){})
Bu oldukça basit ve bazı sayılar için oldukça iyi çalışıyor, ancak bunu yapmanın daha iyi yolları var. Örneğin, bulduğum bir yöntem sayının ikili temsilini kullanır. ( İşte bir python uygulaması ) Bu yeni yöntem, daha önce gösterilen basit dize ifadesinden çok daha etkilidir, ancak sonu değildir, sabit kod çarpımının ve muhtemelen henüz kimsenin keşfetmediği bir tonun her türlü ilginç yolu vardır.
Bu yüzden ne kadar iyi olabileceğimizi görmenin zamanı geldiğini düşünüyorum.
Brain-Flak Kısa Bakış
İşte bu meydan okuma için Brain-Flak hakkında bilmeniz gereken her şeyin bir açıklaması.
Brain-Flak'ın "niladları" ve "monadları" vardır. Niladlar, içinde hiçbir şey olmayan parantezlerdir. Her nilad bir şey yapar ve bir değer döndürür. Bu meydan okuma için endişe duyduğumuz iki nilad {}
ve <>
. {}
etkin yığının en üstünü açar ve değerini döndürür. <>
aktif yığını ve aktif yığını değiştirir, böylece aktif yığın aktif olmaz ve aktif olmayan yığın aktif olur, sıfır döndürür.
Monadlar, içinde şeyler olan parantezlerdir. Tek bir argüman alırlar, içlerindeki her şeyin toplamı, bazen bir eylem gerçekleştirir ve sonra bir değer döndürürler. Biz ilgileniyoruz Bunlardan üçü (...)
, <...>
ve [...]
. Bu meydan okuma için en önemli monad (...)
, iç değeri alır ve aktif yığına iter. Daha sonra argümanı döndürür. <...>
ve [...]
her ikisi de "inert" monadlardır, yani herhangi bir işlem yapmazlar, daha sonra geçtikleri değeri değiştirirler. <...>
iletilen argümandan bağımsız olarak her zaman sıfır döndürür. Bu arada [...]
her zaman argüman zamanlarını döndürür -1
.
Açıklamalı örnek programlar
Brain-Flak'ta hiç programlamadıysanız, açıklanan işlemleri kullanarak bazı örnek programlara bakmak iyi bir fikir olabilir.
({}{})
Bu, yığındaki ilk iki sayıyı toplar. Her biri {}
yığından bir değer (...)
çıkarır ve toplamlarını geri iter.
({}[{}])
Benzer şekilde bu, yığındaki ikinci öğeyi ilk öğeden çıkarır. Her biri {}
bir değer açılmadan önce olduğu gibi [..]
, ikincisi ise değerin eklenmesine neden olur. Bir kez daha (...)
toplamı iter.
({}<{}>)
Bu, üst değer bozulmadan kalan yığındaki ikinci değeri kaldırır. İkinci değer tarafından susturulması dışında son iki gibi çalışır, <...>
böylece itme yalnızca ilk değeri geri iter.
(({}))
Bu, yığının üstündeki değerin ikinci bir kopyasını oluşturur. Bunu, yığının üstünü {}
değerini alarak (..)
patlatarak yapar , ilki değerini değerlendirerek geri iter. İkincisi (...)
, birincinin döndürdüğü değeri alır ve bunu yığına da iter. ikinci bir kopya oluşturmak.
Görev
Bir tamsayı verildiğinde, n
yığının en üstünü çarpan bir yığın-temiz Brain-Flak snippet'i oluşturun n
.
Aşağıdaki Brain-Flak işlemlerini kullanma izniniz var
(...) -> Push Monad, Pushes the result of its contents
<...> -> Zero Monad, Returns zero
[...] -> Negative Monad, Returns the opposite of its contents result
{} -> Pop nilad, Pops the TOS and returns its value
<> -> Switch nilad, Switches the active and inactive stack
Diğer operasyonlar meydan okuma amacıyla yasaklanmıştır.
puanlama
Puanınız, ile arasındaki tüm programların kümülatif uzunlukları n=2
olacaktır n=10000
. Doğrulama için programınızın çıktısına bir bağlantı eklediğinizden emin olun.
[...]
, bu yüzden bu bir başlangıç.