> <> (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 s
dan 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. r
membalik tumpukan dan {:}
menggeser tumpukan ke kiri (meletakkan i
di ujung tumpukan), menyalin nilai di ujung tumpukan, lalu menggesernya ke kanan. v
memberitahu ikan untuk mulai bergerak ke bawah.
+1xv
+2<v
}
x
memberi 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 v
lagi dan kembali. }
menggeser tumpukan ke kanan, lalu i
berada 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 2
di 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 6
di ujung tumpukan, yang merupakan x, y
koordinat 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 y
posisi 6 adalah garis di bawah ini. x
Posisi 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-[rv
sebenarnya 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 i
itu 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 i
keduanya 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 i
tumpukan yang lama). Kemudian ikan hanya memukul rv
yang 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 m
dan 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 m
dan memindahkannya ke awal tumpukan (meletakkan ti
di 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 *+o
yang 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 s
posisi 0) atau disalin, kemudian tumpukan digeser ke kanan dua kali (menempatkan ti
di depan lagi), kemudian ti
disalin. ?!v
seharusnya sudah cukup mudah dimengerti sekarang. Pada dasarnya jika ti
0 maka kita keluar dari fungsi dengan v
, kalau tidak kita jalankan !
dan lewati v
(melakukan loop lain).
Jika ti
0 dan kita selesai mengeluarkan karakter yang sedikit acak, maka kita jalankan v
dan lihat:
v ~}}r]~<
.43<
Tidak ada yang terlalu mewah di sini. Kami menghapus ti
dari 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). v
memberitahu 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, 4
sebenarnya 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 whitespaceTrimmer
dijalankan.