2D dillerde golf için ipuçları


18

2 boyutlu programlama dillerinde golf oynamak için hangi genel ipuçlarınız var? Ben kod-golf sorunları uygulanabilir ve 2D programlama dilleri için özel, ancak herhangi bir dile özgü olmayan ipuçları arıyorum ("yorumları kaldırmak" ve "işlemi kullanın M" gibi yanıtlar cevap değildir).

Lütfen cevap başına bir ipucu gönderin.


Bu soru Meta'da olmamalı mı?
Bay Lister

2
Ne: Burada ilgili meta soru var olan bir 2D program boyutu? Kapalı alan? Dışbükey gövde alanı? Eksen hizalanmış dikdörtgen içeren alan? Hepsi bir çeşit ASCII boyutundan daha iyi önlemler olabilir.
MSalters

@MrLister İpuçları ana site için konu ile ilgili sorular. Eğer bakarsanız, zaten ipuçları etiketi altında çok sayıda sorunuz olduğunu görebilirsiniz.
Rock Garf Avcısı Sonrası

@ MSalters Her programlama dili uzunluğu gibi bayt cinsinden ölçülür. Bazı dil tasarımcıları, Hexagony veya Cubix gibi farklı şekillerde 2D dillerin düzenlenmesine izin verir ve bunlara bağlıdır.
Rock Garf Hunter Post

Yanıtlar:


19

Yatay boşluklardan kaçının

Genellikle, kod, programın sol tarafındaki boşlukların büyük boşluklarını bırakacaktır.

abc
  d
  e

Bu, sol hizalama ile önlenebileceği 4 bayt ekler.

cde
b
a

Büyük boşluk boşlukları kullanmanız gerekiyorsa, yatay yerine dikey yapmayı deneyin.

########
#      #
#      #
#      #

vs

####
#
#
#
#
#
#
####

11

Mümkünse bir boyut kullanın

Genellikle, daha basit programlar tek bir satıra yazılabilir. Örneğin, klasik kedi programı şunlar olabilir:

>iv
^o<

Ancak, sarma davranışını kötüye kullanabilir ve bunu yapabilir:

io

Veya, bu tür bir sarma davranışı olmayan dillerde:

> ?oi<

(Daralma ?yapmıyorsa.) Kaydırma yapmayan bir dil söz konusu olduğunda, açık bir döngü genellikle daha iyidir.

Atlama komutları ile

Atlama ve koşullu atlama komutlarına sahip 2B dillerde, bir program şöyle görünebilir:

abc >de?v;
    ^hgf<

Bu ayrıca şunlar olabilir:

abc de?!;hgf04&

(eğer !bir trambolin ve &pozisyona atlıyorsa)


Üçüncü örneğiniz ioiioiioivb. Yapmıyor mu?
Yalnızca ASCII

@ ASCII-only Gerçekten de öyle. Hata.
Conor O'Brien

1
Muhtemelen daha az düzenli komutlardan bazılarının ne yaptığını belirtmelisiniz. Mesela ne io;yapacağımı bilmiyorum ve bildiğim tek şey bu ?patlamıyor. Bunlar balık komutları gibi görünüyor, ama çok standart olduklarını sanmıyorum.
Post Rock Garf Hunter

2
Koşullu atlama komutları olmayan bazı 2D dillerde (Labirent gibi), programı sıfıra bölünerek koşullu olarak sonlandırarak döngüsel tek satırlı programlar da yazabilirsiniz.
Martin Ender

10

Satır Başı Çok Bayt

Ne kadar az 2D yapabiliyorsanız o kadar iyi. Bir satır başı başka bir işlem yapılmaz. Yalnızca @ATaco ve @ ASCII'deki ipuçlarını göz ardı etmeden, Y boyutunu mümkün olduğunca küçük tutmaya çalışın.

Bu

###
####
########

daha iyi

###
###
###
##
#
#
#
#

Satır başı döndürmeleri her zaman bayt değildir. \n(satır besleme), POSIX sistemlerinde sola hizalanmış metinde düzenli olarak kullanılan bir satır sonudur, ancak Windows ve Mac OS (macOS öncesi) \n(satır besleme) ve \r(satır başı ) kombinasyonlarını kullanır .
wizzwizz4

9

KURU (Kendinizi Tekrarlamayın)

Code Golf'te işlevlerle soyutlama genellikle daha uzun olsa da, 2D diller için gerçekten yardımcı olabilir. Kodunuzu iki farklı yürütme dalına girip çıkarak aynı snippet'i yeniden kullanabilmesi için yeniden çalışmayı deneyin.


8

Serpiştirme yolları

Genellikle bir 2D dilde yön komutlarına göre hareket eden bir IP vardır. Boşluklar bayt olduğundan, programı yeniden düzenlemek neredeyse her zaman daha verimlidir, böylece gereksiz dolgu alanlarına olan ihtiyacı ortadan kaldırarak mümkün olduğunca sık sola yaklaşır.


2

Aynaları kullan

Aynalar bazen aynı anda iki yolda kullanılabilir (her bir yol aynanın bir tarafından seker). Bu yardımcı olmayabilir, ancak programınızı yeniden düzenlemenize izin verebilir veya yön değişiklikleri varsa çok şey varsa, daha az ayna ile değiştirilebilir.


2

Deyimleri ezberle

İşte dilin doğasına bağlı olarak bazı şeyler yapan birkaç "deyim".

Yalancı doğrusal kod

Dinamik kod üretimi gerekliyse, sözde doğrusal kod modelini kullanmak yararlı olabilir:

v
\"line 1"
\"line 2"
.
.
\"line N"

Varsaydım \ve vgenellikle ne yaptıklarını kastediyorum.

Sonsuz döngü

Hemen hemen tüm 2B dillerde, ><sonsuz, kırılmaz bir döngüdür. Herhangi bir nedenden dolayı bunu yapmanız gerekiyorsa, bunun ne kadar güzel görünmesine rağmen en iyi yol budur:

>v
^<

Aslında, kodunuzu 1-astar yaparsanız, sadece ^veya kullanabilirsiniz v:

i?vo;

Bu v, IP'yi kendisine göndererek etrafa sarar. Bu yaklaşımı, yönlü bir komutun bir dizi (göreceli) no-op'lara işaret ettiği herhangi bir durumda da kullanabilirsiniz.

Quine çerçevesi

Genellikle, bir dize / alıntı çerçevesine sahip diller aşağıdaki gibi bir sorguya sahip olabilir:

<quote><generate "><output stack><terminate>

> <> İçin bu şöyle görünecektir:

":1-r>o<#

Bunun dışında sonlandırma olarak bir hata ile çıkar. Muhtemelen en kısa ya da en azından bulduğum en kısa olandır .


Bu bir ipucu gibi görünmüyor.
Rock Garf Hunter Post

@WheatWizard Bunları bir arada tuttum, çünkü onları ayırmak benim için daha az mantıklıydı, tüm yaygın program düzeni deyimleri oldu.
Conor O'Brien

Neden <<> quine'de var?
Jo King

@JoKing Özellikle emin değilim lol
Conor O'Brien

Ayrıca, "yanlış tarafta biter. Aksi takdirde ipucu iyi, cevaplarımın çoğunda bu genel çerçeveyi kullandım
Jo King
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.