p
\Ai
\&
>(&]&|0
<*&d
&~bN
10
( )/+
/*
ลองออนไลน์!
คำอธิบาย
นี่คือโปรแกรมที่ซับซ้อนที่สุด (และยาวที่สุด) ที่ฉันเคยเขียนในแมงกะพรุนจนถึงตอนนี้ ฉันไม่รู้ว่าฉันจะสามารถทำลายสิ่งนี้ในลักษณะที่เข้าใจได้หรือไม่ แต่ฉันคิดว่าฉันต้องลอง
แมงกะพรุนเป็นผู้ให้บริการการทำซ้ำที่ค่อนข้างทั่วไป\ซึ่งช่วยได้มากในการ "ค้นหาสิ่งที่ Nth " หนึ่งในความหมายของมันคือ "วนซ้ำฟังก์ชันบนค่าจนกว่าฟังก์ชันทดสอบแยกจะให้ความจริง" (อันที่จริงฟังก์ชั่นทดสอบได้รับทั้งองค์ประกอบปัจจุบันและองค์ประกอบสุดท้าย แต่เราจะทำให้ดูองค์ประกอบปัจจุบันเท่านั้น) . เราสามารถใช้ฟังก์ชันนี้เพื่อใช้ฟังก์ชั่น "หมายเลขที่ถูกต้องต่อไป" การโอเวอร์โหลดอีกอัน\คือ "ทำซ้ำฟังก์ชันบนค่าเริ่มต้น N คูณ" เราสามารถใช้ฟังก์ชั่นก่อนหน้าของเราและวนซ้ำใน0เวลา N โดยที่ N คืออินพุต ทั้งหมดนี้ได้รับการเซ็ตอัพอย่างรัดกุมกับส่วนนี้ของรหัส:
p
\Ai
\&
> 0
(เหตุผลว่าทำไม0อินพุตที่แท้จริงของฟังก์ชันที่ได้นั้นมีความซับซ้อนเล็กน้อยและฉันจะไม่เข้าไปที่นี่)
ปัญหาทั้งหมดนี้คือเราจะไม่ส่งค่าปัจจุบันไปยังฟังก์ชันทดสอบด้วยตนเอง \ผู้ประกอบการจะทำเช่นนี้สำหรับเรา ดังนั้นตอนนี้เราได้สร้างฟังก์ชัน unary เดียว (ผ่านการแต่งเพลงตะขอส้อมและการแกง) ซึ่งใช้ตัวเลขและบอกเราว่ามันเป็นตัวเลขที่ถูกต้องหรือไม่ (เช่นที่ถูกหารด้วยผลรวมหลักและผลิตภัณฑ์หลัก) สิ่งนี้ค่อนข้างไม่สำคัญเมื่อคุณไม่สามารถอ้างถึงข้อโต้แย้งได้ เคย มันคือความงามนี้:
(&]&|
<*&d
&~bN
10
( )/+
/*
(เป็นเอกเบ็ดซึ่งหมายความว่ามันเรียกฟังก์ชั่นด้านล่าง ( f) กับการป้อนข้อมูลของตน (ค่าปัจจุบันx) แล้วผ่านทั้งสองของพวกเขาไปยังฟังก์ชั่นการทดสอบไปทางขวา ( g) g(f(x), x)นั่นคือมันคำนวณ
ในกรณีของเราเป็นอีกหนึ่งฟังก์ชั่นคอมโพสิตที่ได้รับคู่กับหลักผลิตภัณฑ์และหลักผลรวมของf(x) xนั่นหมายความว่าgจะเป็นฟังก์ชั่นที่มีทั้งสามค่าเพื่อตรวจสอบว่าxถูกต้อง
เราจะเริ่มต้นโดยดูที่การfคำนวณผลรวมหลักและผลิตภัณฑ์หลัก นี่คือf:
&~b
10
( )/*
/+
&ยังเป็นองค์ประกอบ (แต่วิธีอื่น ๆ รอบ) ~เป็นความดีความชอบเพื่อ10~bช่วยให้การทำงานที่คำนวณตัวเลขทศนิยมของตัวเลขและเนื่องจากเรากำลังผ่านที่จากขวานั่นคือสิ่งแรกที่จะเกิดขึ้นกับการป้อนข้อมูล& xส่วนที่เหลือใช้รายการตัวเลขนี้เพื่อคำนวณผลรวมและผลิตภัณฑ์
ในการคำนวณจำนวนเงินที่เราสามารถพับ/+นอกจากมากกว่านั้นซึ่งเป็น /*ในทำนองเดียวกันการคำนวณสินค้าที่เราพับคูณมากกว่านั้นด้วย ที่จะรวมทั้งผลเหล่านี้เป็นคู่ที่เราใช้คู่ของตะขอ, และ( )โครงสร้างของสิ่งนี้คือ:
()g
f
(ที่ไหนfและgเป็นผลิตภัณฑ์และผลรวมตามลำดับ.) ลองที่จะคิดออกว่าทำไมนี้จะช่วยให้เราคู่และf(x) g(x)โปรดทราบว่าเบ็ดขวา)มีเพียงหนึ่งอาร์กิวเมนต์ ในกรณีนี้ข้อโต้แย้งอื่น ๆ ก็ส่อให้เห็นว่า;สิ่งใดที่ล้อมข้อโต้แย้งเป็นคู่ นอกจากนี้ hooks ยังสามารถใช้เป็นฟังก์ชันไบนารี (ซึ่งจะเป็นกรณีที่นี่) ซึ่งในกรณีที่พวกเขาเพียงแค่ใช้ฟังก์ชั่นภายในเพียงหนึ่งอาร์กิวเมนต์ ดังนั้นจริงๆ)ในฟังก์ชั่นเดียวให้ฟังก์ชั่นที่คำนวณg [x, g(y)]ใช้ในเบ็ดซ้ายร่วมกับเราได้f [f(x), g(y)]ในทางกลับกันนี่ถูกใช้ในบริบทที่เป็นเอกภาพซึ่งหมายความว่ามันถูกเรียกด้วยจริงๆx == yและเราก็จบลงด้วย[f(x), g(x)]ความต้องการ วุ้ย.
gที่ใบเพียงสิ่งเดียวซึ่งเป็นฟังก์ชั่นการทดสอบก่อนหน้านี้ของเรา จำได้ว่ามันจะถูกเรียกว่าเป็นg([p, s], x)ที่ที่xยังคงเป็นค่าอินพุตปัจจุบันpเป็นผลิตภัณฑ์หลักและsเป็นผลรวมหลักของมัน นี่คือg:
&]&|
<*&d
N
เพื่อทดสอบการหารเราจะใช้โมดูโลอย่างชัดเจน|ในแมงกะพรุน ค่อนข้างผิดปกติมันใช้โอเปอเรเตอร์ทางขวามือโมดูโลของมันโอเปอเรเตอร์ซ้ายมือซึ่งหมายความว่าอาร์กิวเมนต์gมีอยู่แล้วในลำดับที่ถูกต้อง (ฟังก์ชั่นทางคณิตศาสตร์เช่นนี้จะเธรดโดยอัตโนมัติผ่านรายการ . หมายเลขของเราหารด้วยทั้งผลิตภัณฑ์และผลรวมถ้าผลลัพธ์คือเลขศูนย์ เพื่อตรวจสอบว่าเป็นกรณีนี้หรือไม่เราถือว่าทั้งคู่เป็นรายการของเลขฐาน 2 ( d) ผลลัพธ์ของสิ่งนี้คือศูนย์เฉพาะเมื่อองค์ประกอบทั้งคู่ของทั้งคู่เป็นศูนย์ดังนั้นเราจึงสามารถลบล้างผลลัพธ์ของสิ่งนี้ ( N) เพื่อรับค่าความจริงว่าค่าทั้งสองแบ่งการป้อนเข้าหรือไม่ โปรดทราบว่า|, dและNทั้งหมดนั้นประกอบไปด้วยคู่ของ&s
น่าเสียดายที่นั่นไม่ใช่เรื่องเต็ม เกิดอะไรขึ้นถ้าผลิตภัณฑ์หลักเป็นศูนย์ การหารและโมดูโลตามศูนย์ทั้งคู่จะคืนค่าเป็นศูนย์ในแมงกะพรุน แม้ว่าสิ่งนี้อาจดูเหมือนการประชุมที่ค่อนข้างแปลก แต่จริงๆแล้วมันมีประโยชน์บ้าง (เพราะเราไม่จำเป็นต้องตรวจสอบศูนย์ก่อนที่จะทำการโมดูโล) อย่างไรก็ตามมันก็หมายความว่าเราจะได้รับผลบวกปลอมหากผลรวมหลักแบ่งการป้อนข้อมูล แต่ผลิตภัณฑ์หลักคือศูนย์ (เช่นการป้อนข้อมูล10)
เราสามารถแก้ไขได้โดยการคูณผลหารหารของเราด้วยผลิตภัณฑ์หลัก (ดังนั้นหากผลิตภัณฑ์หลักเป็นศูนย์มันจะเปลี่ยนค่าความจริงของเราให้เป็นศูนย์เช่นกัน) มันจะง่ายกว่าที่จะคูณผลลัพธ์การหารด้วยคู่ของผลิตภัณฑ์และผลรวมและแยกผลลัพธ์จากผลิตภัณฑ์ในภายหลัง
ในการทวีคูณผลลัพธ์ด้วยคู่เราต้องกลับไปที่ค่าก่อนหน้า (คู่) วิธีนี้ใช้ส้อม ( ]) ส้อมเป็น kinda เหมือน hooks บนเตียรอยด์ ถ้าคุณให้พวกเขาทั้งสองฟังก์ชั่นfและพวกเขาเป็นตัวแทนของฟังก์ชั่นไบนารีซึ่งคำนวณg f(a, g(a, b))ในกรณีของเราaคือคู่ผลิตภัณฑ์ / ผลรวมbคือค่าอินพุตปัจจุบันgคือการทดสอบการหารของเราและfเป็นการคูณ [p, s] * ([p, s] % x == [0, 0])ดังนั้นทุกคำนวณนี้
สิ่งที่เหลืออยู่ตอนนี้คือการดึงค่าแรกของสิ่งนี้ซึ่งเป็นค่าสุดท้ายของฟังก์ชั่นทดสอบที่ใช้ในตัววนซ้ำ นี่เป็นเรื่องง่ายเหมือนการเขียน ( &) ทางแยกที่มีฟังก์ชั่นส่วนหัว<ซึ่งจะส่งกลับค่าแรกของรายการ