Düşük yük, 196 bayt
()()(<svg width="99" height="147">)S(<g transform="translate):S((33,33)">)S((3,0)rotate)*a(*a(~*)*~("><path d="M0h3" stroke="#"/>)~*a(*)**:(-90)a~^~(90)a~^)*::*:**:*^S(</g>)(:*)::*:**:*^S(</svg>)S
Bu mücadeleyi düşük güçlü bir esolangda denemenin ilginç olabileceğini düşündüm; Düşük yük, bu kadar az sayıda komut içeren bir dil için oldukça iyidir.
Çıktı, çok yoğun içiçe etiketler ve bazı golf kısayolları içeren bir SVG dosyasıdır. Şimdiye kadar, görüntüleyebilecek bir tarayıcı bulamadım (Firefox yüklemeye çalışırken birkaç dakika kilitleniyor ve hem Firefox hem de Chromium boş bir ekran veriyor). Çoğu görüntü işleme programı da yükleyemez (başka bir formata dönüştürmeyi zorlaştırır), ancak görüntü görüntüleyici Eye of Gnome'a (Ubuntu'daki varsayılan yüklemenin bir parçası olan) yüklemeyi başardım. Görmek için görüntünün ekran görüntüsünü aldım (gerçek görüntünün şeffaf bir arka planı var, ancak gerçekten şeffaf bir ekran görüntüsü alamıyorsunuz):
Görüntü boyutunu açıkça belirtmemiz gerekiyor. Görüntü için uygun bir yönlendirme seçmek, her şeyi minimum yasal boyutta çizmek ve meydan okuma tarafından belirtilen minimum yineleme sayısını yapmak, bize yalnızca 99 piksel genişliğe sığan ve bayt tasarrufu sağlayan bir görüntü verir . İşler böyle çalıştığında hoş olur.
Görüntüyü çizmek için kullanılan genel algoritma, iki değişkeni korumaktır (Düşük yük değişkenleri adlandırmaz, ancak bunları x ve y olarak düşündüm ), her ikisi de başlangıçta boştur. Sonra tekrar tekrar (replace x , y ) ile ( x , sol ve ileriye taşımak dönün y ) ve ( x , sağa dönün ve ileriye taşımak y ). On tekrar, hem X ve Y , bir dokuz yineleme ejderha eğrisi tutun.
Birkaç mikro optimizasyon ve Düşük Yüke özgü hileler de var. Yığının üst kısmı, her döngü yinelemesi ile çok fazla karışıklıktan kaçınmak için x ve y işlevini birleştirerek başlarız "birleştirerek oluşturulan dizeyi döndürür: x , bir dönüş komutu, işlev argümanı, bir hareket- ileri talimatı ve y . " Bu işlev yığın üzerinde yalnızca bir yer kaplar, böylece x ve y için yeni değerleri elde etmek için -90
çoğaltabilir, 90
bağımsız değişken olarak çağırabilir, kopya değerinin altındaki dönüş değerini değiştirebilir ve bağımsız değişken olarak çağırabiliriz.yığının üst iki unsurundan daha fazlasına dokunmaya gerek kalmadan (en yaygın şekilde erişilebilir olan). Bu işlev çalışma zamanında kod üretilir. Jeneratörün kendisi de <g transform="translate
görüntünün kökenini ayarlamak için kullanılan dizeyi yeniden kullanmasına izin vermek için çalışma zamanında kod üretilir . İlk olarak tüm açık etiketleri üretiyoruz ve sonra tüm yakın etiketler sadece </g>
olduğundan, açık etiketlerle eşleştirmekten endişe etmeden dizeyi tekrarlayarak 1024 kapat etiket çıkarabiliriz. (Düşük yükte sayıları verimli bir (:*)::*:**:*
şekilde yazmak kendi başına ilginç bir sorundur; 1024 yazmanın en etkili yolu muhtemelen "2'nin (1 + 2 × 2) × 2 gücüne" çevirmektir.
Düşük yükte herhangi bir grafik kütüphanesi yok, bu yüzden sabit bir konumda çizim çizgilerinin bir kombinasyonunu kullanarak ve görüntüyü belirli bir nokta etrafında döndürerek SVG üretiyorum; Kalemi çevirmek yerine kağıdı çeviriyoruz. Fikir şu ki, bir çizgi çizerek, tüm görüntüyü döndürerek, başka bir çizgi çizerek, görüntüyü tekrar döndürerek, vb. aynı yerde. Tabii ki bu, birçok SVG görüntüleyicisini şaşırtan çok iç içe resim döndürme etiketlerine sahip olduğumuz anlamına gelir.
Görüntüyü şekillendirmek bayt sayısına göre sayılır, bu yüzden görüntüyü görüntülemek için gereken minimum stili vermeliydim. Bu stroke="#"
, aşağı yukarı "çizginin bir renk olması gerekiyor" anlamına gelen; bu siyah renkte çizilecek şekilde genişletildi. (Normalde rengi "# 000" olarak belirtirsiniz.) Arka plan varsayılan olarak saydamdır. Bir kontur genişliği belirtmiyoruz, ancak Eye of Gnome tarafından seçilen seçim her şeyi görünür kılıyor.
Birçok Düşük Yüklü tercüman bu programla mücadele eder, örneğin Try It Online'daki gibi çöker, çünkü dahili olarak çok büyük dizeler üretir. Orijinal çevrimiçi Underload yorumlayıcısı çalışıyor. (İlginçtir, ilk yorumlayıcı çevrimiçi idi, bu yüzden dil çevrimdışı kullanılabilir olmadan önce çevrimiçi olarak kullanılabilirdi.)
Biraz tedirgin olduğum bir şey, burada sadece 1023 çizgi segmenti var gibi görünüyor ve 1024 bekliyoruz. Sonunda segmentlerden biri bu algoritma ile çizilmiyor olabilir ( bunun yerine sonraki yinelemede çizilir). Bu diskalifiye ederse, programı uyarlamak mümkün olabilir, ancak oldukça uzun sürebilir. (Bu meydan okuma yine de rekabeti kazanacak gibi değil; zaten birkaç daha kısa giriş var.)