มา Tessellate กันเถอะ!


18

บทนำ

จากวิกิพีเดีย :

tessellationของพื้นผิวที่เรียบคือการปูกระเบื้องของเครื่องบินโดยใช้หนึ่งหรือรูปทรงเรขาคณิตมากขึ้นเรียกว่ากระเบื้องที่ไม่มีการทับซ้อนและไม่มีช่องว่างที่

Tessellation ที่รู้จักกันดีพอสมควรแสดงอยู่ด้านล่าง:

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

รูปสี่เหลี่ยมขนมเปียกปูนเป็นกระเบื้องในรูปแบบที่ส่งผลให้ไม่มีการทับซ้อนกันหรือช่องว่างและจำลองคอลัมน์ interchanging ของก้อน

งาน

งานของคุณคือการเขียนโปรแกรมที่ tessellates rhombi แบบเดียวกับที่ภาพทำอยู่ด้านบน อินพุตสำหรับโปรแกรมจะเป็นขนาดของเทสเซลเลชัน: height x widthโดยที่ความกว้างคือจำนวนคอลัมน์และความสูงคือจำนวนแถว

คิวบ์เดี่ยวนั่นคือ1 x 1(3 ไทล์ของ rhombi) ถูกแสดงอย่างถูกต้องโดย:

    _____
  /\      \
 /  \      \
/    \ _____\ 
\    /      /
 \  /      /  
  \/_____ /   

ดังนั้นหากอินพุต / ขนาด3 x 2ควรเป็นผลลัพธ์:

    _____
  /\      \
 /  \      \
/    \ _____\ _____
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
  /\      \    /      /
 /  \      \  /      /
/    \ _____\/_____ /
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
  /\      \    /      /
 /  \      \  /      /
/    \ _____\/_____ /
\    /      /\      \
 \  /      /  \      \
  \/_____ /    \ _____\
          \    /      /
           \  /      /
            \/_____ /

อย่างที่คุณเห็นมี 3 แถว (สูง) และ 2 คอลัมน์ (กว้าง) คอลัมน์กำลังเปลี่ยนขึ้นและลง โปรแกรมของคุณควรทำเช่นนี้และเริ่มสูงขึ้น ตัวอย่างเช่น3 x 3จะเป็น:

    _____               _____
  /\      \           /\      \
 /  \      \         /  \      \
/    \ _____\ _____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
  /\      \    /      /\      \
 /  \      \  /      /  \      \
/    \ _____\/_____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
  /\      \    /      /\      \
 /  \      \  /      /  \      \
/    \ _____\/_____ /    \ _____\
\    /      /\      \    /      /
 \  /      /  \      \  /      /
  \/_____ /    \ _____\/_____ /
          \    /      /
           \  /      /
            \/_____ /

กฎระเบียบ

  • ผลลัพธ์จะต้องถูกเอาท์พุทอาจถูกป้อนข้อมูลในแบบที่คุณต้องการ แต่ต้องสอดคล้องกับความสูงและความกว้าง
  • ขึ้นบรรทัดใหม่ที่ได้รับอนุญาต
  • คอลัมน์ tessellation เริ่มต้นจากด้านบนเสมอจากนั้นสลับขึ้นและลง
  • ต้องแบ่งด้านของการ tessellations และจะต้องวาง tessellations อย่างถูกต้องระหว่างคอลัมน์อื่น ๆ ที่ไม่มีช่องว่าง
  • การส่งของคุณอาจเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • โปรแกรมของคุณจะต้องพิมพ์ว่าการส่งออกดังกล่าวข้างต้นได้รับการป้อนข้อมูลเดียวกัน; กล่าวอีกนัยหนึ่งเอาท์พุทจะต้องเป็นไปตามรูปแบบเดียวกันสำหรับคิวบ์ / tessellations

สมมติฐาน

  • คุณสามารถสันนิษฐานได้ว่าอินพุตจะมากกว่าเสมอ1 x 1ดังนั้นคุณไม่จำเป็นต้องมีกรณีที่ป้อนค่าศูนย์

เกณฑ์การให้คะแนน

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้ามเช่นกัน

คำตอบ:


4

JavaScript (ES6), 243 ไบต์

