Bir resmi Hilbertify


28

Hilbert Curve'den hoşlanıyorum .


Bu meydan okuma için sizin göreviniz (tüm tarafların iki piksel genişliğinde bir güç olduğu kesin bir kare resim) çekmek ve zig-titiz bir şekilde satır satır satır açmak ve sözde-Hilbert eğrisinde tekrar yükseltmektir. .

çözülüyor

Çözmek için sol üst köşedeki pikselle başlayacak ve görüntünün kenarına ulaşana kadar sağa doğru hareket edeceksiniz. Görüntünün kenarına bastığınızda, bir sonraki satıra inecek ve tekrar kenara çarpana kadar sola hareket etmeye başlayacaksınız. Her seferinde yönü değiştirerek satır açmaya devam edersiniz, böylece sürekli bir eğri elde edersiniz. Bu iyi oynanan bir yılan oyununa benzemeli

Çözmenin sonucu, her pikseli tam olarak bir kez içeren bir piksel sırası olmalıdır

Reraveling

Pikseller için bir siparişiniz olduğunda, sözde Hilbert eğrisinin yolunu izleyerek onları yeni eşit boyutta bir tuvalde yeniden düzenleyeceksiniz. Bir İçin 2**nbüyüklüğünde kare görüntünün Eğer sözde Hilbert eğrisinin inci iterasyon kullanmalıdır. Her piksel yeni tuval üzerinde tam olarak bir noktaya yerleştirilecektir. Resmi, orijinal olarak sol üstteki nokta (yılan eğrimizin başlangıcı) orada kalacak ve sağ altta (yılan eğrimizin sonu) sağ üst noktaya yerleştirilecek şekilde yeniden yapıştırmalısınız.

I / O

Programınız veya işleviniz, standart yöntemlerle belirtilen kısıtlamaların bir görüntüsünü almalı ve standart yöntemler yoluyla başka bir görüntü çıkarmalıdır.

puanlama

Bu , en az baytlık kazanılan programıdır.

Örnekler

Giriş

Mondrian

Çıktı

Çıkış 1


Giriş

Rothko

Çıktı

Çıkış 2


Giriş

şifreli

Çıktı

Aslan


Herhangi bir pikselin eksik olmadığından emin olmak için boş bir beyaz veya düz renkli görüntü üzerinde test yapmanızı da öneririm.

Cevaplarınıza kendi sonuçlarınızı eklemekten çekinmeyin!


Giriş olarak bir görüntü yerine bir dizi RGB değeri almak uygun mudur? Peki ya çıktı?
JungHwan Min

@JHM Hayır, yapamazsınız. İstediğiniz görüntü biçimini seçebilirsiniz, böylece diliniz yerleşik görüntü desteğine sahip değilse, RGB değer dizisine çok benzeyen sıkıştırılmamış bir .ppm dosyası kullanabilirsiniz.
Buğday Sihirbazı,

Yanıtlar:


8

Mathematica, 286 273 bayt

