Underload'da golf için ipuçları


11

Düşük yük tarafından oluşturulan bir yığın-bazlı yarı-işlevli Tarpit olan ais523 . Son zamanlarda şaşırtıcı derecede zarif bir dil olduğu için golf oynamaya çalışıyorum.

Underload'da golf oynamak için hangi ipuçlarınız var? (Yanıt başına bir ipucu)


Kontrol akışının tek biçiminin bir evalkomut olması hoşuma gidiyor, daha önce böyle bir dil görmedim.
ETHproductions

Yanıtlar:


3

*Çı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.


2

Tekrar tekrar kullanılan işlevlerin sözlüğünü kullanma

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.



Bir keresinde esolangs sayfasına tercih edilen ^!!!!^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.
Ørjan Johansen

2

Sorunun ihtiyaç duyduğu işlemlere özel veri formatlarını seçin

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.


Ben kullanım için kullanılır (!)ve (~!)boolelerde için değil senin yolun iyi görünüyor.
Esolanging Fruit

2

"Kirli" Azaltma

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 ctekrar nkez) 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.


Bu n = 0'da kırılıyor. Çalışmanız gerekiyorsa (()~(:))~:(^!!())*~(*)~^** , hala 3 bayt daha kısadır.
Ørjan Johansen

@ ØrjanJohansen Genel olarak, n = 0 için özel bir durumunuz olur, çünkü Underload'un sayılarının azaltılmasıyla 0 zaten bir anlam ifade etmez.
Esolanging Fruit

1

Gereksiz Yığın Değerlerini Program Alanına Yerleştirme

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 .


1
Ayrıca yazabilirsin (*)~a*^, ki bu biraz daha kolay oluşturulabilir. Esasen ~a*^olduğunu dipJoy komut.
Ørjan Johansen
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.