J , 16 11 바이트
(+$:)^:=1+?
온라인으로 사용해보십시오!
설명
TL; DR 1+?
은 다이 롤을 수행 (+$:)^:=
하고 입력과 같을 때만 반복합니다.
이 함수는 4 동사의 기차입니다.
┌─ +
┌───┴─ $:
┌─ ^: ─┴─ =
│
──┤ ┌─ 1
└──────┼─ +
└─ ?
기차는 두 개 이상의 동사가 연결될 때입니다. 대답은 다음과 같습니다 f g h j
.
(+$:)^:= 1 + ?
f g h j
소위 "4 트레인"은 후크와 포크로 구문 분석됩니다.
f g h j ⇔ f (g h j)
따라서 답은 다음과 같습니다.
(+$:)^:= (1 + ?)
후크 : (f g) x
및x (f g) y
인수가 주어지면 두 동사의 모나 딕 (1 인수) 후크 x
는 다음과 같습니다.
(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
여기서 무엇을합니까? 전원 연결을 (+$:)^:=
사용하는 두 개의 동사 : 다른 후크 ( )와 동사 ( )입니다. 여기에 참고 인 이항 - 그것은 두 개의 인수가 ( 하고 ). 그래서 우리는 어떻게 행동하는지 살펴 봐야합니다 . 전원 연결 은 동사 와 동사 또는 명사 (명사는 데이터의 일부 임)를 취하여 시간을 적용 합니다. 예를 들어 보자 . 다음과 같은 내용이 유지됩니다.^:
(+$:)
=
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
이다 =
, 평등 동사. 0
다른 인수와 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
이제 모나 딕 포크를 보았습니다. 여기, 우리는 2 단 포크를 가지고 있습니다 :
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 and add
x` 라는 의미입니다 .
포크 : (g h j) x
이제, 내부 포크는 무엇을합니까? 이것은 y
우리의 마지막 예였습니다. 세 가지 동사의 모나드 포크의 경우 인수가 주어지면 x
다음과 같은 동등성이 유지됩니다.
(g h j) x ⇔ (g x) h (j x)
이 다음에 예를 들어, 우리가 동사라는 이름의 한 가정 SUM
, DIVIDE
그리고 LENGTH
당신은 그들이 수도 무엇을 생각 않는. 세 가지를 포크로 연결하면 다음과 같은 결과를 얻습니다.
(SUM DIVIDE LENGTH) x ⇔ (SUM x) DIVIDE (LENGTH x)
이 포크는 평균으로 평가됩니다 x
( x
수치 라고 가정 ). J에서는 실제로 이것을 예제로 작성 +/ % #
합니다.
포크에 관한 마지막 것. 가장 왼쪽의 "tine"(위의 상징적 인 경우 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
이것은 원하는 기능을 나타냅니다.