Image[Array[1,{l=Length@#,l}]~ReplacePart~Thread[#&@@@Split[#&@@@FoldList[Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@#,0},_,#]&,{{1,1},I},Characters@Nest[StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"},"L",Log2@l]]]->Join@@MapAt[Reverse,#,2;;;;2]]]&@*ImageData

Uf! Zorlu ama eğlenceli!

açıklama

ImageData

ImageBir dizisini bir RGB değerleri dizisine dönüştürün .

Array[1,{l=Length@#,l}]

Bir oluşturmak lgöre lbaş dizisi 1, lgiriş uzunluğu (görüntünün genişliğini, yani) 'dir.

Bu verim {{1[1, 1], 1[1, 2], ..., 1[1, L]}, {1[2, 1], ..., 1[2, L]}, ..., {1[L, 1], ..., 1[L, L]}}( lkarışıklığı azaltmak için büyük harflerle yazılmıştır)

StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"}

Bir StringReplaceher yerini fonksiyonu "L"ile "+RF-LFL-FR+"ve "R"ile"-LF+RFR+FL-"

Nest[ ... ,"L",Log2@l]

StringReplaceFonksiyonu String "L", Log2[l]zamanlarına uygulayın .

Characters

Sonuçlanımını dönüştürün Stringbir içine Listkarakter.

Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@#,0},_,#]&

Adsız bir işlev:

  • İkinci giriş ise "-", ilk girişin ikinci elemanını çarpın I.
  • İkinci giriş ise "+", ilk girişin ikinci elemanını bölüştürün I.
  • İkinci giriş ise "F", ilk girişi ikinci girişin ReIm( girişin gerçek ve hayali bölümünü ayırarak) arttırın .
Katlama Listesi [..., {{1,1}, I}, ...]

Başlangıçtan itibaren , karakterlerin {{1,1},I}her bir elemanını Listikinci giriş olarak kullanarak yukarıdaki isimsiz işlevi toplu olarak uygulayın . Bu kod tüm yinelemelerin çıktılarını verir.

#&@@@Split[#&@@@ ... ]

Her birinin ikinci unsurlarından kurtulun Listve kopyaları silin. (Bu noktaya kadar olan adımlar ListHilbert eğrisinin bir koordinatını oluşturur )

Join@@MapAt[Reverse,#,2;;;;2]

Giriş RGB dizisini çıkarın (diğer tüm satırları düzleştirir ve düzleştirir).

Thread[ ... -> ... ]

Ruleİlk girişteki ilk eleman (Hilbert eğrisinin koordinatları), ikinci girişin birinci elemanı (çözülmüş resim), ikinci elemanlı ikinci eleman vb. İle eşleştirilecek şekilde nesneler oluşturun .

... ~ReplacePart~ ...

Bu yedek uygula Ruleiçin s Arrayikinci adımdan.

Image

RGB değerleri dizisine bir a dönüştürün Image.

Örnek giriş / çıkış

Giriş:

Test durumu 1

Çıktı:

çıktı


Giriş:

Edward ve Alphonse Elric, Fullmetal Alchemist'ten

Çıktı:

wat

Ters işlev ( 266 253 bayt)

Image[MapAt[Reverse,Extract[#,#&@@@Split[#&@@@FoldList[Switch[#2,"-",#{1,I},"+",#/{1,I},"F",#+{ReIm@Last@b,0},_,#]&,{{1,1},I},Characters@Nest[StringReplace@{"L"->"+RF-LFL-FR+","R"->"-LF+RFR+FL-"},"L",Log2[l=Length@#]]]]]~Partition~l,2;;;;2]]&@*ImageData

5

Octave 234 Bayt

I=imread(input(''));w=rows(I);X=[0,3;1,2];for k=2:log2(w);n=numel(X);X=[X',rot90(X',2)+3*n;X+n,X+2*n];end;for k = 1:3;I(2:2:end,:,k)=fliplr(I(2:2:end,:,k));end[~,S]=sort(X(:));I(S+(0:w^2:2*w^2))=permute(I,[2 1 3]);imwrite(I,input(''))

Giriş ve çıkış resimlerinin dosya isimleri standart girdi biçiminde sağlanmalıdır. giriş / çıkış olmadan kod boyutu 194 bayttır .
Açıklama:

Endekslerin temel deseni:

X =
  0 3
  1 2

Her bir yinelemede (4), yapılan önceki yinelemenin sonucundan ve her kopyaya bir miktar dönüşümden sonra kopyalanır, ardından tüm bloklar geçerli sonucu oluşturmak için bir araya getirilir.

X =[0,3;1,2];
for k = 2:log2(s)
    n=numel(X);
    X = [X',rot90(X',2)+3*n;X+n,X+2*n];
end

Böylece sahibiz:

block(1,1): X' 
block(1,2): rot90(X',2)+3*n 
block(2,1): X+n
block(2,2): X+2*n

0    1  | 14   15
3    2  | 13   12
--------|--------
4    7  |  8   11
5    6  |  9   10

Sıralanan Hilbert indeksleri ve sıralanmış elemanların indeksleri:

[~,S]=sort(X(:));

Tüm çift satırları saygısız şekilde uygulayarak çözme:

for k = 1:3
    I(2:2:end,:,k) = fliplr(I(2:2:end,:,k));
end

Reraveling uygulandı:
Her kanal için
tekrarlandı -Sekizli verilerde sütun bilge düzenlenmiş olduğundan beri uygulanan hesaplamalar

I(S+(0:w^2:2*w^2))=permute(I,[2 1 3]);

Örnek resimler:

görüntü tanımını buraya girin

görüntü tanımını buraya girin

görüntü tanımını buraya girin

görüntü tanımını buraya girin


G / Ç kullanmaktan kaçınmak istiyorsanız, programınızın bir işlev olarak çalışmasını seçebilirsiniz.
Buğday Sihirbazı,

function + end anahtar kelimeler daha fazla bayt tüketir!
rahnema1
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.