Wang Tiles ile Ekranı Doldurun


24

Takip eden 13 kare Wang fayansın her zaman uçağı aperyodik olarak döşemesi kanıtlanmıştır . Bu, kareler tüm komşu tarafların aynı renkte olduğu bir ızgarada düzenlendiğinde, desenin bir tercümesinin asla kendisiyle eşleşmeyeceği anlamına gelir.

Wang fayans

Her döşemeyi metinsel olarak ortada ve köşelerde boşluklarla dolu 3 x 3 ızgarayla ve kenarlarda kırmızı, yeşil, mavi, sarı, gri renkler yerine 1 - 5 sayılarıyla temsil edeceğiz:

 2      2      2      1      1      1      4      3      2      2      4      3      2
1 2    1 3    2 3    2 1    3 1    3 2    4 4    4 4    4 5    4 5    5 5    5 5    5 4
 3      2      3      2      3      2      1      2      1      4      1      2      2

Hedef

Göreviniz genişlik ve yükseklikteki bir programı yazmak ve bu boyutlarda geçerli bir Wang kiremit ızgarası çıkaran. Geçerli bir döşeme, tüm bitişik döşeme kenarlarının aynı renge (veya numaraya) sahip olduğu renktir. Bayt cinsinden en küçük program kazanır.

Girişiniz stdin veya komut satırı argümanlarından gelmeli ve çıktılar stdout'a gitmelidir. Kesin giriş formatı gibi oldukça belirgin bir şey olabilir >>> wangtiler 3 2. Genişlik ve yükseklik her zaman pozitif tamsayılardır.

Örnek (genişlik = 3, yükseklik = 2)

Metinsel döşemeleri düzenlerken, komşu kenarların gerekli sayıda basamak çifti oluşturduğuna dikkat edin:

 1  2  1 
2 11 22 1
 2  3  2 
 2  3  2 
4 55 55 4
 1  2  2 

(Bu uygun çıkış formatı DEĞİLDİR.)

Bunları almak için bunları yatay ve dikey olarak sıkıştırabiliriz:

 1 2 1 
2 1 2 1
 2 3 2 
4 5 5 4
 1 2 2 

Bu sıkıştırılmış format, kullanmanız gereken doğru çıkış formatıdır. Tek numaralı satırların sonundaki boşlukları içermesi gerekir.

Grafik Bonus

Herhangi bir metin çıktısı almak yerine, programınız döşenmiş kılavuzun görüntüsünü çıkarabilir. Grafiksel döşemeler, kare şeklinde düzenlenmiş dört 45-45-90 üçgenden oluşmalı ve yukarıdaki döşemeler gibi kolayca ayırt edilebilen beş renk kullanmalıdır. Siyah sınırlar gerekli değildir. Grafiksel döşemelerin boyutu en az 32 × 32 piksel olmalıdır. Onlara "sıkıştırma" uygulanmaz.

Örnek bonus görüntüsü: (yukarıdaki örnekle aynı ızgara)

bonus örneği

Bonus eksi 150 bayt değerindedir.

notlar

  • Bu 13 set fayans kullanmanız gerekir.
  • Fayans döndürülemeyebilir.
  • Fayans herhangi bir sayıda görünebilir (hiç yok dahil).
  • Herhangi bir boyutta mümkün olan geçerli bir döşeme olabilir.

Sanırım fayans döndürülemez?
Martin Ender

@ MartinBüttner Hayır. Göründüğü gibi sağlanan 13 kutuyu kullanmanız gerekir.
Calvin'in Hobileri,

Her döşemeyi kaç kez kullanabileceğin konusunda bir sınır var mı? Örnekte görüyorum ki iki kez bir kiremit kullandın.
Teun Pronk

@TeunPronk Hayır. Bunları istediğiniz kadar kullanın, ancak elbette bazılarını kenarları uygun şekilde eşleştirmek için daha fazlasını kullanmanız gerekebilir.
Calvin'in Hobileri,

@ Calvin's Hobbies Her zaman olası bir çözüm olduğunu varsaymak güvenli midir?
Teun Pronk

Yanıtlar:


12

GolfScript, 200 karakter

~\:W*):R;1,{)\:C"=QCy_~{MTKAis]?OyJE?~WvM"[64 2400]{base}/@{>}+,{:T;[C,W<!{C W~)=T 64/^8/8%}*C,W%0>{C-1=64/T^8%}*]0-!},1<.!!{1,+}*+.,R<}do);W/.0={' '\512/8%`}%n@{.[.0=8%\{' '\64/8%}/n]\{' '\8/8%`}%n}/

Grafik çıkışı olmayan ASCII versiyonu. STDIN'deki girişi verin - burada deneyin . Kod, düz bir geri izleme yaklaşımı kullanır ve boşluk satırını satır satır doldurur.

Örnekler:

> 3 2
 1 2 1
2 1 2 1
 2 3 2
5 4 4 5
 2 2 1

> 8 5
 1 2 1 2 1 2 1 2
2 1 2 1 2 1 2 1 2
 2 3 2 3 2 3 2 3
