> <> (ปลา), 107 106 103 ไบต์
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
ลองออนไลน์!
มันไม่ใช่การสุ่มแบบสุ่ม แต่เป็นการสุ่ม เพียงวางสตริงและจำนวนเต็มลงในสแต็ก (ตัวอย่าง: "Hello world!", 5)
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
คำอธิบายแบบเต็ม
นี่เป็นรหัสรุ่นเก่ากว่าเล็กน้อยจนกว่าฉันจะอัปเดตคำอธิบาย มันเหมือนกันส่วนใหญ่อ่านได้ง่ายขึ้นนิดหน่อย:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
เราจะแกล้งว่าพารามิเตอร์สตริงคือsและพารามิเตอร์จำนวนเต็มiพารามิเตอร์จำนวนเต็มคือ
< v}:{r&" "
ตัว<บอกให้ปลาเคลื่อนตัวไปทางซ้ายทันทีซึ่งล้อมรอบไป" "ด้วยซึ่งจะเพิ่มช่องว่างลงในสแต็ก จากนั้นปลาจะเดินทางไป&ซึ่งจะเป็นการเพิ่มพื้นที่ลงทะเบียน rย้อนกลับสแต็กและ{:}เลื่อนสแต็กไปทางซ้าย (วางiที่ส่วนท้ายของสแต็ค) คัดลอกค่าที่ส่วนท้ายของสแต็กจากนั้นเลื่อนไปทางขวา vบอกให้ปลาเริ่มเคลื่อนตัวลง
+1xv
+2<v
}
xบอกให้ปลาเคลื่อนที่ไปในทิศทางที่สุ่มในที่สุดทำให้ปลาเดินไปทางขวาและลงไปเรื่อย ๆ หรือผ่าน1+หรือ2+ก่อนหน้า เหล่านี้เพิ่ม 1 หรือ 2 ตามลำดับไปยังหมายเลขในตอนท้ายของสแต็ค หากปลาเดินทางขึ้นไปมันจะชนvอีกครั้งและถอยหลังลง }เลื่อนสแต็กไปทางขวาจากนั้นให้iอยู่ที่ตำแหน่งที่ 1 บนสแต็กและตัวแปรใหม่นี้ที่ตำแหน่ง 0 (เราจะเรียกมันว่าm)
:&:<~ v!?=&
ในส่วนนี้จะเป็นฟังก์ชั่นขอเรียกว่าwhitespaceTrimmer มันเริ่มต้นตรงไหน<เป็น มันจะแยกช่องว่างที่อยู่ที่ท้ายสแต็ก (ดังนั้นจุดเริ่มต้นของสตริง) จนกระทั่งมันทำงานเป็นอักขระที่ไม่ใช่ช่องว่าง
ดังนั้นทันทีที่ปลาแหวกว่ายเข้า<และต้องเดินทางไปทางซ้าย จากนั้นมันก็วิ่งเข้ามา:&:&ซึ่งคัดลอกค่าที่ส่วนท้ายของสแต็กวางพื้นที่จากรีจิสเตอร์ไปยังจุดสิ้นสุดของสแต็กคัดลอกจากนั้นวางกลับไปที่รีจิสเตอร์
จากนั้นปลาก็ชน=?!v ~กันหรือเจาะจงเป็นพิเศษ=ซึ่งโผล่ออกมาสองค่าสุดท้าย (ทั้งสองที่เราเพิ่งสร้าง) ออกจากสแต็กเปรียบเทียบกับพวกมันวาง 1 ที่ส่วนท้ายของสแต็กถ้าพวกมันเท่ากันและ 0 บน จุดสิ้นสุดของสแต็กหากพวกเขาแตกต่างกัน ?ปรากฏค่าใหม่ออกจากปลายสแต็คถ้ามันเป็น 0 ก็ไม่ได้ดำเนินการตามคำแนะนำต่อไปซึ่งในกรณีนี้คือ!มันแทนรันvซึ่งคำสั่งซื้อปลาที่จะย้ายลง (ออกจากฟังก์ชั่น)
หากเป็น 1 อย่างไรก็ตามจะพบช่องว่างจึงทำการประมวลผล!ซึ่งเป็นแทรมโพลีนและทำให้ปลาข้ามคำสั่งถัดไปซึ่งก็คือ a vดังนั้นปลาจะดำเนินต่อไป ที่ด้านหน้าของปลาจะเห็น~ว่ามันบอกให้ป๊อปอัพค่าสุดท้ายออกจากสแต็ค (ยืนยันว่าจะเป็นช่องว่าง) จากนั้นปลายังคงดำเนินต่อไปและทำงานฟังก์ชั่นอีกครั้ง
?!;a6.>ol2-
ปลาจะถูกบอกให้ว่ายทันทีโดย a >จากนั้นออกอักขระสุดท้ายในสแต็กด้วยo(ซึ่งครั้งแรกที่เรียกใช้นี้คืออักขระแรกของs) จะได้รับความยาวของสแต็คจากที่l, สถานที่2ที่สิ้นสุดของสแต็คแล้ว-ทำให้เกิด 2 lจะถูกหักออกจาก มันกระทบ?!;ซึ่งการจำสิ่งที่?ทำให้ปลาข้าม!หากกองว่างเปล่าและลงจอดบน;ซึ่งจบโปรแกรม
การติดตามหากยังมีอักขระอยู่ในสแต็กเราเรียกใช้งาน!ซึ่งทำให้ปลาเด้งข้าม;และดำเนินการa6.ซึ่งจัดเก็บa(AKA 10) และ6ที่ส่วนท้ายของสแต็กซึ่งเป็นx, yพิกัดสำหรับ.ซึ่งจะปรากฏขึ้นเมื่อสิ้นสุด สแต็คจากนั้นเคลื่อนย้ายปลาไปที่10, 6และดำเนินการคำสั่งทางด้านขวาของตำแหน่งนั้น (ขณะที่ปลากำลังว่ายน้ำ)
มันซับซ้อนน้อยกว่าฟังดูเมื่อคุณรู้ว่าyตำแหน่งที่ 6 เป็นเส้นด้านล่างนี้ xตำแหน่งที่ 10 นั้นคือvและทางด้านขวาของซึ่งก็คือไม่มี -op นี่เป็นสาเหตุที่ปลาจะว่ายต่อไปอย่างถูกต้องและเริ่มดำเนินการจริงที่จุดเริ่มต้นของบรรทัด ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
นี่คือฟังก์ชั่นที่เพิ่มข้อความแบบสุ่มระหว่างตัวละคร มันเป็นคำหนึ่งเล็กน้อย แต่นั่นเป็นเพียงเพราะฉันพยายามทำให้มันสุ่มเพิ่มขึ้นเล็กน้อย เรียกสิ่งนี้ว่า genRandomCharsกัน
นี่:{{:}l1-[rvคือการตั้งค่าสำหรับฟังก์ชั่นและส่วนหนึ่งของฟังก์ชั่นจริงนั้นเอง ปลาแรกแหวกว่าย:{{ซึ่งคัดลอกค่าที่ส่วนท้ายของสแต็กจากนั้นเลื่อนไปทางซ้ายสองครั้ง หากคุณจำได้ว่าiอยู่ในตำแหน่งที่ 1 ในสแต็กคุณก็จะรู้iตอนนี้อยู่ที่ส่วนท้ายของสแต็ก
จากนั้นปลาจะแหวกว่ายไป:}ที่สำเนาiใดและเลื่อนสแต็กไปทางขวาวางiทั้งที่จุดเริ่มต้นและจุดสิ้นสุดของสแต็ก l1-[ให้ปลาวางความยาวที่ส่วนท้ายของสแต็กลบ 1 จากนั้น[สร้างสแต็คใหม่ย้ายค่าl-1(ความยาวสแต็กลบ 1) ไปที่สแต็กใหม่ (ดังนั้นเพียงปล่อยiให้สแต็คเก่า) จากนั้นปลาก็กระทบrvซึ่งจะทำให้สแต็กกลับมาอีกครั้ง (ฉันคิดว่าการสร้างสแต็กใหม่จะทำให้มันกลับด้านด้วยเหตุผลบางอย่าง) และสั่งให้ปลาลงไปว่ายน้ำอีกครั้งโดยเริ่มจากหน้าที่<ด้านล่าง
ดังนั้นในตอนท้ายของสแต็กมีmและของเราชั่วคราวitiซึ่งเราจะเรียก ทันทีที่ปลาแหวกว่าย1-}ซึ่งจะลบ 1 จากtiและย้ายไปที่จุดเริ่มต้นของสแต็ก จากนั้น:}ซึ่งเพียงคัดลอกmและย้ายไปยังจุดเริ่มต้นของสแต็กtiที่ตำแหน่งสแต็ก 1)
นี่คือเมื่อเราตีสิ่งเล็ก ๆ น้อย ๆ นี้:
v2<
<1x|!
^3<
นี่มันง่ายมากที่ตายแล้ว !สาเหตุที่ทำให้ปลาที่จะข้ามไป|xและดำเนินการ จดจำสิ่งที่xไม่เราจำไว้ว่านี้ทำให้ย้ายปลาใน 4 ทิศทาง |เป็นเพียงกระจกเงาและทำให้ปลากลับมาว่ายน้ำได้xได้ ดังนั้นโดยพื้นฐานแล้วปลาจะวาง 1, 2 หรือ 3 ลงบนปลายสแต็คแล้วเคลื่อนที่ต่อไปทางซ้ายพันรอบ
จากนั้นปลาจะทำการประมวลผล*+oซึ่งทำให้ค่าสองค่าสุดท้ายในสแต็กถูกแตกออกคูณด้วยกันและผลลัพธ์จะดันกลับมาจากนั้นสิ่งเดียวกันด้วยการเพิ่มจากนั้นค่าสุดท้ายจะถูกตอกออกจากสแต็กและส่งออกด้วยoและเอาท์พุทด้วย สแต็คของเราอยู่ในขณะนี้ค่อนข้างปกติอีกครั้งที่มีเพียง [ m, ti,s ]
:}}:ทำให้ค่าที่ส่วนท้ายของสแต็ก (โดยทั่วไปsตำแหน่ง 0) ot ถูกคัดลอกจากนั้นสแต็กจะถูกเลื่อนไปทางขวาสองครั้ง (วางtiที่ด้านหน้าอีกครั้ง) จากนั้นtiจะถูกคัดลอก ?!vน่าจะเข้าใจได้ง่ายในตอนนี้ โดยทั่วไปถ้าtiเป็น 0 เราจะออกจากฟังก์ชั่นด้วยvมิฉะนั้นเราจะดำเนินการ!และข้ามv (ทำลูปอื่น)
ถ้า tiเป็น 0 และเราทำการส่งออกอักขระสุ่มเล็กน้อยแล้วเราจะดำเนินการvและดู:
v ~}}r]~<
.43<
ไม่มีอะไรแฟนซีเกินไปที่นี่ เราจะลบจากสแต็คผ่านทางti ~จากนั้น]เป็นของใหม่จะดึงค่าทั้งหมดของเราออกจากสแต็กและวางลงบนสแต็กเก่า! เนื่องจากปัญหาการกลับรายการที่เราย้อนกลับด้วยrแล้วเปลี่ยนสแต็คขวาสองครั้งด้วย}}~, shufting สแต็คไปทางขวาให้เรา [ m, i, s] ที่~คือการลบพิเศษซ้ำs[0]จากก่อนหน้านี้ในฟังก์ชั่นที่เราจะต้องได้ถ้า เรากำลังทำลูป (แต่เราไม่ใช่เรากำลังออก) vบอกให้ปลาแหวกว่ายแล้วเข้า>34.(กลับหัวเพื่อแสดงลำดับการประหารชีวิต) ซึ่งบอกให้ปลาว่ายง่ายๆว่ายไปทางซ้ายและเข้า3, 4(เพราะตัว.เป็นการกระโดด!) 3, 4อันที่จริงเป็นเพียงทางด้านขวาของการเริ่มต้นwhitespaceTrimmerซึ่งสมบูรณ์แบบเพราะเรากำลังเดินทางไปทางซ้าย
ตามตรรกะทั้งหมดนี้เราสามารถติดตามปลาได้จนกว่าสแต็กจะว่างเปล่าในที่สุดและโปรแกรมจะออกหลังจากwhitespaceTrimmerทำงาน