เติมเต็มหน้าจอด้วยกระเบื้องวัง


24

มันได้รับการพิสูจน์แล้วว่าต่อไปนี้ 13 ตารางวังกระเบื้องเสมอกระเบื้องเครื่องบินaperiodically ซึ่งหมายความว่าเมื่อสี่เหลี่ยมถูกจัดเรียงในตารางที่มีด้านข้างทั้งหมดมีสีเดียวกันการแปลของรูปแบบจะไม่ตรงกับตัวเอง

กระเบื้องวัง

เราจะเป็นตัวแทนของแต่ละกระเบื้อง textually โดยตาราง 3 × 3 ที่เต็มไปด้วยช่องว่างที่ศูนย์และมุมและตัวเลข 1 ถึง 5 แทนสีแดง, เขียว, น้ำเงิน, เหลือง, เทา, ที่ขอบ:

 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

เป้าหมาย

งานของคุณคือการเขียนโปรแกรมที่ใช้ในความกว้างและความสูงและส่งออกตารางกระเบื้องวังที่ถูกต้องด้วยขนาดเหล่านั้น การปูกระเบื้องที่ถูกต้องคือการที่ขอบกระเบื้องที่อยู่ติดกันทั้งหมดมีสีเดียวกัน (หรือตัวเลข) โปรแกรมที่เล็กที่สุดเป็นไบต์ชนะ

อินพุตของคุณควรมาจาก stdin หรืออาร์กิวเมนต์บรรทัดรับคำสั่งและเอาต์พุตควรไปที่ stdout >>> wangtiler 3 2รูปแบบการป้อนข้อมูลที่แน่นอนสามารถเป็นอะไรก็ได้ที่เห็นได้ชัดพอสมควรเช่น ความกว้างและความสูงเป็นจำนวนเต็มบวกเสมอ

ตัวอย่าง (width = 3, height = 2)

โปรดสังเกตว่าเมื่อเราวางเลย์เอาต์แบบเรียงต่อกันขอบที่อยู่ใกล้เคียงจะต้องมีตัวเลขสองหลักที่ซ้ำซ้อน:

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

(นี่ไม่ใช่รูปแบบเอาต์พุตที่เหมาะสม)

เราสามารถบีบอัดเหล่านี้ในแนวนอนและแนวตั้งเพื่อรับ:

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

รูปแบบการบีบอัดนี้เป็นรูปแบบผลลัพธ์ที่เหมาะสมที่คุณต้องใช้ บรรทัดที่เป็นเลขคี่จะต้องมีช่องว่างต่อท้าย

โบนัสกราฟิก

แทนที่จะมีเอาท์พุทที่เป็นข้อความใด ๆ โปรแกรมของคุณอาจส่งออกภาพของตารางกระเบื้อง กระเบื้องกราฟิกต้องประกอบด้วยรูปสามเหลี่ยม 45-45-90 สี่รูปแบบที่จัดเรียงเป็นสี่เหลี่ยมและใช้สีที่แตกต่างได้ห้าสีอย่างเช่นกระเบื้องด้านบน ไม่จำเป็นต้องใช้เส้นขอบสีดำ ไทล์กราฟิกต้องมีขนาดอย่างน้อย 32 × 32 พิกเซล ไม่มีการใช้ "การบีบอัด"

ตัวอย่างภาพโบนัส: (กริดเดียวกันกับตัวอย่างด้านบน)

ตัวอย่างโบนัส

โบนัสมีมูลค่าลบ 150 ไบต์

หมายเหตุ

  • คุณต้องใช้ชุดไพ่ 13 ใบนี้
  • กระเบื้องอาจไม่หมุน
  • ไทล์อาจปรากฏจำนวนครั้งใด ๆ (รวมถึงไม่มีเลย)
  • คุณอาจสมมติว่าการเรียงต่อกันที่ถูกต้องกับมิติข้อมูลใด ๆ เป็นไปได้

ฉันคิดว่ากระเบื้องไม่สามารถหมุนได้?
Martin Ender

@ MartinBüttnerไม่คุณจะต้องใช้ชุดไพ่ 13 ใบที่มีให้ตรงตามที่ปรากฏ
งานอดิเรกของ Calvin

