:-:_
Çevrimiçi deneyin! Altbilgiye diğer tüm 4-baytlık çözümleri dahil ettim. (Stack Cats, ilk satır beslemesinden sonraki her şeyi görmezden gelir.)
Tersini dene!
açıklama
-n
Sayısal çıkışına bayrak dönüşler (ve girdi ama hiç yok) ve -m
bayrak normalde kaynak kodunun gereksiz kısmını önlemek sağlar sadece bir golf kolaylığıdır. Bunun nedeni, her Stack Cats programının ayna simetrisine sahip olması gerektiğidir. İle -m
bayrak sadece o ilk yarıyı (artı merkezi karakter) verir. Yani buradaki asıl program:
:-:_:-:
İlk TIO bağlantısında görebileceğiniz gibi, bir ton 4-byte çözüm var, ama basitliği için bunu seçtim. Yığın Kedileri yığın tabanlıdır ve bu program yalnızca ilk yığını kullanır. Herhangi bir girdiye sahip olmadığımızdan, -1
sonsuz bir sıfır kuyusunun üstüne tek bir (EOF işaretleyici) içerir. Programdaki üç komut aşağıdaki anlama gelir:
: Swap the top two stack elements.
- Negate the top stack element (i.e. multiply by -1).
_ Pop a. Peek b. Push b-a.
Yani programın yığını nasıl değiştirdiği (durumların ve komutların her komutun yığını bir durumdan diğerine nasıl değiştirdiğini gösterecek şekilde kademeli olduğu):
: - : _ : - :
-1 0 0 -1 1 0 0 1
0 -1 -1 0 0 1 1 0
0 0 0 0 0 0 0 0
… … … … … … … …
Görünüşe göre, burada gerçekten bir şey yapan tek komut, _
EOF işaretçimizi a 1
. Programın sonunda çıktısı örtük ve EOF işaretleyici isteğe bağlıdır, bu sadece 1
aldığımız çıktıları yazdırır .
Şimdi kaynak kodunu tersine çevirirsek, dolaylı yansıtma nedeniyle gerçek program şu şekilde olur:
_:-:-:_
Bu çok farklı bir şey yapar:
_ : - : - : _
-1 1 0 0 1 -1 0 -1
0 0 1 1 0 0 -1 -1
0 0 0 0 0 0 0 0
… … … … … … … …
İstifin alt Bu kez olduğu hala -1
bu EOF markeri ve tek olarak hareket etmez, böylece -1
bunun üzerine basılmış olur.
...
Şimdi tüm bunların söylediği gibi, Stack Cats'in tersine çevirme koduyla benzersiz bir ilişkisi olduğundan, kullanmanın -m
biraz aldatma olduğunu düşünüyorum. Normalde sadece kaynak kodun yedekli bölümünü atlayarak bayt tasarrufu anlamına gelir, ancak burada aslında mücadeleyi çok daha kolay ve hatta tam program daha da kısaltır. Bunun nedeni, tam bir programın tersine çevrilmesi, yalnızca herhangi bir içeriyorsa programı değiştirecektir <>[]
, bu da programın birden fazla yığın kullanmasıyla sona ereceği anlamına gelir (Yığın Kedileri aslında yalnızca bir tanesinin doldurulmuş olduğu bir yığın kasete sahiptir) sıfır ile). Dahası, onu tersine çevirmek sadece <>
ve []
çiftleri değiştirir, bu da yürütmeyi simetrik kılar. O simetriyi kırmak için tek yol kullanımı için I
hangi yapar -]
veya-[
veya yığının tepesine bağlı olarak hiçbir şey. Yani...
*|]I*:*I[|*
Çevrimiçi deneyin! Altbilgi yine aynı bayt sayısındaki diğer tüm alternatifleri içerir. Bu programlardan bazıları 1 / -1, bazıları ise 2 / -2 çıktısı her programdan sonra belirtildiği gibi. Bunu rastgele bir şekilde 2'yi çıkaranlardan biri olarak açıklamak için seçtim.
Tersini dene!
açıklama
Dediğim gibi, bu biraz daha uzun. Bunun için -m
gösterimi kullanmış olsak bile , yukarıdaki 4 yerine 6 byte ağırlığında olacaktır.
Bu sefer kullanılan komutlar:
* Toggle the least significant bit of the top of the stack.
| Reverse the longest non-zero of prefix on this stack.
[] Move one stack to the left/right and take the top of the current stack with you.
I If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
: Swap the top two stack elements.
İlk program sadece iki yığın kullanır. ASCII sanatında yapmak biraz dağınık ama elimden gelenin en iyisini yapacağım. Köşeli parantezler, bant başlığının hangi yığının üzerinde olduğunu gösterir ve komutları her bir yığın durumu arasına koyacağım.
[-1]
… 0 0 …
0 0
… …
*
[-2]
… 0 0 …
0 0
… …
| (does nothing)
]
[-2]
… 0 0 …
0 0
… …
I
[2]
… 0 0 …
0 0
… …
*
[3]
… 0 0 …
0 0
… …
:
[0]
… 3 0 …
0 0
… …
*
[1]
… 3 0 …
0 0
… …
I
[-1]
… 3 0 …
0 0
… …
[
[-1]
… 3 0 …
0 0
… …
|
[ 3]
… -1 0 …
0 0
… …
*
[ 2]
… -1 0 …
0 0
… …
Şimdi -1
bir EOF marker gibi davranır ve 2
basılır.
Diğer programa kadar aynıdır [
. Yine de ikinci olana kadar neredeyse tamamen aynı I
. Teknik olarak farklı bir yığında olacağız, ancak bunlarda değerler olmadan hepsi ayırt edilemez. Ama sonra arasındaki fark önemli I[
ve I]
biter:
*|[I*:*I
[-1]
… 3 0 0 …
0 0 0
… … …
]
[-1]
… 3 0 0 …
0 0 0
… … …
| (does nothing)
*
[-2]
… 3 0 0 …
0 0 0
… … …
Ve bu sefer, bir EOF işaretçimiz yok, ancak program hala çıktı veriyor -2
.
-
dönebilirsek , bir bayt (0x45 = 0b00101101) Jelly'te çalışır --
hazır bilgiṆ
-1'i tanımladığı için -1 verir; sıfır girişinin açıklaması. (Tabii ki aynı şekildeṆ
çalışır: p)