> <> (ปลา), 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
และของเราชั่วคราวi
ti
ซึ่งเราจะเรียก ทันทีที่ปลาแหวกว่าย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
ทำงาน