ASCII Hilbert Eğrisi


23

Bir tamsayı Verilen nçıktı üretmesi ninci iterasyon Hilbert Eğri karakterleri kullanarak ASCII _ve |.

İşte ilk 4 yineleme:

n=1
 _ 
| |

n=2
 _   _ 
| |_| |
|_   _|
 _| |_

n=3
 _   _   _   _ 
| |_| | | |_| |
|_   _| |_   _|
 _| |_____| |_ 
|  ___   ___  |
|_|  _| |_  |_|
 _  |_   _|  _ 
| |___| |___| |

n=4
 _   _   _   _   _   _   _   _ 
| |_| | | |_| | | |_| | | |_| |
|_   _| |_   _| |_   _| |_   _|
 _| |_____| |_   _| |_____| |_ 
|  ___   ___  | |  ___   ___  |
|_|  _| |_  |_| |_|  _| |_  |_|
 _  |_   _|  _   _  |_   _|  _ 
| |___| |___| |_| |___| |___| |
|_   ___   ___   ___   ___   _|
 _| |_  |_|  _| |_  |_|  _| |_ 
|  _  |  _  |_   _|  _  |  _  |
|_| |_| | |___| |___| | |_| |_|
 _   _  |  ___   ___  |  _   _ 
| |_| | |_|  _| |_  |_| | |_| |
|_   _|  _  |_   _|  _  |_   _|
 _| |___| |___| |___| |___| |_ 

Açıklamalar

  • Sorum benzer Hilbert Curve çizin ve eğik çizgi kullanarak Hilbert eğrisini çizin .
  • Çizgi (arasında dönüşüm _) ve dikey çubuklardan ( |) 'dir u=2*v-1burada u sayısıdır _s ve vsayısıdır |s.
  • Orijinal yazımla tutarlılığı sağlamak için eğri alttan başlamalı ve bitmelidir.
  • Tam bir program veya işlev olabilir.
  • Stdout çıktısı (veya benzeri bir şey).
  • Öndeki veya sondaki beyaz boşluklara sahip olabilirsiniz, çıktının sadece örneklere benzemesi için aynı hizada olması gerekir.
  • Bu kod golf, bayt cinsinden kazanılan cevapların çok kısa olması.

3
Lütfen yazdığınızdaki Hilbert Eğrisi'nin tanımını ve ASCII sürümünün nasıl oluşturulduğuna dair tam özellikleri ekleyebilir misiniz?
Loovjo

@Bobas_Pett: Değil kolmogorov-karmaşıklık
shooqie


@Loovjo Daha fazla bilgi veya kesin bir tanım hala gerekiyorsa, lütfen bana "Açıklamalar" altındaki alt çizgi (_) ve dikey çubukların (|) uzunlukları hakkında bir noktaya ekledim.
Bobas_Pett

@shooqie etiketi kaldırdım
Bobas_Pett

Yanıtlar:


5

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 ).

Seviye 3 Hilbert Eğrisi, dikey eksen boyunca yansımayı gösterir

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 ).

Level 3 Hilbert Eğrisi, sol alt köşedeki yatay eksen boyunca yansımayı gösteren

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.

Level 3 Hilbert Curve, sol alt köşenin sağ üst bloğunun nasıl elde edilebileceğini gösteren

Ve sol blok, tam eğrinin en solundaki bloğun dikey bir yansımasından elde edilebilir.

Level 3 Hilbert Eğrisi, sol alt köşenin sol üst bloğunun nasıl elde edilebileceğini gösteren

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 .

Level 3 Hilbert Eğrisi, sol alt köşenin sol üst bloğunun nasıl elde edilebileceğini gösteren

Fakat bunun dışında, bu süreci tekrarlı bir şekilde tekrarlayabiliriz. Son seviyede sol üst karakteri ve altındaki karakteri sabit olarak kodlarız .

Eğrinin kalan kısımlarının nasıl elde edildiğini gösteren görüntülerin sırası

Ş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.

Seviye 2 Hilbert Eğrisi, ASCII sanatı olarak ve kutu karakterleriyle işlendi

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.


2

C, 267 bayt

const n=4,s=1<<n,a[]={1,-s,-1,s};l,p,q;
t(d){d&=3;p-q||printf("%.2s",&"__|      _|       |___ _|_| | | "[l*8+d*2]);p+=a[l=d];}
h(d,r,n){n--&&(h(d+r,-r,n),t(d+r),h(d,r,n),t(d),h(d,r,n),t(d-r),h(d-r,-r,n));}
main(){for(;p=s*s-s,l=1,q<s*s;++q%s||putchar(10))h(0,1,n),t(3);}

Çevrimiçi deneyin!

h()hlibert eğrisinin vuruşlarını oluşturmak için özyineleme kullanır. t()Kontur karakterini yalnızca, kalem konumu pgeçerli çıktı konumuna eşit olduğunda yazdırır q.

Bu verimsiz ama basittir.

Eğri sol üstte başlarsa, kod 256 bayta düşürülebilir.


Öner puts("")yerine putchar(10)ve "..."+l*8+d*2yerine &"..."[l*8+d*2]ve n--?h(d+r...-r,n):0yerinen--&&(h(d+r...-r,n))
ceilingcat
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.