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])
ดังนั้นทุกคำนวณนี้
สิ่งที่เหลืออยู่ตอนนี้คือการดึงค่าแรกของสิ่งนี้ซึ่งเป็นค่าสุดท้ายของฟังก์ชั่นทดสอบที่ใช้ในตัววนซ้ำ นี่เป็นเรื่องง่ายเหมือนการเขียน ( &
) ทางแยกที่มีฟังก์ชั่นส่วนหัว<
ซึ่งจะส่งกลับค่าแรกของรายการ