Gururla tanıtırım ...
<}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111
? @
:" }}_47}_95 3""""""""(
_ : } _ } {=}
2 23_}29_ _ ; : \
0 ; 3 +_( 3_" 60{ .{.{.
"-_95:}}"" 2 0 ) 2 " _ _ {
"" _ : 2 _ ."(; } 3 .{
;_92}_47} : _ 0 = : * ;
: "" 2 {.{{ . -""(
}}:59_}}:::: "";_ . { _ "
} " {.{.{. 32.
}}}_95:}}}}_20-
... yeni iki boyutlu esolang labirentim! Yukarıdaki kod son derece iyi golf oynamıyor (161 alan ve 25 NOP var, bu yüzden daha iyi bir düzen bunu çok kısaltabilirdi), ama en azından dilin önemsiz olmayan görevler için kullanılabilir olduğunu göstermeyi başardım. :)
Nasıl çalışır
İlk olarak, dile hızlı bir bakış:
- Labirent, rasgele işaretlenmiş tamsayıları tutabilen ana ve yardımcı olmak üzere iki yığın üzerinde çalışır . Her iki baca dibinde sonsuz miktarda sıfır vardır.
- Komutlar, 2B ızgaradaki ayrı karakterlerdir ve bir labirent oluştururlar (bu, bilinmeyen karakterler, özellikle boşluklar, duvarlardır).
"
bir duvar olmayan ve koddaki belirli yolları doldurmak için yardımcı olabilecek bir NOP'dir. Diğer birçok 2D dillere aksine, kenarları yok değil etrafına sarın.
- Talimat göstericisi (IP), ilk olmayan duvar karakterinde (okuma sırasına göre) sağa doğru hareket eder.
@
programı sonlandırır.
- Mümkünse, IP koridorları izler (ayrıca virajların çevresinde). IP, taşınacak birden fazla hücreye sahipse, genellikle ana yığının tepesi negatifse sola, sıfırsa dümdüz ilerlemeye veya pozitif ise sağa dönmeye başlar. IP bir duvara çarptığında, yönü tersine çevirir. (Birkaç tane daha incelik var, ancak bu kod için önemli değiller.) Kontrol akışını uygulamanın tek yolu bu.
- Aritmetik ve yığın manipülasyon komutlarının yanı sıra, kaynak kodu, kaynak kodun
>v<^
bir satırını veya sütununu döngüsel olarak bir hücre tarafından değiştirecek dört komutla çalışma zamanında değiştirilebilir . Hangi satır veya sütunun etkileneceği yığının üstüne bağlıdır. IP'nin kendi satırı veya sütunu kaydırılırsa, kaydırma ile birlikte hareket eder. Bu, kaynak kodun bir kenarından diğerine atlamayı mümkün kılar.
Şimdi bu özel zorluk için, algoritmanın genel fikri şudur:
- Araçların uçlarını, kapaklara (yani
/ \_o oo o
) yardımcı istifin üzerine doğru bastırın .
- Girişini okuma ve itmek için olmadığını belirlemek
__
veya /\
sonraki.
- Arabaların geri kalanını (yani
__ __ _/ \
iki ön boşluğu) yardımcı istifin üzerine doğru itin .
- Girişi maksimum değerine kelepçeleyin
20
, haydi bu N diyelim .
- Şimdi aşağıdaki 3 kere yapın:
- N boşluk yazdırın .
- 6 kayıtlı karakter yazdırın.
- 60 - 3 * N boşluk yazdırın .
- 6 kayıtlı karakter yazdırın.
- Yeni bir satır yazdır.
Son olarak, kodun bazı kısımlarına bakalım. IP, sol üst köşede, ızgara kaydırma komutuyla başlar. Ana yığının tepesi ( 0
göreceli bir indeks olarak kullanılır), bu nedenle ilk satır sola kaydırılır, bu da IP'yi ızgaranın sağ ucuna taşır. Şimdi ilk satır basitçe sağdan sola yürütülür, bu da ilk sabit karakter kümesini yardımcı istifin üzerine iter:
}74}}:23}29}59}}}}}}}:111_}}}}:::::::23_}:111<
Bu sıra kaydırma, çok miktarda doğrusal kodla başlamak istediğinizde golf oynamak için kullanışlıdır.
Sonra girişi okuyup doğru boneleri itiyoruz:
?
:"
_
2
0 ;
"-_95:}}""
"" _
;_92}_47}
Üç NOP'lu soldaki bit, üst dal boyunca negatif, alt dal boyunca negatif olmayan sonuçlar gönderir. Sağ tarafta tekrar bir araya getirilirler.
Şimdi başka bir büyük doğrusal bölüm izler (muhtemelen başka bir satır değiştirme hilesiyle çok fazla golf oynanabilir):
}}_47}_95
: }
23_}29_ _
3
2
:
:
:
}}:59_}}::::
}
}}}_95:}}}}
Bu, araçların kalanını yardımcı istifin üzerine iter.
Sonra, min(20, input)
ilk şubeye benzeyen hesaplıyoruz :
;
+_(
0 )
2 _
_ 0
"" 2
"";_
"
_20-
Son olarak, satırları yazdırmak için üç kez çalışan bir döngümüz var. Döngünün her yinelemesi, boşlukları basmak için iki küçük (3x3) ilmekin yanı sıra yardımcı yığından 6 karakter basmak için iki bölüm içerir:
@
3""""""""(
_ } {=}
: \
3_" 60{ .{.{.
2 " _ _ {
."(; } 3 .{
= : * ;
{.{{ . -""(
. { _ "
{.{.{. 32.
Dikkat çekmek istediğim şık bir numara .{.{.
sağ köşede. Bu bir çıkmaz yoldur, yani uçtan ayrı olarak .
, kod iki kez, bir kez ileri ve bir kez geriye doğru yürütülür. Bu, palindromik kodu kısaltmak için temiz bir yol sunar.
/ \
aşağı doğru tek hareket ettiği zaman_ _
mı?