Beyaz alanda golf için ipuçları


14

Whitespace'de golf yapmak için hangi genel ipuçlarınız var? Ben kod-golf sorunları uygulanabilir ve aynı zamanda en azından biraz Whitespace (örneğin "yorumları kaldırmak" bir cevap değildir) belirli fikirler arıyorum.

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


82
Gereksiz boşlukları kaldırın.
KSFT

1
s / [^ [: boşluk:]] // g
Dijital Travma

Yanıtlar:


11

Bunun bir şaka sorusu olup olmadığından tam olarak emin değilim, bu yüzden umarım ciddiye aldığım için alay etmem, ama ...

İpucu 1: Programınızı Bitirmeyin

Spesifikasyon, bir programın üç satır beslemesi ile sonlandırılması gerektiğini [LF][LF][LF], burada birincisi akış kontrolü IMP ve sonraki ikisinin quit komutu olduğunu, ancak birçok tercümanın kodunuzu uygun sonlandırma olmadan çalıştırması gerektiğini söylüyor . Herhangi bir programda 3 karakter kaydeder.


6

İpucu 2: Yığını Mümkün olduğunca Az Kullanın

Öbek'i döngülerimi ve benzerlerini saymak için çok kullanıyordum, ama aslında son derece verimsiz olduğunu fark ettim; önce bir adres itme, geçerli sayıyı alma, bir adres alma / ekleme, adresi yeniden gönderme vb.

Şimdi sadece döngü sayacı olarak hareket etmek için yığındaki bir değeri itiyorum, sonra [Space][LF][Tab]ihtiyacım olduğunda ona geri dönmek için takas komutunu kullanıyorum . İçinde / etrafında çok çalışmak gerekir, ancak bunu elde ettiğinizde karakter sayınızı gerçekten azaltabilir.


5

Rasgele yığın adreslerini kullanma

Birçok tercüman, 0 veya 1'den başlamak ve saymak yerine rastgele yığın adreslerini okumanıza / yazmanıza izin verir. Mevcut bir yığın değerini (3 bayt) yeni bir değer (en az 4 bayt) itmek yerine adres olarak kullanmak üzere çoğaltabilirsiniz


+1. Bunun yalnızca negatif olmayan yığın adresleri için geçerli olduğunu unutmayın. Bu nedenle, yığının üst kısmı negatif bir tamsayı ise, yığın adresi olarak kullanamazsınız.
Kevin Cruijssen


5

Tüm karakterleri sabit bir miktarda azaltın ve bir döngüye yazdırmadan hemen önce ekleyin

Kredi @LukStorms benzer bir yaklaşım kullanır, Hello World meydan okuma için onun cevabını .

( STNsırasıyla Boşluk, Sekme ve Yeni satır için kullanılır.)

Harfler için değerleri her zaman 11 bayttır (yani 'A' karakteri için 65 değerini SSSTSSSSSTNitmek; 'z' karakteri için 122 değerini itmek SSSTTTTSTSN). Büyük miktarda metin çıktısı almak istediğinizde bu pahalı olabilir. Bunun yerine, yazdırmak istediğiniz tüm karakterlerin değerlerini sabit bir miktarda azaltabilir ve daha sonra bunları yazdırmak için döngüde bu sabit miktarı ekleyebilirsiniz.

Bu, aşağıdaki kodla yapılabilir (bu durumda sabit değerin 100 olduğunu varsayalım):

  1. Karakterler için tüm değerleri (eksi sabit miktar 100) ters sırada itin
  2. NSSN (Bir Label_0 oluşturun; temelde döngüyü başlatır)
    1. SSSTTSSTSSN (Sabit tutarı 100 itin)
    2. TSSS (Yığının ilk iki değerini birlikte ekleyin)
    3. TNSS (Şimdi doğru değeri karakter olarak pop ve yazdır)
    4. NSNN (Label_0'a atla; döngünün sonraki yinelemesine git)

Bu, programı yığın üzerinde başka bir şey olmadan Add ( ) yapmaya çalıştığında ( meta göre izin verilir) bir hata ile durur TSSS. Bunu bu cevabımı golf için kullandım ( bayt sayısını azaltmak için yaptığım şeylerin 5. ve 6. maddelerine bakınız ).

Sabit bir miktarın en kısa yaklaşım olup olmadığı, ne yazdırdığınıza bağlıdır. @LukStorm , Hello World yanıtında 107 kullandı.

Üst değer (kopyalama bu Not SNS(aynı gibi, bitişik bir karakter iki) lin Hello), ya da başka konuma kopyalama değerler daha da golf buna ek olarak kullanılabilir bayt.


4

Tanımlanmamış etiketlere atlama programı sonlandırır (bazı tercümanlarda)

Bu uygulamaya özel davranışa girmeye başlar, ancak buna izin verildiğine inanıyorum .

TIO (ve muhtemelen diğer tercümanlar? En azından ideone üzerinde çalışmazlar) mevcut olmayan bir etikete atlamaya çalışıldığında yürütmeyi durduracaktır. Bir döngüden kurtulmak için bir karşılaştırma yapmanız gerekiyorsa bu, mola etiketini bildirmeden baytları kaydetmenizi sağlar. ( Bir örnek için Görünmez Metin Yazdır hakkındaki yorumuma bakın .)


4

0 değeri, ikili basamak içermeyen bir sayı olarak bildirilebilir

Boşluk öğreticisi, sayıların herhangi bir sayıda bit / ikili basamak genişliğinde olabileceğinden bahseder. Bu, bit içermeyen bir sayı (gerekli işaret bitinin ötesinde) 0 değerinin geçerli bir temsilidir [Space][Space][Space][LF]ve [Space][Space][Space][Space][LF]her ikisi de 0 değerini yığına iter, ancak birincisi bir bayt daha kısadır.


0

Önceki tam sayıları kopyalamak yenilerini oluşturmaktan daha kısa olabilir

( STNsırasıyla Boşluk, Sekme ve Yeni satır için kullanılır.)

STS+ Sayı bağımsız değişkeni , yığındaki n. Öğeyi (bağımsız değişken tarafından verilir) yığının üstüne kopyalamak için kullanılabilir . Bu, bazı durumlarda bayt tasarrufu için kullanılabilir.

Örneğin, bu cevabımda, 1. (0 dizinli) değerin ( ) kopyalanmasının 'p' ( ) karakterini oluşturmak için 12 tuşuna basmaktan daha az olan bayt sayısını düşürmek için Yaptığım Şeyler'in 4. maddesinde açıkladım. çıktı kısmında . (NOT: 'p' karakteri için 112 yerine 12 değerini kullanıyorum, çünkü döngüdeki karakterleri yazdırmadan önce eklediğimiz tüm değerleri sabit bir miktarda düşürmek için bu ipucunu uyguladım .)STSSTNSSSTTSSN"pop"

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.