Cùng trang trí nó nào!


18

Giới thiệu

Từ Wikipedia :

Một tessellation của một bề mặt phẳng là ốp lát của một chiếc máy bay sử dụng một hoặc hình học nhiều hình dạng, được gọi là gạch, không có sự chồng chéo và không có khoảng trống.

Một tessname khá nổi tiếng được hiển thị dưới đây:

nhập mô tả hình ảnh ở đây

Các hình thoi được lát gạch theo kiểu không dẫn đến sự chồng chéo hoặc khoảng trống và mô phỏng các cột của các hình khối.

Bài tập

Nhiệm vụ của bạn là viết một chương trình sắp xếp hình thoi giống như hình ảnh trên. Đầu vào cho chương trình sẽ là kích thước của phần thứ ba: height x widthtrong đó chiều rộng là số lượng cột và chiều cao là số lượng hàng.

Một khối lập phương duy nhất 1 x 1(3 gạch hình thoi) được biểu diễn chính xác như vậy:

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

Vì vậy, nếu đầu vào / kích thước là 3 x 2, đây sẽ là đầu ra:

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

Như bạn có thể thấy, có 3 hàng (chiều cao) và 2 cột (chiều rộng). Các cột được hoán đổi lên xuống. Chương trình của bạn cũng nên làm điều này và bắt đầu cao hơn. Ví dụ: 3 x 3sẽ là:

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

Quy tắc

  • Kết quả phải được xuất ra, đầu vào có thể được thực hiện theo bất cứ cách nào bạn thích nhưng phải tương ứng với chiều cao và chiều rộng
  • Trailing newlines được cho phép
  • Các cột tessname luôn bắt đầu từ phía trên rồi xen kẽ lên xuống
  • Các mặt của các điều kiện phải được chia sẻ và các điều khoản phải được đặt chính xác ở giữa các cột khác không có khoảng trống
  • Trình của bạn có thể là một chức năng hoặc một chương trình đầy đủ
  • Chương trình của bạn phải in chính xác đầu ra ở trên với cùng một đầu vào; nói cách khác, đầu ra phải theo cùng định dạng cho hình khối / tessellations

Giả định

  • Bạn có thể giả định rằng đầu vào sẽ luôn lớn hơn 1 x 1, vì vậy bạn không cần các trường hợp nhập số 0

Chấm điểm

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng. Sơ hở tiêu chuẩn cũng bị cấm.

Câu trả lời:


4

JavaScript (ES6), 243 byte

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>

Trực tiếp tính toán tất cả các nhân vật mong muốn. Dành cho /:

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

Dành cho \:

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

Dành cho _:

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 ​​byte

&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!*+
  /\      \
 /  \      \
/    \ _____\
\    /      /
 \  /      /
  \/_____ /
    _____

Hãy thử trực tuyến!

Câu hỏi này nhìn có vẻ dễ hiểu, nhưng các trường hợp cạnh hóa ra phức tạp hơn tôi dự đoán ban đầu. Cách tiếp cận tốt nhất tôi có thể đưa ra là xử lý các cột lẻ và chẵn như các kết xuất riêng biệt, và sau đó chỉ cần hợp nhất các kết quả.

Vì vậy, đối với mỗi tọa độ x, y phải là đầu ra, trước tiên chúng ta cần xác định ký tự nào sẽ được hiển thị cho một cột lẻ, bằng cách ánh xạ tọa độ đầu ra x , y đến tọa độ u , v trong sơ đồ khối như sau:

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

Việc bổ sung (y==0)là để xử lý trường hợp đặc biệt của dòng đầu tiên. Nhưng chúng tôi cũng cần đảm bảo rằng chúng tôi sẽ không hiển thị một vài dòng cuối cùng ở cuối cột và một vài ký tự cuối cùng ở cuối mỗi hàng. Điều này đạt được bằng cách nhân ký tự đầu ra với biểu thức:

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

Việc !(columns%2)tính toán độ rộng là bởi vì số tiền chúng ta cần cắt bớt phần cuối phụ thuộc vào việc tổng số cột là chẵn hay lẻ.

Sau đó, chúng tôi thực hiện một phép tính thứ hai để xác định ký tự nào sẽ được hiển thị cho một cột chẵn, ánh xạ tọa độ u , v như sau:

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

Đây là phép tính cơ bản tương tự như được sử dụng cho các cột lẻ, nhưng bù lại một chút. Và như trước đây, chúng tôi cần đảm bảo rằng chúng tôi không hiển thị một số ký tự trên ranh giới - lần này là một vài dòng đầu tiên ở đầu cột, cũng như một số ký tự ở đầu và cuối của mỗi hàng. Biểu thức chúng tôi nhân lên trong trường hợp này là:

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

Đã tính hai ký tự đầu ra tiềm năng này, giá trị cuối cùng được sử dụng là:

char1 + (char2 * !char1) + 32

Nói cách khác, nếu char1 bằng 0, chúng ta cần xuất char2 , nếu không chúng ta sẽ xuất char1 . Nếu cả hai đều khác không, chúng ta sẽ tạo ra char1 , nhưng điều đó tốt bởi vì cả hai đều có cùng giá trị. Cũng lưu ý rằng các giá trị ký tự này được bù bởi 32 (do đó thêm 32) để số 0 sẽ luôn luôn là một khoảng trắng.


2

Hàng loạt, 590 byte

@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%

Chương :ctrình con có ba tham số; %3là sự khác biệt giữa 1 và 2 cột, %2là sự khác biệt giữa 2 và 3 cột, %1là tiền tố phụ cho cột đầu tiên, vì vậy một cột là %1%2, hai cột là %1%2%3, ba cột là %1%2%3%2, bốn cột là %1%2%3%2%3v.v.


2

Python 2 , 329 326 319 byte

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)

Hãy thử trực tuyến!

Trên thực tế 21 24 31 byte ngắn hơn bài viết không chính xác trước đây của tôi. Tạo danh sách cho các cột lẻ và chẵn sau đó nối chúng cho từng cột theo chiều rộng.


Công việc tốt, may mắn khi chơi golf
Andrew Li

1
Có một vấn đề với trình của bạn. Các cột luân phiên lên xuống, không liên tục xuống
Andrew Li

1
Tôi đã chỉnh sửa câu hỏi để đưa ra một ví dụ cho 3x3.
Andrew Li

Chắc chắn, câu trả lời tuyệt vời dù sao!
Andrew Li
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.