> <> (Balık), 107 106 103 bayt
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
Çevrimiçi deneyin!
Süper rastgele değil, ama rastgele. Dizeyi ve tamsayıyı yığına yerleştirin (Örnek: "Merhaba dünya!", 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
Tam Açıklama
Açıklamayı güncelleyene kadar bu, kodun biraz daha eski bir sürümüdür. Çoğunlukla aynı, belki de okumak biraz daha kolay:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
String parametresinin sve integer parametresinin taklit edeceğiz i.
< v}:{r&" "
<Etrafında sarar sola hemen taşımak için balık, söyler " "yığınına characted bir boşluk ekler. Daha sonra balık dolaşır &, bu da sicile alan ekler. ryığını tersine çevirir ve yığını {:}sola kaydırır (yığının isonuna koyarak ), yığının ucundaki değeri kopyalar, sonra sağa kaydırır. vbalıklara aşağı doğru hareket etmelerini söyler.
+1xv
+2<v
}
xbalığa rastgele bir yönde hareket etmesini söyler, sonuçta balığın sağa doğru gitmesine ve aşağı doğru devam etmesine veya üstünden 1+veya önünden geçmesine neden olur 2+. Bunlar yığının sonundaki sayıya sırasıyla 1 veya 2 ekler. Balık yukarı doğru hareket ederse,v tekrar ve aşağı doğru hareket eder. }yığını sağa kaydırır, ardından iyığında 1 ve bu yeni değişkeni 0 konumuna getirir (diyelim m).
:&:<~ v!?=&
Bu bölüm bir işlevdir, buna whitespaceTrimmer diyelim . Olduğu yerde başlar <. Sadece yığının sonundaki boşlukları (dizenin başlangıcını) boşluk olmayan bir karaktere gelene kadar sıyırır.
Böylece balık hemen yüzer <ve sola doğru hareket etmelidir. Daha sonra:&:& , yığının ucundaki değeri kopyalayan, kayıttaki boşluğu yığının sonuna yerleştiren, kopyalayan ve daha sonra tekrar kayıt defterine yerleştiren çalışır.
Sonra balık vurur =?!v ~veya daha spesifik olarak, =son iki değeri (az önce oluşturduğumuz iki değer) yığının dışına çıkarır, karşılaştırır, eşitse yığının sonuna 1 ve 0 eğer farklılarsa yığının sonu. ?0 sonraki talimat, bu durumda olduğu yürütmüyor ise, yığının sonuna kapalı yeni bir değer çıkar !, bunun yerine yürütür vbalık aşağı yönde hareket etmesine emir (function çıkmadan).
Eğer 1 ise, o zaman bir boşluk bulmuştur, bu yüzden !bir trambolin olanı yürütür ve bu da balığın bir sonraki talimatı atlamasına neden olur v, bu da balık devam eder. Balığın önünde ~, son yığının (boşluk olduğu onaylandı) son değeri göstermesini söyler, sonra balık devam eder ve işlevi tekrar çalıştırır.
?!;a6.>ol2-
Balığın hemen a ile yüzmesi söylenir >, daha sonra yığındaki son karakteri çıktısı verilir o(bu ilk çalıştırıldığında, ilk karakteridir s). Yığının uzunluğunu alır, yığının sonuna la 2yerleştirir, sonra -2'nin çıkarılmasına neden olur l. Bu ?!;, ne yaptığının hatırlanmasıyla ?, balığın !yığın boşsa atlamasına neden olur ;ve programı bitirir.
Yığın üzerinde hala karakterler varsa !, balıkların zıplamasına ;ve yürütülmesine neden olan a6., hangi depoları a(AKA 10) ve koordinat 6olan yığının sonunda, onları istifleyin, ardından balıkları teleport edin ve bu pozisyonun sağındaki talimatları uygulayın (balıklar doğru yüzerken).x, y.10, 6
y6. pozisyonun bunun altındaki çizgi olduğunu fark ettiğinizde bu, göründüğünden daha az karmaşıktır . xkonum 10 o zaman vve bunun sağında, bu bir hareketsizliktir. Bu, balığın yüzmeye devam etmesine ve hatta hattın başında uygulamaya başlamasına neden olur ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Karakterler arasına rastgele metin ekleyen işlev budur. Biraz ağız dolusu, ama bunun sebebi biraz ekstra rastgele yapmaya çalıştığım için. Buna diyelim genRandomChars diyelim .
:{{:}l1-[rvAslında fonksiyonu için kurulum ve gerçek işlevinin kendisi bir parçası daha az böyledir. Balık önce yüzer :{{, yığının ucundaki değeri kopyalar, sonra iki kez sola kaydırır. Eğer iyığındaki 1. pozisyonda olduğunu hatırlarsanız,i , artık yığının sonunda .
Balık daha sonra :}hangi kopyaların üzerine yüzdüğünü ive istifin sağına kaydırarak yığının ihem başına hem de sonuna yerleştirir . l1-[balık uzunluğunu yığının ucuna yerleştirir, 1'i çıkarır, sonra [yeni bir yığın oluşturur, l-1değerleri (yığının uzunluğu eksi 1) yeni yığına taşır (böylece sadece ieski yığının üzerinde bırakarak ). Sonra balık basitçe rvyığını tekrar tersine çevirir (yeni bir yığın oluşturmanın bir nedenden ötürü tersine çevirdiğini düşünüyorum) ve balığın bir kez daha aşağıya doğru yüzmesini emreder, gerçekten <aşağıdaki fonksiyona başlar .
Yani şu anda yığının sonu mve bizim geçici olarak iadlandırılacak ti. Balık hemen yüzer 1-}, bu da 1'i çıkarır tive yığının başlangıcına taşır. Sonra :}sadece kopyalar mve yığının başlangıcına taşır.ti yığın konumu 1'e ).
Bu küçük şeye çarptığımızda:
v2<
<1x|!
^3<
Bu aslında çok basit. !Atlamak için balık neden olur |ve yürütmek x. Ne yaptığını xhatırlayarak, balığın 4 yönde hareket ettiğini hatırlıyoruz. |sadece bir aynadır ve balığınx . Temel olarak, balık yığının ucuna 1, 2 veya 3 yerleştirecek ve sola hareket etmeye devam edecektir.
Balık daha sonra *+oyığındaki son iki değerin fırlatılmasına, çoğalmasına ve sonuçun tekrar itilmesine, ardından da ekleme ile aynı şeye neden olur, daha sonra son değer yığından çıkarılır ve çıktısı alınır o. Bizim yığın şimdi sadece ihtiva eden yine nispeten normal [ m, ti, s].
:}}:yığının ucundaki değerin (temel olarak s0 konumu) kopyalanmasına neden olur, ardından yığın iki kez sağa kaydırılır ( titekrar öne yerleştirilir ), sonra tikopyalanır. ?!vanlaması oldukça kolay olmalı. Temelde ti0 ise , fonksiyondan ile vçıkarız, aksi takdirde yürütürüz !ve atlarız v(başka bir döngü yapıyoruz).
Eğer tibiraz rasgele karakterler çıkışı 0 ve biz yapılır, o zaman yürütme vve bakın:
v ~}}r]~<
.43<
Burada çok süslü bir şey yok. tiİle yığından kaldırıyoruz ~. Sonra ]yeni, tüm değerlerimizi yığından çıkarır ve eski yığına yerleştirir! Birlikte ters ters konunun Çünkü r, daha sonra iki kez doğru yığını kayması }}~bize veren sağa yığını shufting, [ m, i, s], ~çoğaltılamaz ekstra kaldırmaktır s[0]eğer ihtiyacın olur diye fonksiyon bakımından önceki bir döngü yapıyorduk (ama değiliz, çıkıyoruz). vaşağı yüzmek ve içine balık söyler >34.sadece sol yüzmek için ve içine balık söyler, (yürütme sırasını göstermek için ters) 3, 4(çünkü .bir atlama olduğunu!). 3, 4aslında sadece başlangıcın sağındawhitespaceTrimmer , seyahat ettiğimiz için mükemmeldir.
Tüm bu mantığın ardından, yığın nihai olarak boş olana ve program whitespaceTrimmeryürütüldükten hemen sonra çıkana kadar balıkları takip edebiliriz .