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) xvà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 fvà (g h j), tương đương với:
(f (g h j)) x ⇔ x f ((g h j) x)
Nhưng flà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 đó flà dyadic Đập có hai đối số ( xvà (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^:ocó một động từ fvà 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 othờ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 olà một động từ, tổ hợp sức mạnh sẽ đơn giản đánh giá oqua 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, olà =, động từ bình đẳng. Nó đánh giá để 0cho các đối số khác nhau và 1cho 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 xvà ygiố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 xvà ygiố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 xvà y are the same, we apply the verb toy and addx` với nó.
Nĩa: (g h j) x
Bây giờ, ngã ba bên trong làm gì? Đây là ytrong 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, DIVIDEvà 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ử xlà 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.