J , 16 11 ไบต์
(+$:)^:=1+?
ลองออนไลน์!
คำอธิบาย
TL; DR 1+?ทำการรีดตาย, จะทำ(+$:)^:=ซ้ำเฉพาะเมื่อเท่ากับอินพุต
ฟังก์ชั่นเป็นขบวนคำกริยา 4 คำ:
┌─ +
┌───┴─ $:
┌─ ^: ─┴─ =
│
──┤ ┌─ 1
└──────┼─ +
└─ ?
รถไฟคือเมื่อมีคำกริยา 2 ตัวหรือมากกว่าถูกต่อกัน นี่คือคำตอบของแบบฟอร์มf g h j:
(+$:)^:= 1 + ?
f g h j
สิ่งที่เรียกว่า "4 รถไฟ" จะถูกแยกวิเคราะห์เป็นเบ็ดและส้อม:
f g h j ⇔ f (g h j)
ดังนั้นคำตอบจึงเท่ากับ:
(+$:)^:= (1 + ?)
Hooks: (f g) xและx (f g) y
monadic hook (one-argument) ของคำกริยาสองตัวที่ได้รับการโต้แย้ง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คือdyadic - มีสองอาร์กิวเมนต์ ( 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
ตอนนี้เราได้เห็นส้อมแบบ monadic แล้ว ที่นี่เรามีส้อมส้อม:
x (f g) y ⇔ x f (g y)
ดังนั้นเมื่อxและyเหมือนกันเราจะได้รับ:
x (+$:) y ⇔ x + ($: y)
คือ$:อะไร มันหมายถึงคำกริยาทั้งหมดและช่วยให้การเรียกซ้ำ ซึ่งหมายความว่าเมื่อใดxและ y are the same, we apply the verb toy and addx` ไป
Forks: (g h j) x
ตอนนี้ส้อมด้านในทำอะไร? นี่เป็นyตัวอย่างสุดท้ายของเรา สำหรับ monadic fork ของคำกริยาสามตัว, ได้รับการโต้แย้ง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
เป็นการแสดงออกถึงฟังก์ชั่นที่ต้องการ