J、16 11バイト
(+$:)^:=1+?
オンラインでお試しください!
説明
TL; DR 1+?
はサイコロを実行し(+$:)^:=
、入力と等しい場合にのみ繰り返します。
関数は4つの動詞の列です:
┌─ +
┌───┴─ $:
┌─ ^: ─┴─ =
│
──┤ ┌─ 1
└──────┼─ +
└─ ?
トレインとは、2つ以上の動詞が連結されている場合です。ここで、答えは次の形式f g h j
です:
(+$:)^:= 1 + ?
f g h j
いわゆる「4-train」は、フックとフォークとして解析されます。
f g h j ⇔ f (g h j)
したがって、答えは次と同等です。
(+$:)^:= (1 + ?)
フック:(f g) x
およびx (f g) y
引数が与えられた場合x
、2つの動詞の単項(1引数)フックで、次の等価性が成り立ちます。
(f g) x ⇔ x f (g x)
例えば、(* -) 5
評価さへ5 * (- 5)
と評価され、_25
。
これは、4トレイン、f
およびのフックが(g h j)
、次と同等であることを意味します。
(f (g h j)) x ⇔ x f ((g h j) x)
しかし、f
ここで何をしますか?Power接続詞(+$:)^:=
を使用した2つの動詞の接続詞:別のフック()と動詞()。ここで注意です二項 -itは2つの引数を持っている(と)。だから、私たちはどのように振る舞うかを見なければなりません。べき乗接続詞は、動詞と動詞または名詞(名詞は単なるデータの一部)を取り、時間を適用します。例えば、取ります。次の同等性が保持されます。^:
(+$:)
=
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))
場合はo
動詞で、電源連動は、単純に評価するo
引数を経由し、繰り返し回数として、名詞の結果を使用しています。
私たちの動詞であるo
is =
は、平等動詞です。0
異なる引数と1
等しい引数に対して評価されます。(+$:)
等しい引数に対してフックを1回繰り返し、異なる引数に対してフックを繰り返しません。説明の表記を簡単にするために、をしましょうy ⇔ ((g h j) x)
。最初のフックはこれと同等であることを忘れないでください:
x (+$:)^:= ((g h j) x)
x (+$:)^:= y
接続詞を展開すると、これは次のようになります。
x ((+$:)^:(x = y)) y
x
とy
が同じ場合、これは次のようになります。
x (+$:)^:1 y ⇔ x (+$:) y
それ以外の場合、これは次のようになります。
x (+$:)^:0 y ⇔ y
さて、モナドの分岐点を見てきました。ここに、ダイアディックフォークがあります。
x (f g) y ⇔ x f (g y)
したがって、x
とy
が同じ場合、次のようになります。
x (+$:) y ⇔ x + ($: y)
なに$:
?動詞全体を指し、再帰を可能にします。これは、いつx
y are the same, we apply the verb to
y yand add
x`かということです。
フォーク: (g h j) x
さて、インナーフォークは何をしますか?これはy
最後の例でした。引数が与えられた3つの動詞の単項フォークのx
場合、次の等価性が成り立ちます。
(g h j) x ⇔ (g x) h (j x)
次の例では、我々は名前の動詞があるとしSUM
、DIVIDE
とLENGTH
あなたは、彼らがかもしれないと仮定し何、。3つをフォークに連結すると、次のようになります。
(SUM DIVIDE LENGTH) x ⇔ (SUM x) DIVIDE (LENGTH x)
このフォークは、平均で評価されます(数値のリストであるとx
仮定x
)。Jでは、実際にこれを例として記述し+/ % #
ます。
フォークに関する最後の1つです。左端の「タイン」(上記のシンボリックなケースではg
)が名詞の場合、その値を返す定数関数として扱われます。
これらすべてが整ったところで、上記の分岐点を理解できます。
(1 + ?) x ⇔ (1 x) + (? x)
⇔ 1 + (? x)
?
[ 0 、x )[ 1 、x ]
すべてを一緒に入れて
これらすべてを考えると、私たちの動詞は次と同等です:
((+$:)^:=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
これは、目的の機能を表します。