J , 16 11 bayt
(+$:)^:=1+?
Çevrimiçi deneyin!
açıklama
TL; DR 1+?
, kalıp rulosunu gerçekleştirir, (+$:)^:=
yalnızca girişe eşit olduğunda tekrar eder.
Fonksiyon 4 fiilden oluşan bir trendir:
┌─ +
┌───┴─ $:
┌─ ^: ─┴─ =
│
──┤ ┌─ 1
└──────┼─ +
└─ ?
Bir tren 2 veya daha fazla fiilin birleştirildiği zamandır. Burada cevap şu şekildedir f g h j
:
(+$:)^:= 1 + ?
f g h j
A so-called "4-train" is parsed as a hook and a fork:
f g h j ⇔ f (g h j)
Thus, the answer is equivalent to:
(+$:)^:= (1 + ?)
Hooks: (f g) x
and x (f g) y
A monadic (one-argument) hook of two verbs, given an argument x
, the following equivalence holds:
(f g) x ⇔ x f (g x)
For example, (* -) 5
evaluates to 5 * (- 5)
, which evaluates to _25
.
Bu, 4 kancamızın bir kancası f
ve (g h j)
eşdeğeri anlamına gelir:
(f (g h j)) x ⇔ x f ((g h j) x)
Ama f
burada ne yapar ? Güç bağlantısını (+$:)^:=
kullanarak iki fiilin bir birleşimidir : başka bir kanca ( ) ve bir fiil ( ). Burada not : didik - bunun iki argümanı ( ve ) vardır. Bu yüzden nasıl davrandığına bakmalıyız . Güç bağlantısı bir fiil alır ve bir fiil veya bir isim (bir isim sadece bir veri parçasıdır) ve zaman uygular . Örneğin, al . Aşağıdaki eşitlikler geçerlidir:^:
(+$:)
=
f
x
(g h j) x
^:
f^:o
f
o
f
o
o = 3
(f^:3) x ⇔ f (f (f x))
x (f^:3) y ⇔ x f (x f (x f y))
Eğer o
bir fiildir, güç birlikte basitçe değerlendirecek o
argümanları tekrar tekrar sayısı olarak isim sonucu kullanın.
Bizim fiil için, o
olduğu =
, eşitlik fiil. Bu değerlendirilen 0
farklı bağımsız değişkenler için ve 1
eşit bağımsız değişkenler için. Kancayı (+$:)
eşit argümanlar için bir kez ve farklı olanlar için bir kez tekrarlamayız . Açıklama için gösterim kolaylığı için, izin verin y ⇔ ((g h j) x)
. İlk kancamızın buna eşdeğer olduğunu unutmayın:
x (+$:)^:= ((g h j) x)
x (+$:)^:= y
Bağlantının genişletilmesi, bu olur:
x ((+$:)^:(x = y)) y
Aynı x
ve eğer y
, bu olur:
x (+$:)^:1 y ⇔ x (+$:) y
Aksi takdirde, bu olur:
x (+$:)^:0 y ⇔ y
Şimdi, monadik çatal gördük. Burada iki çatallı bir çatalımız var:
x (f g) y ⇔ x f (g y)
Öyleyse, ne zaman x
ve y
aynıyız:
x (+$:) y ⇔ x + ($: y)
Nedir $:
? Tüm fiilin kendisine atıfta bulunur ve özyinelemeye izin verir. Bunun anlamı ne zaman x
ve are the same, we apply the verb to
yand add
buna x`.
çatallar: (g h j) x
Şimdi, iç çatal ne yapar? Bu y
son örneğimizdi. Üç fiilli bir monadik çatal için, bir argüman verildiğinde x
, aşağıdaki eşdeğerlik geçerlidir:
(g h j) x ⇔ (g x) h (j x)
Bu sonraki Örneğin, fiiller adında var varsayalım SUM
, DIVIDE
ve LENGTH
sen onlar olabilir ne dersiniz, hangi. Üçünü bir çatalı birleştirirsek, şunu elde ederiz:
(SUM DIVIDE LENGTH) x ⇔ (SUM x) DIVIDE (LENGTH x)
Bu çatal, x
( x
bir sayılar listesi olduğunu varsayarak) ortalamasını değerlendirir . J'de bunu gerçekten örnek olarak yazardık +/ % #
.
Çatallar hakkında son bir şey. En soldaki "tine" (yukarıdaki sembolik durumumuzda g
) bir isim olduğunda, bu değeri döndüren sabit bir işlev olarak değerlendirilir.
Bütün bunlar yerinde iken, yukarıdaki çatalı anlayabiliriz:
(1 + ?) x ⇔ (1 x) + (? x)
⇔ 1 + (? x)
?
Burada aralıktaki rastgele bir tamsayı verir [ 0 , x )bu yüzden zarı temsil etmek için aralığı dönüştürmemiz gerekir; artış, menzili verir[ 1 , x ].
Hepsini bir araya koy
Tüm bunlar göz önüne alındığında, fiilimiz şuna eşittir:
((+$:)^:=1+?) x ⇔ ((+$:)^:= 1 + ?) x
⇔ ((+$:)^:= (1 + ?)) x
⇔ x ((+$:)^:=) (1 + ?) x
⇔ x ((+$:)^:=) (1 + (? x))
⇔ x (+$:)^:(x = (1 + (? x))
(let y = 1 + (? x))
if x = y ⇒ x + $: y
otherwise ⇒ y
Bu istenen işlevselliği ifade eder.