> <> (Ikan), 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<
Cobalah online!
Itu bukan super acak, tapi itu acak. Tempatkan string dan integer di stack (Contoh: "Hello world!", 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
Penjelasan Lengkap
Ini adalah versi kode yang sedikit lebih lama, hingga saya memperbarui penjelasannya. Sebagian besar sama, hanya mungkin sedikit lebih mudah dibaca:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Kami akan berpura-pura parameter string sdan parameter integer i.
< v}:{r&" "
The <memberitahu ikan untuk segera bergerak ke kiri, yang membungkus sekitar untuk " ", yang menambahkan ruang characted ke stack. Kemudian, ikan berjalan &, yang menambah ruang untuk register. rmembalik tumpukan dan {:}menggeser tumpukan ke kiri (meletakkan idi ujung tumpukan), menyalin nilai di ujung tumpukan, lalu menggesernya ke kanan. vmemberitahu ikan untuk mulai bergerak ke bawah.
+1xv
+2<v
}
xmemberi tahu ikan untuk bergerak ke arah acak, pada akhirnya menghasilkan ikan ke kanan dan terus ke bawah, atau melewati 1+atau 2+sebelumnya. Ini menambahkan 1 atau 2 masing-masing ke nomor di ujung tumpukan. Jika ikan melakukan perjalanan ke atas, ia mengenai vlagi dan kembali. }menggeser tumpukan ke kanan, lalu iberada di posisi 1 di tumpukan dan variabel baru ini di posisi 0 (kami akan menyebutnya m).
:&:<~ v!?=&
Bagian ini adalah fungsi, sebut saja whitespaceTrimmer . Ini dimulai dari mana< . Ini hanya strip ruang yang ada di ujung tumpukan (jadi awal dari string) sampai berjalan ke karakter non-spasi.
Jadi segera ikan berenang ke <dan harus pergi ke kiri. Kemudian berjalan ke:&:& mana menyalin nilai di ujung tumpukan, menempatkan ruang dari register ke ujung tumpukan, menyalinnya, lalu menempatkannya kembali ke register.
Kemudian ikan itu mengenai =?!v ~, atau lebih khusus lagi =, yang mengeluarkan dua nilai terakhir (dua yang baru saja kita buat) dari tumpukan, membandingkannya, menempatkan 1 di ujung tumpukan jika nilainya sama, dan 0 pada akhir tumpukan jika mereka berbeda. The ?muncul nilai baru dari ujung stack, jika 0 tidak menjalankan instruksi berikutnya, yang dalam hal ini adalah !, sebagai gantinya mengeksekusi v, yang perintah ikan bergerak ke bawah (keluar fungsi).
Namun jika itu 1, maka ia telah menemukan ruang, sehingga ia mengeksekusi !yang merupakan trampolin, dan itu menyebabkan ikan untuk melewatkan instruksi berikutnya, yaitu a v, sehingga ikan melanjutkan. Di depan ikan, ia melihat ~yang memberitahu untuk melepaskan nilai terakhir dari tumpukan (dikonfirmasi sebagai spasi), kemudian ikan melanjutkan, dan menjalankan fungsinya lagi.
?!;a6.>ol2-
Ikan segera disuruh berenang tepat oleh a >, lalu mengeluarkan karakter terakhir pada tumpukan dengan o(yang, pertama kali ini dijalankan, adalah karakter pertama s). Ia mendapatkan panjang tumpukan l, menempatkan a 2di ujung tumpukan, lalu -menyebabkan 2 dikurangi l. Itu hits ?!;yang, mengingat apa yang ?terjadi, menyebabkan ikan untuk melewatkan !jika tumpukan kosong, dan mendarat; , yang mengakhiri program.
Mengikuti jika masih ada karakter di stack, kita mengeksekusi !yang menyebabkan ikan melambung di atas ;dan mengeksekusi a6., yang menyimpan a(AKA 10), dan 6di ujung tumpukan, yang merupakan x, ykoordinat untuk ., yang mengeluarkan mereka dari ujung tumpukan, lalu teleport ikan ke 10, 6, dan jalankan instruksi di sebelah kanan posisi itu (seperti ikan berenang dengan benar).
Ini kurang rumit daripada kedengarannya ketika Anda menyadari yposisi 6 adalah garis di bawah ini. xPosisi 10 adalah kemudian v, dan di sebelah kanan itu , yang merupakan no-op. Hal ini menyebabkan ikan terus berenang dengan benar dan benar-benar memulai eksekusi pada awal baris ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Jadi ini adalah fungsi yang menambahkan teks acak di antara karakter. Ini sedikit suap, tapi itu hanya karena aku mencoba membuatnya sedikit lebih acak. Sebut saja genRandomChars ini .
The :{{:}l1-[rvsebenarnya adalah setup untuk fungsi, dan kurang-jadi bagian dari fungsi yang sebenarnya itu sendiri. Ikan pertama berenang di :{{mana salinan nilai pada ujung tumpukan, kemudian menggesernya ke kiri dua kali. Jika Anda ingat iitu pada posisi 1 di stack, maka Anda akan tahui sekarang di ujung stack.
Ikan kemudian berenang di atas :}salinan mana i, dan menggeser tumpukan ke kanan, menempatkan ikeduanya di awal dan akhir tumpukan. l1-[minta ikan untuk meletakkan panjang di ujung tumpukan, kurangi 1 dari itu, lalu[ buat tumpukan baru, bergerak l-1(panjang tumpukan minus 1) nilai ke tumpukan baru (jadi hanya meninggalkan itumpukan yang lama). Kemudian ikan hanya memukul rvyang membalikkan tumpukan lagi (saya pikir membuat tumpukan baru membalikkannya untuk beberapa alasan), dan memerintahkan ikan untuk berenang ke bawah sekali lagi, benar-benar memulai fungsi di< bawah.
Jadi saat ini akhir dari tumpukan telah mdan sementara kami i, yang akan kami panggil ti. Segera ikan berenang 1-}, yang mengurangi 1 dariti dan memindahkannya ke awal tumpukan. Kemudian :}yang cukup menyalin mdan memindahkannya ke awal tumpukan (meletakkan tidi posisi tumpukan 1).
Inilah saatnya kita mengenai hal kecil ini:
v2<
<1x|!
^3<
Ini sebenarnya sangat sederhana. The !menyebabkan ikan untuk melewati |dan mengeksekusi x. Mengingat apax terjadi, kita ingat ini membuat ikan bergerak ke 4 arah. |hanyalah sebuah cermin, dan menyebabkan ikan berenang kembali ke x. Jadi pada dasarnya, ikan akan menempatkan 1, 2, atau 3 di ujung tumpukan, dan terus bergerak ke kiri, membungkus.
Ikan kemudian dieksekusi *+oyang menyebabkan dua nilai terakhir pada tumpukan akan muncul, dikalikan bersama, dan hasilnya mendorong kembali, kemudian hal yang sama dengan penambahan, maka nilai akhir muncul dari tumpukan dan dikeluarkan dengan o. Tumpukan kami sekarang relatif normal kembali hanya berisi [ m, ti, s].
:}}:menyebabkan nilai di ujung tumpukan (pada dasarnya sposisi 0) atau disalin, kemudian tumpukan digeser ke kanan dua kali (menempatkan tidi depan lagi), kemudian tidisalin. ?!vseharusnya sudah cukup mudah dimengerti sekarang. Pada dasarnya jika ti0 maka kita keluar dari fungsi dengan v, kalau tidak kita jalankan !dan lewati v(melakukan loop lain).
Jika ti0 dan kita selesai mengeluarkan karakter yang sedikit acak, maka kita jalankan vdan lihat:
v ~}}r]~<
.43<
Tidak ada yang terlalu mewah di sini. Kami menghapus tidari tumpukan via ~. Kemudian ]baru, ia mengeluarkan semua nilai kami dari tumpukan dan menempatkannya di tumpukan yang lama! Karena masalah pembalikan kita membalikkan dengan r, maka menggeser tumpukan kanan dua kali dengan }}~, shufting tumpukan ke kanan, memberikan kita [ m, i, s], yang ~adalah untuk menghapus ekstra digandakan s[0]dari sebelumnya dalam fungsi seperti yang kita akan membutuhkannya jika kami melakukan perulangan (tapi tidak, kami keluar). vmemberitahu ikan untuk berenang ke bawah dan ke dalam >34.(terbalik untuk menunjukkan perintah eksekusi), yang memberi tahu ikan untuk hanya berenang ke kiri dan ke dalam 3, 4(karena itu .adalah lompatan!). 3, 4sebenarnya hanya di sebelah kanan awalwhitespaceTrimmer , yang sempurna karena kita bepergian ke kiri.
Mengikuti semua logika ini, kita dapat mengikuti ikan sampai tumpukan akhirnya kosong dan program keluar setelah whitespaceTrimmerdijalankan.