Yanıtlar:
*
Çıktı için kullanınÇünkü sen yığın bir dize bırakarak çıktı edebilir , kullanarak dize birikir yararlı olabilir *
ziyade ile çıkışı S
. Diyelim ki meydan okumanız "bir ip alın ve bir boşluk ekleyin", çıktı ile yapmanın yolu şöyle olurdu:
S( )S
Bununla birlikte *
, bunu yapmanın yolu bir bayt daha kısadır:
( )*
Sorun şu ki, çıktınızda çok fazla birikim varsa, yığındaki çıktı öğesiyle başa çıkmak bayt maliyeti olabilir.
Bir kod parçasını çok kullanmanız gerekiyorsa, bu kodu yığına depolamak ve arada sırada çoğaltmak ve değerlendirmek mantıklıdır. Şimdiye kadar, bu sadece normal Düşük yük programlama. Ne yazık ki, bir değerin yığın üzerinde uzun süre tutulması zordur ve kodunuzun ayrıntılı olmasına neden olma eğilimindedir ve değer veri yerine bir işlev olsa bile bu doğrudur. Tekrar tekrar kullanılması gereken birden fazla işleve sahipseniz, bu durum çok daha kötüleşir.
Yeniden kullanılan birkaç işlevden faydalanabilecek daha büyük bir program türünde, kullanabileceğiniz bir çözüm, çağrılma şekline bağlı olarak amaçlarından herhangi birini yerine getirebilecek büyük bir işlev yapmaktır (ya yığının altında ne olduğuna bağlı olarak, veya daha uzun kullanarak sadece daha dizilerini çağırarak yoluyla ^
, bir dikkatle yazılı işlevi ayırt edebilirsiniz ^^
dan ^:^
itibaren ^*^
gelen ^~^
) dört ayrı, oldukça kısa dizileri size vererek. Birden çok kez kullandığınız dizeler gibi diğer yararlı şeyleri de bu "sözlükte" saklayabilirsiniz. Sözlüğü yoğun bir şekilde kullanırsanız, kendisinin bir kopyasını yığına geri iterek bir tür kınamak yapmak mantıklı olabilir, böylece elle kopyalamanıza gerek kalmaz.:
gelecekte kullanabilme yeteneğini kaybetmeden kullanabilmek.
^!!!!^
stil aramamla sözlüklerin nasıl yapılacağına dair bazı örnekler yazdım (bu da sayfadaki diğer örneklerde, özellikle minimizasyon bölümünde kullandım.) Her ne kadar bu en kısa aramayı vermeyebilir.
Basit bir örnek olarak, en yaygın görülen booleans uygulaması !()
false (yani tamsayı 0) ve null dizesi true (yani tamsayı 1) içindir, ancak ağırlıklı olarak mantıksal XOR'a dayanan bir sorununuz varsa, null dizesini false için ve ~
true için kullanmak mantıklıdır (bu veri biçimi kullanılarak herhangi bir diğer boole biçimine dönüştürülebilir (false)~(true)~^!
ve *
XOR için çok kısa bir uygulamaya izin verir .
Bu genel ilkeyi daha da ileri götürmek ve programınızın daha sonra veri değerlerinizin bir parçası olarak ihtiyaç duyacağı işlevleri kullanmak mümkündür; böylece fonksiyonların ve verilerin istif üzerinde ayrı ayrı depolanması gerekir. Bu, kontrol akışını daha karmaşık hale getirebilir, ancak golf yaparken, bakımın çoğu zaman bir arka koltuk alması gerekir ve Underload zaten bu kadar kullanılabilir gibi değildir.
(!)
ve (~!)
boolelerde için değil senin yolun iyi görünüyor.
Bir Kilise rakamını azaltmanın işlevsel olarak saf yolu, lambda hesabı önceki fonksiyonunu kullanmaktır:
\n.n(\p.\z.z($(pT))(pT))(\z.z0[whatever you define the predecessor of 0 to be])
Burada 0 = \ x. \ Yy, T = \ x. \ Yx ve $ ardıldır.
Underload ile yeniden yazıldığında, bu 28 bayttır:
(!())~(!())~(!:(:)~*(*)*~)~^!
Bu iyi, ama Underload'un yararlı özelliklerinden bazılarını kullanabiliriz, yani do :!
ve ()*
op olmayanlar. Bir dizi, bu araçlar n
, :ⁿ!!()()*ⁿ
( cⁿ
bir c
tekrar n
kez) n-1 elde edilir. Örneğin bunu Kilise sayısı 3 için yapmak bunu verir:
:::!!()()***
İşlem yapmayan çiftleri kaldırarak şunu elde ederiz:
:*
Hangisi 2.
Yani bu yeni ve daha kısa önceki model:
:(:)~^(!!()())*~(*)~^*
Bu 7 bayt daha kısadır.
(()~(:))~:(^!!())*~(*)~^**
, hala 3 bayt daha kısadır.
Düşük yükte aslında iki yığın vardır - dizge yığını ve kaynak kodunu oluşturan komut yığını. Underload'un ^
talimatı, dizeleri eski yığından ikincisine taşımamızı sağlar. Bunu yaparak, çok sayıda yığın yığını manipülasyonu kaydedebiliriz.
Örneğin (a)(b)(c)
, ana yığın üzerinde bulunduğumuzu ve (c)
almak için görmezden gelerek en alttaki iki unsuru birleştirmek istediğimizi varsayalım (ab)(c)
. Bunu yapmanın naif yolu, yığını almak (c)(a)(b)
ve daha sonra konsantre etmek ve geri takas etmek için yığını döndürmektir :
a~a~*~a*^*~
Bu kötü. a~a~*~a*^
Yığını bu şekilde döndürmek için kullanmak oldukça maliyetlidir ve mümkün olduğunca kaçınılmalıdır. Bunun (c)
yerine program alanına koyarak , bu dört bayt daha kısa yapılabilir:
a(*)~*^
Fikir, yürütmek istediğiniz talimatları almak ve daha sonra (c)
geri itmek için bir talimat eklemek ve ardından sonucu değerlendirmektir. Bu, (c)
bitirdikten sonra geri itilene kadar endişelenmemiz gerekmediği anlamına gelir .
(*)~a*^
, ki bu biraz daha kolay oluşturulabilir. Esasen ~a*^
olduğunu dip
Joy komut.
eval
komut olması hoşuma gidiyor, daha önce böyle bir dil görmedim.