> <> (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 s
ve 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. r
yığını tersine çevirir ve yığını {:}
sola kaydırır (yığının i
sonuna koyarak ), yığının ucundaki değeri kopyalar, sonra sağa kaydırır. v
balıklara aşağı doğru hareket etmelerini söyler.
+1xv
+2<v
}
x
balığ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 i
yığı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 v
balı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 l
a 2
yerleş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 6
olan 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
y
6. pozisyonun bunun altındaki çizgi olduğunu fark ettiğinizde bu, göründüğünden daha az karmaşıktır . x
konum 10 o zaman v
ve 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-[rv
Aslı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 i
yığı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ü i
ve istifin sağına kaydırarak yığının i
hem 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-1
değerleri (yığının uzunluğu eksi 1) yeni yığına taşır (böylece sadece i
eski yığının üzerinde bırakarak ). Sonra balık basitçe rv
yığı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 m
ve bizim geçici olarak i
adlandırılacak ti
. Balık hemen yüzer 1-}
, bu da 1'i çıkarır ti
ve yığının başlangıcına taşır. Sonra :}
sadece kopyalar m
ve 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ı x
hatı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 *+o
yığı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 s
0 konumu) kopyalanmasına neden olur, ardından yığın iki kez sağa kaydırılır ( ti
tekrar öne yerleştirilir ), sonra ti
kopyalanır. ?!v
anlaması oldukça kolay olmalı. Temelde ti
0 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 ti
biraz rasgele karakterler çıkışı 0 ve biz yapılır, o zaman yürütme v
ve 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). v
aş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, 4
aslı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 whitespaceTrimmer
yürütüldükten hemen sonra çıkana kadar balıkları takip edebiliriz .