J , 16 11 byte
(+$:)^:=1+?
Hãy thử trực tuyến!
Giải trình
TL; DR 1+?
thực hiện cuộn chết, (+$:)^:=
chỉ nhắc lại khi nó bằng đầu vào.
Chức năng là một đoàn tàu gồm 4 động từ:
┌─ +
┌───┴─ $:
┌─ ^: ─┴─ =
│
──┤ ┌─ 1
└──────┼─ +
└─ ?
Một chuyến tàu là khi 2 hoặc nhiều động từ được nối với nhau. Ở đây, câu trả lời có dạng f g h j
:
(+$:)^:= 1 + ?
f g h j
Cái gọi là "4 tàu" được phân tích cú pháp như một cái móc và một cái nĩa:
f g h j ⇔ f (g h j)
Do đó, câu trả lời tương đương với:
(+$:)^:= (1 + ?)
Móc: (f g) x
vàx (f g) y
Một hook đơn âm (một đối số) của hai động từ, được đưa ra một đối số x
, tương đương sau đây giữ:
(f g) x ⇔ x f (g x)
Ví dụ, (* -) 5
đánh giá 5 * (- 5)
, mà đánh giá đến _25
.
Điều này có nghĩa là 4 tàu của chúng tôi, một cái móc f
và (g h j)
, tương đương với:
(f (g h j)) x ⇔ x f ((g h j) x)
Nhưng f
làm gì ở đây? (+$:)^:=
là sự kết hợp của hai động từ sử dụng kết hợp Power^:
: một hook khác ( (+$:)
) và một động từ ( =
). Lưu ý ở đây đó f
là dyadic Đập có hai đối số ( x
và (g h j) x
). Vì vậy, chúng ta phải xem xét cách ^:
cư xử. Sự kết hợp sức mạnh f^:o
có một động từ f
và một động từ hoặc một danh từ o
(một danh từ chỉ là một phần của dữ liệu) và áp dụng f
o
thời gian. Ví dụ, lấy o = 3
. Các tương đương sau giữ:
(f^:3) x ⇔ f (f (f x))
x (f^:3) y ⇔ x f (x f (x f y))
Nếu o
là một động từ, tổ hợp sức mạnh sẽ đơn giản đánh giá o
qua các đối số và sử dụng kết quả danh từ làm số lần lặp lại.
Đối với động từ của chúng tôi, o
là =
, động từ bình đẳng. Nó đánh giá để 0
cho các đối số khác nhau và 1
cho các đối số bằng nhau. Chúng tôi lặp lại hook (+$:)
một lần cho các đối số bằng nhau và không có lần nào cho các đối số khác nhau. Để dễ dàng ký hiệu cho lời giải thích, hãy để y ⇔ ((g h j) x)
. Hãy nhớ rằng hook ban đầu của chúng tôi tương đương với điều này:
x (+$:)^:= ((g h j) x)
x (+$:)^:= y
Mở rộng kết hợp, điều này trở thành:
x ((+$:)^:(x = y)) y
Nếu x
và y
giống nhau, điều này trở thành:
x (+$:)^:1 y ⇔ x (+$:) y
Mặt khác, điều này trở thành:
x (+$:)^:0 y ⇔ y
Bây giờ, chúng ta đã thấy dĩa đơn. Ở đây, chúng tôi có một ngã ba dyadic:
x (f g) y ⇔ x f (g y)
Vì vậy, khi x
và y
giống nhau, chúng ta nhận được:
x (+$:) y ⇔ x + ($: y)
Là $:
gì Nó đề cập đến toàn bộ động từ và cho phép đệ quy. Điều này có nghĩa là, khi x
và y are the same, we apply the verb to
y and add
x` với nó.
Nĩa: (g h j) x
Bây giờ, ngã ba bên trong làm gì? Đây là y
trong ví dụ cuối cùng của chúng tôi. Đối với một ngã ba đơn âm của ba động từ, đưa ra một đối số x
, tương đương sau giữ:
(g h j) x ⇔ (g x) h (j x)
Ví dụ tiếp theo này, giả sử chúng ta đã động từ đặt tên SUM
, DIVIDE
và LENGTH
, mà làm những gì bạn cho rằng họ có thể. Nếu chúng ta ghép ba thành một ngã ba, chúng ta sẽ nhận được:
(SUM DIVIDE LENGTH) x ⇔ (SUM x) DIVIDE (LENGTH x)
Ngã ba này ước tính trung bình x
(giả sử x
là một danh sách các số). Trong J, chúng tôi thực sự sẽ viết điều này như ví dụ như +/ % #
.
Một điều cuối cùng về dĩa. Khi "tine" ngoài cùng bên trái (trong trường hợp tượng trưng của chúng tôi ở trên g
) , là một danh từ, nó được coi là một hàm hằng trả về giá trị đó.
Với tất cả điều này, bây giờ chúng ta có thể hiểu ngã ba ở trên:
(1 + ?) x ⇔ (1 x) + (? x)
⇔ 1 + (? x)
?
[ 0 , x )[ 1 , x ]
Để tất cả chúng cùng nhau
Với tất cả những điều này, động từ của chúng tôi tương đương với:
((+$:)^:=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
Điều này thể hiện các chức năng mong muốn.