f=
(h,w)=>[...Array(h*6+4)].map((_,i)=>[...Array(w*9+3)].map((_,j)=>i&&(i+j+3)%6==0&&j%9<(i>3?6:3)&&(i>3|j<w*9)&&(j>2|i<h*6)?'/':i&&(i-j+2)%6==0&&j%9<(i>h*6?j<w*9?3:0:6)?'\\':i%3==0&&j>2&&(i*3+j+14)%18%(!i|i>h*6?18:12)<4?'_':' ').join``).join`
`
<div oninput=o.textContent=+h.value&&+w.value?f(h.value,w.value):''><input id=h type=number min=1><input id=w type=number min=1><pre id=o>

คำนวณอักขระที่ต้องการทั้งหมดโดยตรง สำหรับ/:

i&&                         Not on first row of output
(i+j+3)%6==0&&              Backward diagonals
j%9<                        Not on top (right) diamond of hexagons or
    (i>3?6:3)&&             empty spaces on top half row
(i>3|j<w*9)&&               Not on top right corner of output
(j>2|i<h*6)                 Not on bottom left corner of output

สำหรับ\:

i&&                         Not on first row of output
(i-j+2)%6==0&&              Forward diagonals
j%9<                        Not on bottom (right) diamond of hexagons or
    (i>h*6?                 empty spaces on bottom half row or
        j<w*9?3:0:6)        bottom right corner of output

สำหรับ_:

i%3==0&&                    Every third line
j>2&&                       Not on left two columns
(i*3+j+14)%18%              Every 18 characters
    (!i|i>h*6?18:12)<4      One or two groups

3

Befunge, 277 269 ​​ไบต์

&6*4+00p&:55+*3+10p2%20pv@
6+5:g03%*54:::<<0+55p03:<<v%*54++55:\p04:**`+3g03g00`\g01+*3!g02\-*84g+3+!\%
48*+,1+:10g`!#^_$,1+:00g-|>30g:2+6%\3-!+3+g48*-\:2`\20g3*+10g\`*30g2`**40g!*+
  /\      \
 /  \      \
/    \ _____\
\    /      /
 \  /      /
  \/_____ /
    _____

ลองออนไลน์!

คำถามนี้ดูง่ายหลอกลวง แต่กรณีขอบกลายเป็นเรื่องที่ซับซ้อนกว่าที่ฉันคาดไว้ตั้งแต่แรก วิธีที่ดีที่สุดที่ฉันสามารถทำได้คือจัดการกับคอลัมน์ที่แปลกและแม้กระทั่งเป็นการเรนเดอร์ที่แยกกันแล้วก็รวมผลลัพธ์เข้าด้วยกัน

ดังนั้นสำหรับแต่ละพิกัด x, y ที่จะต้องมีการส่งออกก่อนอื่นเราต้องพิจารณาว่าอักขระใดที่ควรแสดงผลสำหรับคอลัมน์คี่โดยการทำแผนที่x , yพิกัดเอาท์พุทกับu , พิกัดvในแผนภาพลูกบาศก์ดังนี้

u = x%20
v = (y+5)%6 + (y==0)

การเพิ่ม(y==0)คือการจัดการกรณีพิเศษของบรรทัดแรก แต่เราต้องตรวจสอบให้แน่ใจว่าเราไม่ได้แสดงผลสองสามบรรทัดสุดท้ายที่ด้านล่างของคอลัมน์และอักขระสองสามตัวสุดท้ายที่อยู่ท้ายแต่ละแถว สิ่งนี้สามารถทำได้โดยการคูณอักขระเอาต์พุตด้วยนิพจน์:

(y > h-3) && (x > w-3*!(columns%2))

!(columns%2)คำนวณความกว้างเป็นเพราะจำนวนเงินที่เราจะต้องตัดออกจากปลายจะขึ้นอยู่กับว่าจำนวนคอลัมน์ทั้งหมดแม้หรือคี่

จากนั้นเราทำการคำนวณครั้งที่สองเพื่อพิจารณาว่าอักขระใดที่ควรแสดงผลสำหรับคอลัมน์คู่การแมปพิกัดu , vดังนี้

u = (x+10)%20
v = (y+2)%6 + (y==3)

