> <> (Cá), 107 106 103 byte
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
Hãy thử trực tuyến!
Nó không phải là siêu ngẫu nhiên, nhưng nó là ngẫu nhiên. Chỉ cần đặt chuỗi và số nguyên trên ngăn xếp (Ví dụ: "Hello world!", 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
Giải thích đầy đủ
Đây là một phiên bản cũ hơn của mã, cho đến khi tôi cập nhật lời giải thích. Nó hầu như giống nhau, chỉ có thể dễ đọc hơn một chút:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Chúng ta sẽ giả vờ tham số chuỗi là s
và tham số nguyên là i
.
< v}:{r&" "
Nó <
nói với con cá ngay lập tức di chuyển sang trái, nó quấn quanh " "
, làm tăng thêm một không gian được xếp vào ngăn xếp. Sau đó, cá đi qua &
, mà thêm không gian để đăng ký.r
đảo ngược ngăn xếp và {:}
dịch chuyển ngăn xếp sang trái (đặt i
vào cuối ngăn xếp), sao chép giá trị ở cuối ngăn xếp, sau đó chuyển nó sang bên phải. v
nói với cá để bắt đầu di chuyển xuống dưới.
+1xv
+2<v
}
x
bảo cá di chuyển theo một hướng ngẫu nhiên, cuối cùng dẫn đến việc cá đi đúng hướng và tiếp tục đi xuống, hoặc vượt qua 1+
hoặc 2+
trước đó. Chúng thêm 1 hoặc 2 tương ứng vào số ở cuối ngăn xếp. Nếu con cá di chuyển lên trên, nó v
lại đánh và đi xuống. }
dịch chuyển ngăn xếp sang phải, sau đó có i
vị trí 1 trên ngăn xếp và biến mới này ở vị trí 0 (chúng ta sẽ gọi nó m
).
:&:<~ v!?=&
Phần này là một hàm, hãy gọi nó là whitespaceTrimmer . Nó bắt đầu ở đâu<
có. Nó chỉ đơn giản là loại bỏ các khoảng trắng ở cuối ngăn xếp (vì vậy là phần đầu của chuỗi) cho đến khi nó chạy vào một ký tự không phải khoảng trắng.
Vì vậy, ngay lập tức cá bơi vào một <
và phải đi sang bên trái. Sau đó nó chạy vào:&:&
đó sao chép giá trị ở cuối ngăn xếp, đặt khoảng trống từ thanh ghi vào cuối ngăn xếp, sao chép nó, sau đó đặt nó trở lại vào thanh ghi.
Sau đó, cá đánh =?!v ~
, hoặc cụ thể hơn,=
bật ra hai giá trị cuối cùng (hai giá trị chúng ta vừa tạo) ra khỏi ngăn xếp, so sánh chúng, đặt 1 vào cuối ngăn xếp nếu chúng bằng nhau và 0 trên cuối của ngăn xếp nếu chúng khác nhau. Các?
bật giá trị mới ra khỏi cuối của ngăn xếp, nếu nó là 0 nó không thực hiện lệnh kế tiếp, mà trong trường hợp này là !
, nó thay vì thực thiv
, mà đơn đặt hàng cá để di chuyển xuống dưới (thoát khỏi chức năng).
Tuy nhiên, nếu là 1, thì nó đã tìm thấy một khoảng trắng, vì vậy nó thực thi cái !
đó là tấm bạt lò xo và khiến con cá bỏ qua hướng dẫn tiếp theo, đó là mộtv
con cá, vì vậy con cá tiếp tục. Trước mặt cá, nó thấy~
nó bảo nó bật giá trị cuối cùng ra khỏi ngăn xếp (được xác nhận là khoảng trắng), sau đó con cá tiếp tục và chạy lại chức năng.
?!;a6.>ol2-
Con cá ngay lập tức được yêu cầu bơi ngay bởi a >
, sau đó xuất ký tự cuối cùng trên ngăn xếp o
(mà, lần đầu tiên nó chạy, là ký tự đầu tiên của s
). Nó lấy chiều dài của ngăn xếp từ l
, đặt a 2
vào cuối ngăn xếp, sau đó -
làm cho 2 bị trừ đi l
. Nó đánh vào ?!;
đó, ghi nhớ những gì ?
làm, khiến cá bỏ qua !
nếu ngăn xếp trống và hạ cánh trên;
, kết thúc chương trình.
Theo sau nếu vẫn còn các ký tự trên ngăn xếp, chúng tôi thực thi !
khiến cá bật lên ;
và thực hiện a6.
, lưu trữ a
(AKA 10
) và 6
ở cuối ngăn xếp, là x, y
tọa độ cho .
, chúng bật ra khỏi cuối của ngăn xếp xếp chồng lên nhau, sau đó dịch chuyển cá đến10, 6
, và thực hiện các hướng dẫn ở bên phải của postion đó (như cá đang bơi bên phải).
Điều này ít phức tạp hơn âm thanh khi bạn nhận ra y
vị trí 6 là dòng bên dưới vị trí này. x
vị trí 10 là sau đó v
, và bên phải là vị trí
không có. Điều này khiến cá tiếp tục bơi đúng và thực sự bắt đầu hành quyết ở đầu dòng ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Vì vậy, đây là chức năng thêm văn bản ngẫu nhiên ở giữa các ký tự. Đó là một chút của một miệng, nhưng đó chỉ là vì tôi đã cố gắng làm cho nó thêm một chút ngẫu nhiên. Hãy gọi nó là genRandomChars .
Đây :{{:}l1-[rv
thực sự là thiết lập cho chức năng, và một phần ít hơn của chính chức năng thực tế. Đầu tiên con cá bơi qua :{{
đó sao chép giá trị ở cuối ngăn xếp, sau đó dịch chuyển nó sang bên trái hai lần. Nếu bạn nhớ lại rằngi
là ở tư thế 1 trên stack, thì bạn sẽ biếti
giờ đã ở cuối ngăn xếp.
Sau đó, cá bơi qua các :}
bản sao i
và dịch chuyển chồng sang phải, đặt i
cả ở đầu và cuối của ngăn xếp. l1-[
có con cá đặt chiều dài ở cuối ngăn xếp, trừ đi 1 từ nó, sau đó [
tạo một l-1
giá trị ngăn xếp mới, di chuyển (chiều dài ngăn xếp trừ 1) sang ngăn xếp mới (vì vậy chỉ cần để lại i
trên ngăn xếp cũ). Sau đó, con cá chỉ đơn giản là đánh vào rv
đảo ngược ngăn xếp một lần nữa (tôi nghĩ rằng việc tạo ra một ngăn xếp mới đảo ngược nó vì lý do nào đó) và ra lệnh cho cá bơi xuống một lần nữa, thực sự bắt đầu chức năng tại<
bên dưới.
Vì vậy, hiện tại cuối của ngăn xếp có m
và tạm thời của chúng tôi i
, chúng tôi sẽ gọi ti
. Ngay lập tức con cá bơi qua 1-}
, trừ đi 1 ti
và di chuyển nó đến đầu ngăn xếp. Sau đó :}
, chỉ cần sao chép m
và di chuyển nó đến đầu ngăn xếp (đặt ti
ở vị trí ngăn xếp 1).
Đây là khi chúng ta đạt được điều nhỏ nhặt này:
v2<
<1x|!
^3<
Điều này thực sự đã chết đơn giản. Các !
nguyên nhân khiến cá bỏ qua |
và thực hiện x
. Ghi nhớ những gì x
không, chúng tôi nhớ điều này làm cho cá di chuyển theo bất kỳ 4 hướng. |
chỉ đơn giản là một tấm gương và khiến cá bơi trở lại x
. Vì vậy, về cơ bản, cá sẽ đặt 1, 2 hoặc 3 vào cuối ngăn xếp và tiếp tục di chuyển sang trái, quấn quanh.
Sau đó, con cá thực hiện *+o
khiến hai giá trị cuối cùng trên ngăn xếp được bật ra, nhân lên với nhau và kết quả được đẩy trở lại, sau đó cùng một điều với phép cộng, sau đó giá trị cuối cùng được bật ra khỏi ngăn xếp và xuất ra o
. Chồng chúng tôi bây giờ là tương đối bình thường trở lại chỉ chứa [ m
, ti
,s
].
:}}:
làm cho giá trị ở cuối ngăn xếp (về cơ bản là s
vị trí 0) bị sao chép, sau đó ngăn xếp được dịch sang phải hai lần (đặt ti
ở mặt trước một lần nữa), sau đó ti
được sao chép. ?!v
nên bây giờ khá dễ hiểu Về cơ bản nếu ti
là 0 thì chúng ta thoát khỏi hàm với v
, nếu không chúng ta thực thi !
và bỏ quav
(thực hiện một vòng lặp khác).
Nếu ti
là 0 và chúng ta đã hoàn thành xuất ra các ký tự hơi ngẫu nhiên, sau đó chúng ta thực thi v
và xem:
v ~}}r]~<
.43<
Không có gì quá lạ mắt ở đây. Chúng tôi loại bỏ ti
khỏi ngăn xếp thông qua ~
. Sau đó ]
là mới, nó bật tất cả các giá trị của chúng tôi ra khỏi ngăn xếp và đặt chúng vào ngăn xếp cũ! Bởi vì vấn đề đảo ngược chúng ta đảo ngược với r
, sau đó chuyển stack phải hai lần với }}~
, shufting chồng sang bên phải, đem lại cho chúng ta [ m
, i
, s
], các ~
là để loại bỏ các thêm nhân đôi s[0]
từ trước đó trong hàm như chúng ta sẽ cần nó nếu chúng tôi đã thực hiện một vòng lặp (nhưng chúng tôi không, chúng tôi đang thoát). v
bảo con cá bơi xuống và đi vào >34.
(đảo ngược để hiển thị thứ tự thực hiện), nó bảo con cá chỉ đơn giản là bơi sang trái và vào 3, 4
(bởi vì.
là một cú nhảy!). 3, 4
thực ra chỉ ở bên phải của sự khởi đầuwhitespaceTrimmer
, đó là hoàn hảo bởi vì chúng tôi đang đi trái.
Theo tất cả logic này, chúng ta có thể theo dõi cá cho đến khi ngăn xếp cuối cùng trống rỗng và chương trình thoát ngay sau khi whitespaceTrimmer
được thực thi.