5 4 4 5 5 4 4 5 5
 2 2 4 2 2 2 4 2
5 4 5 5 4 5 4 4 5
 2 1 1 2 1 2 1 1
1 3 2 1 2 1 3 2 1
 2 2 2 3 2 2 2 2
5 4 5 4 4 5 4 5 4
 2 1 2 2 1 2 1 2

Grafik Bonus, puan 122, 272 karakter - 150 bonus

~\:W*):R;1,{)\:C"=QCy_~{MTKAis]?OyJE?~WvM"[64 2400]{base}/@{>}+,{:T;[C,W<!{C W~)=T 64/^8/8%}*C,W%0>{C-1=64/T^8%}*]0-!},1<.!!{1,+}*+.,R<}do);W["P3\n"32W*" "3$,32*n 1n]\{{:^;512:X;16,{[^8%]1$*[^X/8%]31*@.+>[^64/8%]31*++32<}:F%8:X;16,-1%{F}%+}%zip{{+}*{8+2base(;~}%' '*n}/}/

Farklı bir çıktı formatlayıcı ile aynı temel kod. Çıktı, PPM formatında bir görüntüdür (yani çıktıyı bir dosyaya yönlendirir image.ppm). Renkler, söz konusu döşemelerden biraz farklıdır, ancak açıkça ayırt edilebilirdir (1-> mavi, 2-> yeşil, 3-> mavi, 4-> kırmızı, 5-> macenta).

16x12 örnek:

16x12 wang örneği


16

Python (565-150 = 415)

BTW ... görünüşe göre soldaki ve üst karodaki sıradaki karoya karar veremiyoruz. Birbirine uyacak bazı fayans kombinasyonları var.
Bu çözüm, bir kiremit sığmazsa tüm olası kombinasyonları ve geri izleri sol - sağ, yukarı - aşağı kaba kaba kuvvetlerle doldurur.

13 çini kanıtı hakkında daha fazla bilgi için: 13 Wang çini aperiodic kümesi

Genişlik ve Yükseklik WveH

Kırmızı, Yeşil, Mavi, Sarı ve Noir belirtilen tarafından R, G, B, YveN

import Image,sys
W,H=map(int,sys.argv[1:])
R=99
G=R<<8
B=G<<8
Y=G+R
N=0
s="RGB";u=32;g=[[0,0]]*W*H;k=f=0
def t(c):i=Image.new(s,(2,2));k=i.load();q=16;k[1,0],k[1,1],k[0,1],k[0,0]=c;return i.resize([64]*2).rotate(45).crop((q,q,q+u,q+u))
while k<H*W:
 z=g[k][1];v=-1;j=k/W;i=k%W
 while z<13:
    l=map(eval,"GGGRRRYBGGYBGGBBRRGYYNNNNYBGBGBGRGRYRGGRRGGBBYYYYNNN"[z::13])
    if(j<1or g[(j-1)*W+i][0][2]==l[0])and(i<1or g[j*W+i-1][0][1]==l[3]):g[k]=[l,z+1];v=1;z=99
    z+=1
 g[k][1]*=(v>0);k+=v
m=Image.new(s,(W*u,H*u))
for e in g:m.paste(t(e[0]),(f%W*u,(f/W)*u));f+=1
m.show()

Çıktı. Gerçek renk şeması değil ... çünkü çok göze batan. Bu bazı ilginç iç dekor desenleri yapabilir ...:

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


14
Neopolitan Minecraft ...
Calvin'in Hobileri

daha büyük bir resim ekleyebilir misin Nasıl görüneceğini merak ediyorum
Gururlu haskeller

1
@proudhaskeller Büyük resim: Imgur . Duvar kağıdı makinesi: bağlantı
Vectörize

1
Bu kesin görünüyor periyodik - ne eksik?
Gurur haskeller

Neredeyse periyodik .. burada daha fazla kontrastlı örnek: Imgur
Vectorized

2

Haskell, 208 bayt

p x|x<2/3=(3!x)3"3212"3
p x=(0.5!x)1"45423"2
f=floor
(k!x)l s m=do{i<-[0,x..];[' ',s!!(2+f(i+x)-f i)]}:do{i<-[0,l*x..];s!!mod(f i)m:" "}:p(k*x)
t n=take$2*n+1
main=do(w,h)<-readLn;putStr.unlines.t h$t w<$>p 1

Aramak yok, sadece matematik. Örnek çalışma: (8,5)stdin'de verilen , çıktılar

 2 2 2 2 2 2 2 2 
4 5 4 5 4 5 4 5 4
 1 2 1 2 1 2 1 2 
3 2 3 2 3 2 3 2 3
 2 3 2 3 2 3 2 3 
4 5 5 4 4 5 5 4 4
 4 2 2 2 4 2 2 2 
4 4 5 4 5 5 4 5 4
 1 1 2 1 1 2 1 2 
3 2 1 3 2 1 3 2 3
 2 2 2 2 2 2 2 3 

Ideone'da çevrimiçi yayın

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.