นี่คือการคำนวณพื้นฐานแบบเดียวกับที่ใช้สำหรับคอลัมน์คี่ แต่ชดเชยเล็กน้อย และก่อนหน้านี้เราต้องทำให้แน่ใจว่าเราไม่ได้แสดงตัวอักษรบางตัวในขอบเขต - คราวนี้สองสามบรรทัดแรกที่ด้านบนของคอลัมน์รวมถึงตัวละครบางตัวที่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละแถว การแสดงออกที่เราคูณในกรณีนี้คือ:

(y > 2) && (x > 2) && (x < w-3*(columns%2))

เมื่อคำนวณอักขระเอาต์พุตที่เป็นไปได้ทั้งสองค่าสุดท้ายที่ใช้คือ

char1 + (char2 * !char1) + 32

กล่าวอีกนัยหนึ่งถ้าถ่าน 1เป็นศูนย์เราต้องเอาท์พุทถ่าน 2 มิฉะนั้นเราจะเอาท์พุทถ่าน 1 ถ้าทั้งคู่ไม่ใช่ศูนย์เราจะเอาท์พุทchar1แต่ก็ใช้ได้เพราะทั้งคู่มีค่าเท่ากัน นอกจากนี้โปรดทราบว่าค่าอักขระเหล่านี้จะถูกชดเชยด้วย 32 (ดังนั้นการเพิ่ม 32) ดังนั้นศูนย์จะลงท้ายด้วยช่องว่างเสมอ


2

แบตช์ 590 ไบต์

@echo off
set c=call:c 
set b=\      \
set f=%b:\=/%
set s=       
set u=_____
set w=%2
%c%"   " " %u%" "%s%%s%"
%c%"  " "/%b%" "%s%    "
%c%" " "/  %b%" "%s%  "
%c%"" "/    \ %u%\" " %u% "
for /l %%i in (1,1,%1)do %c%"\" "    %f%" "%b%"&%c%" \" "  %f%" "  %b%"&%c%"  \" "/%u% /" "    \ %u%\"&if %%i lss %1 %c%"  /" "%b%" "    %f%"&%c%" /" "  %b%" "  %f%"&%c%"/" "    \ %u%\" "/%u% /"
%c%"   " "" "%s%\    %f%"
%c%"  " "" "  %s%\  %f%"
%c%" " "" "    %s%\/%u% /"
exit/b
:c
set o=%~1
for /l %%j in (%w%,-2,1)do call set o=%%o%%%~2&if %%j gtr 1 call set o=%%o%%%~3
echo(%o%

:cย่อยใช้เวลาสามพารามิเตอร์ %3คือความแตกต่างระหว่าง 1 และ 2 คอลัมน์%2คือความแตกต่างระหว่าง 2 และ 3 คอลัมน์%1เป็นส่วนเสริมพิเศษสำหรับคอลัมน์แรกดังนั้นหนึ่งคอลัมน์คือ%1%2สองคอลัมน์คือ%1%2%3สามคอลัมน์คือสามคอลัมน์คือ%1%2%3%2สี่คอลัมน์%1%2%3%2%3เป็นต้น


2

Python 2 , 329 326 319 ไบต์

h,w=input()
a,R=[' '*10]*3,range
b='  /\      \  # /  \      \ #/    \ _____\#\    /      /# \  /      / #  \/_____ /  '.split('#')
c=['    _____    ']+b*h
e,o=c+a,a+c
k=len(e)
f=e[:]
o[3]=o[3][:10]
for x in R(1,w):
 for y in R(k):f[y]+=((e[y][3:],e[y])[y in R(4)],(o[y][3:],o[y])[y in R(k-3,k)])[x%2]
print'\n'.join(f)

ลองออนไลน์!

ที่จริง21 24 31 ไบต์สั้นกว่าการโพสต์ที่ไม่ถูกต้องของฉันก่อนหน้านี้ สร้างรายการสำหรับคอลัมน์คี่และคู่จากนั้นเชื่อมเข้าด้วยกันสำหรับแต่ละคอลัมน์ในความกว้าง


เป็นงานที่ดีโชคดีในการเล่นกอล์ฟ
Andrew Li

1
เกิดปัญหาขึ้นกับการส่งของคุณ คอลัมน์สลับขึ้นและลงไม่ต่อเนื่อง
แอนดรูว์หลี่

1
ฉันได้แก้ไขคำถามเพื่อรวมตัวอย่างสำหรับ 3x3
Andrew Li

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