Brainflak Çarpma Metagolf


17

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:

 (({})({})({})({}){})

Çevrimiçi deneyin!

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 naş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, nyığı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=2olacaktır n=10000. Doğrulama için programınızın çıktısına bir bağlantı eklediğinizden emin olun.


1
İlginin dışında, 1 ve döngü işlemleri neden yasaklandı?
Neil

@Neil Yığın yüksekliği operatörü de yasaklanmıştır.
Outgolfer Erik

1
@EriktheOutgolfer Zaten tamsayı metagolf bir tane zaten yasaklamıştı.
Neil

7
Bilgisayar bilimcileri tuhaf. Kullanılması imkansız, doğal olarak anti-golf programlama dilleri icat ederler ve daha sonra bu dilde basit problemleri çözmek için golf kodunu yazmaya zorlarlar. Hiçbir şey bundan daha ezoterik olamaz. +1 iyi efendim.
Draco18s artık SE

1
@ Qwerp-Derp Bağlantılı Python programının çıktısını optimize etmeye çalıştım (şimdiki puan 681950) ve 4492 kullanarak önemsiz bir tasarruf buldum [...], bu yüzden bu bir başlangıç.
Neil

Yanıtlar:


2

Yakut, 669856

$answers = Hash.new{|hash,n|
  valid = []
  2.upto(n**0.5){|i|
    valid.push("("+hash[n/i]+")"+"({})"*(i-2)+"{}") if n%i == 0
  }
  valid.push("({})"+hash[n-1])
  (hash[n] = valid.min_by{|s| s.length})
}
$answers[1] = "{}"

def full_answer n
  "("+$answers[n]+")"
end

Bu hızlı bir temel cevaptır. İlk 1000 dk programı burada bulundu . (Hepsini göndermeye çalıştım, ama bu maksimum pastebin boyutunu aşırı yükledi.) Daha sonra bir kod açıklaması ekleyebilirim.

Örnekler:

360:    ((((((({})(({}){}){})({}){})({}){}){}){}){})
4608:   (((((((((((({})({}){})({}){}){}){}){}){}){}){}){}){}){})
9991:   (({})((({})(((((((({})((({})({}){}){}){}){}){}){}){}){}){}){})({}){}){})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.