J'de golf oynamak için ipuçları


33

GolfScript çok sık sık kendi yolunu tutuyor ve J'de golf oynamak için kullanışlı ipucu depolarının kötü imparatorluğa karşı mücadelede yardımcı olabileceğini düşünüyorum. Bu kısa dili kısa yapmak için ne gibi ipuçlarınız var?

J öğrenmek isteyenler için, başlangıç ​​yapılacak en açık yer jsoftware sitesi ve özellikle kelime bilgisi , J Öğrenimi J kılavuzu ve C for J programcıları rehberidir.


1
GolfScript gets its own way far too often2019'da okumayla ilgili komik bir şey var.
İlişkisiz Dize

Yanıtlar:


14

J'deki son birkaç karakteri sıkmak için bir çok incelik vardır. Aşağıdakiler için, her büyük harfin ilkel bir fiil olduğunu farz edin (yani isimleri sınırlamak için gerekli olan boşlukları kaldırıyorum).

  • Bir tren varken, bir yarı yolun diğerine bir işlevi uygulamanız ([:FLGR)ve (LF@:GR)aynı sayıda karaktere sahip olmanız gerekir , ancak (LF@GR)birini kurtarır. G'nin çerçevesi F'nin monad rütbesine eşit veya daha büyükse, bu geçerli bir dönüşümdür. Özellikle, bütün trenler, sonsuz bir dereceye sahip olarak yapmak , ,. ,: ~. /: \: [ ]ve birçok kullanımı #ve |..

  • Dizeleri bir listeden seçmeniz gerekiyorsa ve bu dizelerin boşlukları yoksa kullanın >i{ab`cd`ef. Kirli, ancak yalnızca tek bir karakter çekmiyorsanız, karakter listesinin daha kısa olması için karakter uzunluğu 4 olması gerekir. Olan şudur ki, tanımsız adlar fiillere referans olarak kabul edilir ve bu fiillerin sıfatını aldığınızda adın kutulu bir dizesini alırsınız. Önceden tür, ad veya zarf olarak tanımlanmış olan adlar bu şekilde kullanılamaz, çünkü bu adlar daha önce çözümlenmiş olan adlarda `bulunabilir.

  • Çalışmak için bir ifadeye sahip olduğunuz için yeterince şanslıysanız ve yalnızca kesin bir fiil değil, değişkenlere yeniden kullandığınız herhangi bir bit atamak, isimler, fiiller veya zarflar olsa da neredeyse her zaman buna değer. Parens bazen daha önce boşluk bıraktığınız yerlere uyarak kendilerini geri ödeyeceklerdir ve bu tanımların çoğu bir kez daha tekrar kullanılırlarsa buna değer.

  • Gibi bağlaçlar (FGH)^:(u`v`w)yeniden yazılabilir u`v`w(FGH^:). Bu, herhangi bir tren uzunluğu için bile geçerlidir, ancak yalnızca bu numara parens'i doğru argümandan çıkardığında bir şey kaydedersiniz. Bu numara sadece sol operandı önceden yüklediğinizde çalışır. (Ne olduğu hakkında hiçbir fikriniz yok mu? 'Yapışkan zarflara bakın' ve J Sözlüğünün Ayrıştırma ve Yürütme bölümünü inceleyin.)

  • Kullanmayın a.&i., kullanın u:! {&a.ve 3&u:uzunluk bakımından eşdeğerdir, ancak birincisi bir birleşimde daha yararlı olabilir (birleşimine bağlı olarak).

  • Gibi şeyler (2%~F)ve (F%2:)uzunluk eşdeğerdir. Bu yararlıdır, çünkü bazen, treninizin geri kalanının neye benzediğine bağlı @olarak, bazı umutsuz karakterleri kurtarmak için ilk noktada yazıldığı gibi püf noktaları ile yeniden yapılandırabilirsiniz . (Ve tabii ki, eğer Folduğunu ]ve tren kullanarak, bir monad olan %&2Yaa, bir char kaydeder.)

  • Kancaya benzer trenler ]veya [en sol fiil olarak, örneğin (]FGH).

    • ]ikili bir uygulamayı kırmanıza ve yalnızca doğru argümanı kullanmanıza izin verir. (Sola (]FGH)~, en az 1 karakterlik bir ceza ile, belki daha fazlasıyla sola doğru kaydırın .) Bir karakter (FGH)@]kurtarır ve mermilerde çok kullanışlıdır!
    • [monadik olarak uygulanan bir kancada, sağ taraftaki yan etkiler için bir şeyler yapmanıza izin verir, ardından argümanı tekrar döndürür. En yaygın kullanım 1!:2, muhtemelen biçimlendirme önemsiz ile birliktedir.
  • G / Ç berbat. Yapabildiğiniz her şeyden döngüler yaparak süreci hızlandırın. 1!:1rütbesi vardır 0ve her ikisi de örneğin 1!:2 3rütbesine sahiptir _ 0, bu yüzden bunu 1'lerin dizilerini yaparak ve 1!:1doğrudan üstünden geçirerek kullanın. ".Ayrıca 1 dereceye sahip olduğunu not edin , bu yüzden genellikle bunu hemen sonra da doğrudan koyabilirsiniz 1!:1ve onu @shenanigan'lar aracılığıyla veya rütbe ile eklemeniz gerekmez .

  • Bunu koyacak yer bulmak kolay değil, ancak ::yararlı olabilir.

    • ::]^:_Örneğin, bunu yapamayana kadar tehlikeli bir şey yapmanıza izin veren güçlü bir kombinasyondur. (Her zamanki ^:_-as-a-a-loop uyarılarına tabidir.)

    • Bu aynı zamanda {istediğiniz indekse sahip olmayan listeleri kullanmanıza izin verir , çünkü bu olduğunda bir etki alanı hatası atar. Örneğin, bir listenin başlığını yalnızca varsa, almak için kullanışlıdır ( ::]boş listeyi ::_1:döndürmek veya bir hata kodu döndürmek için kullanmayı deneyin ).

  • ]`($:@u)@.vGenellikle daha kısa yapılabilir u^:v^:_özellikle tanımları üzerinde, uve vetrafında çalınabilir. Benzer bir durum şartlı benzeri u^:(1-v)vs. için de geçerlidir ]`u@.v. Seçeneklerinizi düşünün, özellikle de etrafta dolaşan çok fazla sayıda isim fiili varsa. Aynı zamanda biraz daha esnektir, ancak unutmayın, eğer kullanıyorsanız $:, çarpması kolay olan bir yineleme derinliği olduğunu unutmayın. (Genellikle 1800 yineleme gibi bir şey?)


Olumsuz hile gerçekten harika.
FUZxxl

"umutsuz karakterleri kurtar" Aydınlık okurken, her şey aktarılmış bir epitel gibi görünüyor! :)
Soham Chowdhury

1
"kullanarak %&2bir karakter kaydeder ha." Ve -:başka kaydeder!
Lynn

11

J'de golf oynarken en önemli şey, sorunu yalnızca anlamak değil, aynı zamanda bir dizi dizi dönüşümüne de indirgemektir. J kodu ile herhangi bir başarıya sahip olmak için bu düşünme şeklini anlamanız gerekir.

Örneğin, yeni bir meydan okuma en büyük alt-dizi problemini çözmeyi istedi . Bu sorunu çözmek için hisse senedi algoritması, Kadane'nin algoritmasının resmi olmayan açıklamasıdır:

Diziyi ve her bir konumdan geçin ve burada biten en büyük alt dizinin toplamını bulun; bu, en fazla 0 veya geçerli dizindeki değerin artı önceki pozisyonda biten en büyük alt dizinin toplamıdır. Tüm dizideki en büyük alt diziyi bulmak için giderken bu alt dizilerin en fazla değerini hesaplayın.

Emir koduna yapılan bir çeviri basittir:

  1. A giriş dizisi olsun.
  2. saatmi ← 0.
  3. Eğer i ≥ len (A) geri m .
  4. h ← maks (0, h + A [ i ]).
  5. m ← maks ( m , s ).
  6. ii 1 +.
  7. 3'e git .

Bu algoritmalar, J için ilk bakışta bir küçültme gibi görünmeyen açık bir döngü olduğundan bir bakışta karmaşık görünüyor. Algoritmanın ne yaptığını fark ederseniz, tek tek adımları çözebilir ve gerçekte iki basit dizi işlemi gerçekleştirdiğini görebilirsiniz:

  1. Her endekste biten en büyük alt dizilerin uzunluklarını hesaplamak için diziyi tarayın .
  2. Maksimum bulmak için bu uzunlukları maksimum fonksiyon ile azaltın .

Şimdi bu iki adımı J içinde uygulamak çok kolaydır. İşte bir çeviri:

  1. (0 >. +)/\. y , 0- Bu adım, dizinin diğer ucundan, J'nin paradigmasına daha iyi uyması için çalışır. 0 >. +için zımni 0 >. x + y.
  2. >./ y

Bir araya getirdiğimizde, algoritmanın çok kısa bir uygulamasını görüyoruz:

>./ (0 >. +)/\. y , 0

Algoritmaların uygulanmasına bu şekilde yaklaşmayı öğrenirseniz, çözümleriniz bu kod kadar özlü olacaktır.

İşte zamanla biriktirdiğim bazı püf noktaları. J golf alanında daha fazla bilgi sahibi olduğum için bu liste genişletilecektir.

  • Sözlüğü öğren. Ne kadar yararlı olduklarını görene kadar hiçbir şey ifade etmeyen, gerçekten gizsiz olan fiiller içerir. Örneğin, monadik =ilk başta gariptir ancak ASCII sanat zorluklarında çok faydalıdır.
  • &Güç birleşimi istediğinizde gizli bağlamda dyadic kullanın . Kelime, benim u@[&0için tam bir ikame olarak öneride bulunuyor 4 : 'u^:x y.
  • Pek çok durumda , bir argüman olan bir varyantını seçerek olduğu gibi bir dizilimde [:veya @:diziden kaçınabilirsiniz . Örneğin, sonucun ilk öğesini bırakmak için, bir nedenden dolayı mümkün değilse yerine kullanın .u@vuv1}.v[:}.v}.@v
  • ] vv@]monadiç'i vikili bir bağlamda kullanmak istemenizden genellikle daha kısadır . Bu, özellikle vuzun bir fiil treni olduğunda faydalı olur .
  • Bazen m (n v w) yyerine yazabilirsiniz (n v m&w) y. Bu boşluklardan ve parantezlerden kaçınmayı mümkün kılabilir.
  • #\yerine >:@i.@#.
  • u &. vvbir ön yüzü olduğunda faydalıdır . Değilse, kullanmak [: vinv u & vveya u & (v :. vinv)yerine kullanabilirsiniz .
  • Rütbe ve nasıl kullanılacağını anlayın. Uygun bir şey elde edinceye kadar rütbe birleşimi ile dolanmaya çalışın. Rütbenin kodunuzu nasıl etkilediğini anlamanıza yardımcı olur.
  • ^:_ taşma dolgusu veya simülasyonlar gibi yakınsamaya ulaşmak istediğiniz algoritmalar için son derece kullanışlıdır.
  • Standart kütüphanenizi bilin. Size tonlarca karakter kazandıran çok kullanışlı fonksiyonlar içerir.
  • Copulæ =.ve =:bir cümle içinde herhangi bir yere gömülebilir. Bunu, yapışkan gösterimin yeterli olmadığı tek gömlek yapmak için kullanın.
  • ,Çok boyutlu dizileri küçültürken , çoklu indirimler yerine monadic kullanın.
  • Zorluğun çalışma zamanı sınırlarını dayattığı durumlarda hangi cümlelerin özel kodla desteklendiğini öğrenin. Bazı yararlı şeyler karşı sezgisel olarak O ( n 2 ) yerine O ( n ) 'de işler .
  • Kutular ağaçlar için faydalıdır.

J, yeniden kullanılan hesaplamaları önbelleğe alarak maksimum alt dizi çözümünüzü O (n) 'de çalıştırmak için yeterince akıllı mı, yoksa basit olanı yapıp O (n ^ 2)' de mi çalıştıracak?
Jonah

@ Jonah Ben ikinci dereceden bir süre içinde çalışır düşünüyorum.
FUZxxl

10

Döngü kullanmaya karşı dikkatli olun.

J döngü yapıları ( for. do. end.ve while. do. end.ve varyasyonları) varken, kendinizi kullanırken onları bulursanız, algoritmanızın J'nin golf güçlü yönleriyle oynamama olasılığı ve yapılacak karakter tasarrufları vardır.

^:güç birleşimi senin arkadaşın. Fiil xsürelerini çalıştırmak için :

verb^:x

Bir listedeki her yinelemenin sonucuna ihtiyacınız varsa:

verb^:(i.x)

^:Koşullu bir fiili çalıştırmak için de kullanabilirsiniz :

  +:^:(3<])"0[ 1 2 3 4 5 6
1 2 3 8 10 12

Çift +:eğer ^:madde 3'ten büyük olduğunu 3<]( "0bir seferde bir öğe çalışır böylece fiilin sıra değiştirmiştir).


Kutulu değerler (i.x)örnek gibi hareket eder , yani f^:(<x)eşdeğerdir f^:(i.x).
FireFly

9

Giriş

1!:1[1 Enter tuşuna basılarak sonlandırılan bir satır girdi alacaktır.

1!:1[3 birkaç satır girdi (Mac'imde Ctrl-D ile, Windows'ta Ctrl-C ile sonlandırıldı).

Sayı girmeye çalışıyorsanız "., dizgi değerlendirilir ve manipüle edilmeye hazır sayıların bir listesini döndürür. Bir numara alıyorsanız ancak rakamları ayrı ayrı kullanmanız gerekiyorsa, ".,.(Jan Dvorak'ın yorumuna teşekkürler) veya "."0ipi ayrı rakamlara böler:

   "."0[1!:1[1
12345
1 2 3 4 5

   ".,.1!:1[1
12345
1 2 3 4 5

Dizelerde okuyorsanız, ayrı dizelerin kutulu bir listesini almanın en kısa yolu kullanmaktır ;:. Bu, boşlukla ayrılmış dizeler için en iyi sonucu verir:

   ;:1!:1[1
hello world
┌─────┬─────┐
│hello│world│
└─────┴─────┘

Merak etmeden, (sadece biraz J ile oynadım) ne 1!:1[2gibi bir şey olurdu ?
Gaffi

1!:Sayfada toplayabildiklerimden (J uzmanı değilim) 2 ekran, yani ekrandan giriş yapmak pek mantıklı değil.
Gareth

Bağlantı için teşekkürler. Oradan, aslında 2geçerli değil gibi görünüyor ? Şu an denemek için J bilgisayarım yanımda değil. Gördüğüm yer 2, notların hemen altında 1!:1, bunun için 1!:2.
Gaffi

@Gaffi Girdi ve çıktı için dosya numaraları ardışık görünüyor, bu yüzden bunların sabit olduğunu ve 2, 4 ve 5'in yalnızca çıktı altında göründüğünü tahmin ediyorum, çünkü bunlardan giriş yapmaya çalışmak hiç mantıklı değil. Aynısı 1 ve 3 için diğer tarafa gidiyor.
Gareth

Yana ".rank 1-xx ve ,.daima 2D dizi üretir, ".,' ',.(boşluk, Ravel ile dikiş ve değerlendirmek; 8 karakter) sadece değiştirilebilir ".,.(ravel öğeleri ve değerlendirmek; 4 karakter).
John Dvorak

6

Dizileri hesaplamak için yinelemeyi kullanma

Tipik olarak, bir OEIS dizisi zorluğunu çözmek, sayfasında verilen formüllerden birini kullanmayı gerektirir. Bunlardan bazıları J için iyi adapte olur, bazıları ise çok değil. Özyinelemeli formüller yalındır, ancak yineleme basit olmayabilir. Kullanmaya başladığım bir kalıp

(s(]f)^:[~]) n
          ]  Gets n
 s           The first value in the sequence
         ~   Commute the argument order, n is LHS and s is RHS
        [    Gets n
      ^:     Nest n times with an initial argument s
  (]f)         Compute f s
             Returns (f^n) s

nerede sdizideki ilk değerdir, fönceki dönem verilen sonraki dönem hesaplamak olacak bir fiil olduğunu ve nsen hesaplamak istediğiniz terimin sıfır tabanlı endeksidir. Bu yöntem, bir dyad'in gücünü hesaplarken, LHS'nin yeni bir monad oluşturmak için dyad'a bağlı olduğu ve bu monadın başlangıç ​​değerine yuvalandığı gerçeğine dayanır. Güç zarfına verilen dyad , LHS'de (]f)indeks verilen nve dizideki bir terimin değeri olan bir kancadır s. Kanca uygulayacak füzerinde sbir monad olarak, sonra da görmezden nsonucunu döndürmek için f s.

Standart kütüphane

Bazen, J'nin standart kütüphanesinde bir fiili destekleyeceğini bulabilirsiniz . Örneğin, bitsel tamsayı işlemlerinin çoğu, ilkel aramayı kullanmaktan daha kısa olan adlara bağlıdır.

AND =: (17 b.) NB. it is actually '$:/ :(17 b.)'

Tarih ve saat yerleşikleri de mevcuttur.

aralıklar

Eğer bir dizi değeriniz varsa [a, b, c]ve onların ürünlerine göre bir aralık oluşturmak istiyorsanız [0, 1, 2, ..., a*b*c-1], tipik yaklaşım onların ürünlerini bulmak ve sonra [:i.*/6 byte mal olacak bir aralık oluşturmak olacaktır . Daha kısa bir yol ,@i.4 byte içindir, çünkü i.hala saymaya devam ederken çok boyutlu diziler oluşturabilir ve düzleştirilmesi eşdeğer bir aralık üretecektir.

Sürekli baskı

Bir değeri yazdırmanın ve açık bir döngü olmadan kullanmaya devam etmenin en basit yolu ([echo)monadik bir durum için. echoStandart kütüphanede içeriklerini yorumlayıcıda stdoutkullanılan formatta basan bir fiildir . Kanca daha sonra sol [fiili kullanarak aynı giriş değerini iletir.

Bir tamsayının 10 basamağı

Bir tamsayı tabanının 10 basamağını elde etmenin standart yolu, 10#.inv]8 byte, çok pahalı! Bir alternatif, onu bir dizgeye dönüştürmek ve onu "."0@":bir bayttan tasarruf eden 0 rütbesinde ayrıştırmaktır , ancak daha da iyi bir yol, ,.&.":8 yerine son maliyeti 6 bayt yapan başka bir bayttan tasarruf etmektir.



5

Gördüğüm bazı (oldukça) yaygın hileler

Benim için kullanışlı olan birkaç şeyi paylaşıyorum. Temel olarak bunların hepsi kendi aldığım ipuçları, ancak çoğu için kredim yok.

Bir rank bir dizinin toplamı

Bunun yerine kullanmanın +/@:(FGH)kullanımını (1#.FGH). Bu, etkin bir dizi toplama anlamına gelir, bu taban 1'e debase demektir. Daha uzun olmasına rağmen +/, genellikle kullanmaktan daha kısa yapan bir başlık veya kompozisyon gerektirmez +/.

Sondaki gerçekleri sayma

Bir boolean listeniz varsa ve izleyen gerçeklerin sayısını saymak istiyorsanız, kullanın #.~. Buraya bakınız . APL cevabı Bunun nasıl iyi bir açıklamasını sağlamaktadır. Kabul ediyorum, bu bana sadece iki kez yardımcı oldu ama yine de paylaşacağımı düşündüm.

(&.) Altında

Belirli bir numara değil, sadece genel bir öneri: zarf- &.toplayıcı genellikle şık ve (daha da önemlisi) kısa çözümlere yol açar. Golf yaparken aklınızda bulundurun.

Çoğu zaman ve diğer temel dönüştürme zorlukları için kullanışlıdır , örneğin, en önemli biti bir sayıdan çıkartan bu kod: }.&.#:(ikili basamaklar listesine dönüştür, ilk basamağı kaldır, sonra dönüştürmeyi ikili basamaklar listesine dönüştür ve dönüştür ondalık basamağa dön). Basit çözüm iki bayt daha:#.@}.@#: .

Ayrıca, kullanabileceğinizden ondalık basamakla çalışmanız gereken zorluklar için de yararlıdır u&.":. Örneğin, millerin kullandığı kısa yol ondalık basamağa bölünerek aşağıdakileri kullanır:,.&.": .

Son bir örnek, bir vektörün büyüklüğünü bulmaktır :, -square'in sıfır olduğu için -square'den +/&.:*:tüm sonuçları -under *:ile toplamanız gerektiğini unutmayın .&.:*:


4

Safları karıştırmanın daha kısa yolları

Gibi Bazen, kodu gerekecek <"0 i.3 3Eğer bir fiil uygulamak istediğiniz yere, vrütbe r. Bununla birlikte, bir isim kullanırsanız ( 0genellikle), bir boşluk eklemek zorunda kalırsınız. Bunu önlemek için, başka bir ueşdeğer dereceli fiil kullanabilir ve u"vonun yerine kullanabilirsiniz . Örneğin +, rütbe aldığı için 0 0 0, <"+yerine<"0 .

İşte tüm fiillerin ve sıralarının bir tablosu (kullanarak elde edilebilir v b. 0):

0 0 0     > + * - % ^ | ! ? <. <: >. >: +. +: *. *: %: ^. j. o. q: r.
0 _ _     -. -: E. i: p:
1 0 1     p..
1 0 _     { A.
1 1 0     p.
1 1 1     #.
1 1 _     C.
1 _ _     ;: ". i. I.
2 _ 2     %.
_ 0 0     = < ~. ~: {: }: ?. L.
_ 1 0     #:
_ 1 _     $ # |. |: {. }. ": {::
_ _ _     , ; [ ] _: $. $: ,. ,: /: \: [: e. s: u: x: 0:

Bu tabloyu kullanmak riçin, sol taraftaki istenen sırayı bulun , ardından vsağ taraftaki uygun bir fiili seçin . Örneğin, bir fiili vderinlemesine vektörlemem gerekirse 2 _ 2, o sırada soldaki sırayı bulup %.sağdan seçiyorum . Sonra v"%.yerine kullanıyorum v"2 _ 2.


3

strings kütüphane: golf ipuçları

String kütüphanesi string manipülasyon ile herhangi bir şey yapmak için çok faydalıdır. Tabii ki, include'strings'(J'ye göre çok pahalı) alıyor, ancak zaman zaman avantajlardan yararlanabilirsiniz.

stringreplace

Kendini dize yerine kullanarak bulmak? Bunun A stringreplace Baynı olduğunu gözlemleyin B rplc A.

Aslında, bu nasıl rplcuygulanır:

   rplc
 stringreplace~

cuts

Fiil cutsböylece sağlar:

y'yi x'de kes (birlikte)
string (fiil keser n) metni
  n = _1 e kadar ama string içermiyor
  n = 1'e kadar ve string dahil
  n = _2'den sonra ancak string içermiyor
  string'den sonra ve string'den sonra n = 2

Bu yüzden gerçekten bir dize dilimleme.


3

0 ile 4 arasındaki sayıları alma

Kodunuzda sayıların kullanımıyla ilgili bir kısıtlama varsa:

0 %_ : bir sonsuzluğa bölünür.
1 #_ : kaç tane sonsuzluk var?
2 #_ _ : iki sonsuzluk.
3 verb : bir yerleşik var.
4 dyad : başka bir dahili.

10'dan 35'e kadar olan sayıları alma

Baz-inifinity değişmezleri: 11 : _bb, 26 : _bqvb


3

Tacit programlama

temeller

Dyadik fiil

x (F G H) y == (x F y) G (x H y)
x (F G) y == x F (G y)
x ([: G H) y == G (x H y)  NB. G is called monadically

NB. Verbs are grouped from the right by units of 3.
NB. For the following, think like G, I, K are replaced by the results of (x G y) etc.
NB. and then the sentence is run as usual.
x (F G H I J K) y == x (F (G H (I J K))) y
                  == x F ((x G y) H ((x I y) J (x K y)))

NB. Using conjunctions for dyadic verb
x F@G y == F (x G y)  NB. Atop; Same as x ([: F G) y; Consider as golfing alternatives
x F&G y == (G x) F (G y)  NB. Compose; G is applied monadically to both arguments

Monadic fiili

(F G H) y == (F y) G (H y)
(G H) y == y G (H y)  NB. Note that this is different from APL
([: G H) y == G (H y)
(F G H I J K) y == (F (G H (I J K))) y
                == y F ((G y) H ((I y) J (K y)))
F@G y == F (G y)

Çeşitli

x&F y == x F y
F&y x == x F y
y F~ x == x F y
F~ y == y F y

püf nokta

(F x) G (H y)

Tacit çözeltisi (G~F)~H:; fiili fiillere bağlı olarak, silmek için sol ve sağ argümanları yeniden düzenlemeyi düşünün ~.

x ((G~F)~H) y
x (G~F)~ (H y)
(H y) (G~F) x
(H y) G~ (F x)
(F x) G (H y)

Monadic-Dyadic değiştirmeleri

>:y == 1+y
<:y == 1-~y or _1+y
+:y == 2*y
-.y == 1-y
-:y == 2%~y
*:y == 2^~y
#.y == 2#.y
#.inv y == 2#.inv y  NB. #: doesn't work this way
{.y == 0{y
{:y == _1{y
}.y == 1}.y
+/y == 1#.y

1
(G~F)~Hsaf kabarcıklı iyiliktir!
Jonah

2

& arkadaşın mı, akıllıca kullan

vbir fiil, nbir isim xve ysırasıyla sol ve sağ argümanlar.

Monad &: ~Zarf / birleşim zincirinin içine giriş

Bir zarf / birleşme zinciri soldan değerlendirir. Yani bir şey _2&+/\&.>işe yaramaz çünkü (_2&+)/\&.>bizim istediğimiz gibi ayrışır _2&(+/\)&.>. Bu durumda, sola / sağa +/\kaydırmak, +/\~&_2&.>bu gibi ayrıştırdığı için olduğu gibi bir bayt kazandırabilir ((+/\)~)&_2&.>. Bunun neden işe yaradığını görmek için:

+/\~&_2 y
is equivalent to
y +/\~ _2
is equivalent to
_2 +/\ y
is equivalent to
_2&(+/\) y

Dyad &: Tekrarlanan xzamanlar

Bunu biliyor muydunuz Eğer sol argüman verirseniz xüzere &, işlevi uygular xkezy ? Oldukça birkaç zorluk bazı işlem xsüreleri yapmanızı ister . Esas olarak iki şekilde elde edilebilir:

  • Operatöre ^:doğru operatör olmadan kullan

Operasyon ise v, o v^:zaman sol operand verildiğinde, monadik fiil haline gelen bir zarf tren olur. Yani , kez vuygulanır .yx

x(v^:)y
is equivalent to
(v^:x)y
  • &En dış bağlantı olarak dyadic kullanın

Bunu kullanmak için, bir sabiti tanımlamak gerekir nve bir diyadik fiil uböylece ya n u yya y u neşdeğerdir v. Sonra tüm görevi yazabilir n&uveya u&nçözebilirsiniz. Bu form, sabitin seçimi açık olduğunda, örneğin 3 inç 3 u:(karakterleri ASCII değerlerine dönüştürür) çok etkilidir .

Ayrıca, en dıştaki yapı bir bağlaç veya zarf olduğunda u&ntercih edilir (bu durumda olması gereken ; yapmalısınız ).n&uun&un&(u)u~&n

&Keyfi argümana, rasgele argümana, rasgele dinamiğe yinelenen keyfi işlev elde etmek için dyadik'i bir trende herhangi bir yere yerleştirebileceğinizi unutmayın ^:.

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.