มีการ จำกัด จำนวนครั้งที่คุณสามารถใช้แต่ละไทล์ได้หรือไม่ ฉันเห็นในตัวอย่างของคุณคุณใช้ไทล์หนึ่งแผ่นสองครั้ง
Teun Pronk

@TeunPronk Nope ใช้งานได้หลายครั้งตามที่คุณต้องการ (แน่นอนว่าคุณอาจถูกบังคับให้ใช้บางอย่างมากขึ้นเพื่อให้ตรงกับขอบ)
งานอดิเรกของ Calvin

@ Calvin'sHobbies มีความปลอดภัยหรือไม่หากคิดว่าจะมีทางออกที่เป็นไปได้เสมอ
Teun Pronk

คำตอบ:


12

GolfScript 200 ตัวอักษร

~\: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}/

เวอร์ชัน ASCII ที่ไม่มีเอาต์พุตกราฟิก ให้ข้อมูลเกี่ยวกับ STDIN - พยายามที่นี่ รหัสใช้แนวทางย้อนรอยเรียบและเติมช่องว่างทีละบรรทัด

ตัวอย่าง:

> 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

โบนัสกราฟิกคะแนน 122, 272 ตัวอักษร - 150 โบนัส

~\: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}/}/

รหัสพื้นฐานเดียวกันกับตัวจัดรูปแบบผลลัพธ์อื่น เอาท์พุทเป็นภาพในรูปแบบ PPM (เช่นเพียงแค่เปลี่ยนเส้นทางการส่งออกไปยังไฟล์image.ppm) สีนั้นแตกต่างจากกระเบื้องในคำถามเล็กน้อย แต่สามารถแยกแยะได้อย่างชัดเจน (1-> สีน้ำเงิน, 2-> สีเขียว, 3> สีฟ้า, 4> สีแดง, 5> สีม่วงแดง)

ตัวอย่าง 16x12:

16x12 ตัวอย่างวัง


16

Python (565 - 150 = 415)

Btw ... ดูเหมือนว่าเราจะไม่สามารถเลือกกระเบื้องต่อไปได้อย่างไร้เดียงสาโดยใช้กระเบื้องซ้ายและขวา มีการผสมผสานของกระเบื้องที่เข้ากันได้
วิธีการแก้ปัญหานี้เติมในซ้าย -> ขวาบน -> บังคับเดรัจฉานผ่านชุดค่าผสมและ backtracks ที่เป็นไปได้ทั้งหมดถ้าไพ่ไม่สามารถใส่ได้

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการพิสูจน์ตัวต่อแผ่น 13 ตัว: ชุดไพ่ 13 Wang แบบ aperiodic

ความกว้างและความสูงถูกระบุโดยWและH

สีแดง, สีเขียว, สีฟ้า, สีเหลืองและสี Noir ระบุโดยR, G, B, YและN

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

เอาท์พุต ไม่ใช่รูปแบบสีที่แท้จริง ... เพราะจ้องเกินไป สิ่งนี้อาจทำให้รูปแบบการตกแต่งภายในที่น่าสนใจ ... :

ป้อนคำอธิบายรูปภาพที่นี่


14
Neopolitan Minecraft ...
งานอดิเรกของ Calvin

คุณสามารถเพิ่มภาพที่ใหญ่ขึ้นได้ไหม? ฉันอยากรู้ว่ามันจะเป็นอย่างไร
ภูมิใจ Haskeller

1
@proudhaskeller ภาพขนาดใหญ่: Imgur ผู้ผลิตวอลล์เปเปอร์: ลิงก์
Vectorized

1
แน่ใจว่านี้ดูเป็นระยะ - สิ่งที่ฉันหายไป?
ภูมิใจ haskeller

เกือบเป็นระยะ .. ตัวอย่างที่มีความเปรียบต่างมากขึ้นที่นี่: Imgur
Vectorized

2

Haskell, 208 ไบต์

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

ไม่ต้องค้นหาแค่คณิตศาสตร์ ตัวอย่างการรัน: กำหนดไว้(8,5)บน stdin, เอาต์พุต

 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.