Befunge, 444 368 323 bayt
&1>\1-:v
0v^*2\<_$00p>
_>:10p\:20pv^_@#-*2g00:+1,+55$
^!-<v*2g000<>$#<0>>-\:v
g2*^>>10g20g+v \ ^*84g_$:88+g,89+g,\1+:00
v#*!-1g02!g01_4^2_
>::00g2*-!\1-:10g-\20g-++>v
87+#^\#p01#<<v!`g01/2\+76:_
vv1-^#1-g01:\_$:2/20g`!
_ 2/^>:10g#vv#`g02/4*3:\+77
v>0p^^/2:/2_
<^2-1-g02</2`#*3:
0g+10p2*:^*3_1
! "#%$
%$"#!
!!##%
|||_
_ __
Çevrimiçi deneyin!
Hilbert Eğrisi'ni çizmenin tipik yaklaşımı, yolu bir dizi vuruş ve dönüş olarak takip etmek, sonucu bir bitmap veya bir bellek alanına dönüştürmek ve ardından yol tamamlandığında bu görüntülemeyi yazmaktır. Befunge'de çalışacak sadece 2000 byte belleğe sahip olduğumuzda bu mümkün değildir ve bu programın kendisinin kaynağını da içerir.
Bu yüzden burada ele aldığımız yaklaşım, belirli bir x, y koordinatı için hangi karakteri çıkartacağımızı söyleyen bir formül bulmaktır. Bu başlangıç için ASCII oluşturmayı görmezden en kolay nasıl bu eserler anlamak ve sadece kutu karakterlerden oluşan olarak eğrisinin düşünmek için: ┌
, ┐
, └
, ┘
, │
, ve ─
.
Böyle bir eğriye baktığımızda, sağ tarafın sol tarafın tam bir aynası olduğunu hemen görebiliriz. Sağdaki Karakterler sadece soldaki ortağı ararken, ve yatay olarak yansıtarak belirlenebilir (yani oluşumları arasında ┌
ve ┐
takas edilir gibidir └
ve ┘
).
Ardından sol alt köşeye baktığımızda, alt yarının üst yarının bir yansıması olduğunu görebiliriz. Böylece altındaki karakterler sadece yukarıdaki onların ortağı ararken, ve dikey olarak yansıtan belirlenir (yani oluşumları arasında ┌
ve └
takas edilir gibidir ┐
ve ┘
).
Bu köşenin kalan yarısı biraz daha az açıktır. Sağ blok, çaprazlamasına bitişik olarak blokun dikey bir yansımasından elde edilebilir.
Ve sol blok, tam eğrinin en solundaki bloğun dikey bir yansımasından elde edilebilir.
Bu noktada, geride bıraktığımız tek şey sol üst köşede, bu da bir başka Hilbert Eğrisi'nde bir yineleme daha düşük Teorik olarak, şimdi sadece işlemi tekrar etmemiz gerekir, ancak bir miktar yakalama var - bu seviyede bloğun sol ve sağ yarıları birbirinin aynası değildir.
Yani üst düzey başka bir şeye, alt köşe karakterler özel bir durum olarak ele alınması gereken ┌
bir karakter olarak yansır ─
ve │
karakter olarak yansımaktadır └
.
Fakat bunun dışında, bu süreci tekrarlı bir şekilde tekrarlayabiliriz. Son seviyede sol üst karakteri ┌
ve altındaki karakteri sabit olarak kodlarız │
.
Şimdi eğrinin şeklini belirli bir x, y koordinatında belirleme yöntemine sahip olduğumuz için bunu ASCII görüntülemesine nasıl çeviririz? Aslında her bir döşemeyi iki ASCII karakterine çeviren basit bir haritalama.
┌
olur _
(boşluk artı alt çizgi)
┐
olur
(iki boşluk)
└
olur |_
(dikey çubuk artı alt çizgi)
┘
olur |
(dikey çubuk artı boşluk)
│
olur |
(yine dikey çubuk artı boşluk)
─
olur __
(iki alt çizgi)
Bu haritalama ilk başta sezgisel değildir, ancak yan yana gelen iki işleme bakarken nasıl çalıştığını görebilirsiniz.
Ve temelde hepsi bu kadar. Aslında bu algoritmayı Befunge'de uygulamak tamamen bir başka sorundur, ancak bu açıklamayı başka bir zaman bırakacağım.