Hình thành gạch trong một vòng hình chữ nhật


8

Đưa ra đầu vào tilesXtilesYtạo một phương thức sẽ tạo ra một vòng hình chữ nhật từ các ô.

Hàm phải sắp xếp các ô trong một vòng như thế này:

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

  • tilesXtilesYluôn luôn là các giá trị nguyên dương, không thể là 0
  • tilesXtilesYkhông phải lúc nào cũng bằng nhau, mong đợi các giá trị như : 2x5, 6x3v.v.
  • Kiểm tra đầu vào không hợp lệ là không cần thiết
  • Bạn có thể sử dụng bất kỳ cách nào để hiển thị các ô, bao gồm mảng 2d, nghệ thuật ASCII hoặc văn bản in.
  • Không có cách nào nghiêm ngặt làm thế nào đầu vào được thông qua miễn là hai số nguyên.
  • Không thể là một dòng, vẽ kích thước hình chữ nhật tilesXtilesYpixel không hợp lệ
  • Mã ngắn nhất sẽ thắng

1
Bạn có thể cho ví dụ về đầu vào / đầu ra?
FliiFe

2
Chúng ta có thể sử dụng một chương trình đầy đủ cũng như một chức năng không?
Màu xanh

@FliiFe Input là hai số nguyên (không thể âm hoặc null), đầu ra là một hình ảnh được in như trong hình ảnh đính kèm.
Ma thuật sáng tạo

Đầu ra có thể là một mảng 2D?
Doorknob

@muddyfish Tôi rất thích giải pháp là toán học và không phải là một phần của một số API.
Ma thuật sáng tạo

Câu trả lời:


6

APL Dyalog, 8 byte

×/¨1<⊂|⍳

Tàu hàm chức năng đơn âm này lấy chiều cao và chiều rộng làm đối số đúng và trả về một mảng 2D gồm 0 '(đường viền) và 1 ' (bên trong). Kiểm tra nó trên TryAPL .

Làm thế nào nó hoạt động

×/¨1<⊂|⍳  Right argument: h w

       ⍳  Generate all index pairs (1-based) of a h×w array.
     ⊂    Enclose (h w), so it depth matches the one of the index array.
      |   For each pair (i j) compute the remainders of the division by (h w).
   1<     Compare all remainders with 1.
×/¨       Reduce each pair of Booleans by multiplication.

5

MATL , 10 byte

2$lO6Lt4$(

Điều này xuất ra một mảng chứa số không và số.

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

2$l    % Implicit inputs M, N. Generate M×N array of ones
O      % Push number 0
6Lt    % Push [2 -1] twice, corresponding to index "2:end-1"
4$(    % Fill the center of the array with value 0. Implicit display

Đối với đầu ra đồ họa, thêm 1YGvào cuối để hiển thị mảng dưới dạng hình ảnh ( 13 byte ):

2$Ol6Lt4$(1YG

Hãy thử nó tại MATL Online! Ví dụ,

>> matl 2$Ol6Lt4$(1YG
> 5
> 7

sản xuất

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


@ Sp3000 Bạn nói đúng ... Tôi không thể cưỡng lại :-) Dù sao, OP đã làm rõ rằng một mảng hoặc nghệ thuật ASCII với bất kỳ ký tự nào là đầu ra hợp lệ
Luis Mendo

@LuisMendo công việc tuyệt vời, nhưng nó phải có hai giá trị được truyền cho phương thức
Creative Magic

@CreativeMagic Xin lỗi. Sửa chữa ngay. Có thể viết lại những thách thức? " Nhẫn vuông " có thể gây nhầm lẫn
Luis Mendo

@LuisMendo không cố gắng đưa ra lời bào chữa, nhưng tiếng Anh không phải là ngôn ngữ đầu tiên của tôi, nếu bạn có thể cho tôi một tiêu đề tốt hơn, tôi rất vui khi nghe nó.
Ảo thuật sáng tạo

1
@Neil OP nói Không thể là một dòng . Tôi lấy đó là "nó không thể là một đường mà không có độ dày thích hợp, tương ứng với một ô". Tôi sẽ hỏi họ
Luis Mendo

4

HTML / JS / CSS, 198 194 byte

Phiên bản đầu ra đồ họa. Số lượng byte không bao gồm f=hay ba <input>yếu tố chỉ được sử dụng cho mục đích trình diễn. Đã lưu 3 byte nhờ @IsmaelMiguel.

f=(n,m)=>{with(d.style)width=n*25+'px',height=m*25+'px'}
<input id=w placeholder=width><input id=h placeholder=height><input type=button value=Go! onclick=f(w.value,h.value)>
<div id=d style="border-image:radial-gradient(#fff 0,#fff 0)0 fill/25px;background:radial-gradient(#000 0,#000 8px,#fff 9px)0 0/25px 25px">


Không thể f=(n,m)=>{d.style.width=n*25+'px';d.style.height=m*25+'px';}được đơn giản hóa để f=(n,m)=>with(d.style)width=n*25+'px',height=m*25+'px';?
Ismael Miguel

@IsmaelMiguel Việc withnày giúp tôi tiết kiệm 3 byte nhưng tôi vẫn cần {}s. Mặt khác ;là không cần thiết nên tôi cũng loại bỏ nó.
Neil

4

MATL , 10 byte

2$l3XyZ+3=

Đối số đầu vào là chiều cao và chiều rộng dưới dạng số nguyên. Đầu ra là một ma trận kích thướcheight x width trong đó các ô biên là 0 và các giá trị bên trong là 1.

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

Giải trình

Logic tương tự như câu trả lời khác của tôi với ít byte hơn.

        % Grab two input parameters implicitly
2$l     % Create a matrix of ones that has the dimensions specified as inputs
3       % Number literal 3
Xy      % Create a 3x3 identity matrix
Z+      % Perform 2D convolution (preserving size)
3=      % Create a logical matrix where values == 3 are 1 and 0 otherwise (boundary)
        % Implicitly display output.

4

MATLAB, 32 31 byte

@(x)conv2(ones(x),eye(3),'s')>2

Điều này tạo ra một chức năng ẩn danh mà sau đó có thể được chạy như ans([4 5])trong không gian làm việc.

Đầu vào là [height, width]và đầu ra là một ma trận có 1 ở giữa và 0 cho đường biên.

Cách thức hoạt động của nó là một ma trận kích thước của đầu vào được tạo. Sau đó, nó được kết hợp với ma trận xác định 3 x 3 với các ma trận trên đường chéo. Chúng tôi sử dụng sameđầu vào conv2(rút ngắn đến 's'đây) để giữ kết quả cùng kích thước với đầu vào.

Sau đó, chúng tôi muốn chuyển đổi đầu ra thành giá trị nhị phân với 0 xung quanh ranh giới và 1 bên trong. Chúng tôi sử dụng bất đẳng thức>2 vì tất cả các pixel cạnh sẽ có kết quả <3 và tất cả các phần tử không biên sẽ có kết quả bằng 3.

Đối với đầu ra đồ họa:

@(x)imagesc(conv2(ones(x),eye(3),'s')>8)
ans([6,9])

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


3

Thạch , 10 byte

p%€,>1P€G

Trả về một lưới 0 's (viền) và 1 ' s (bên trong). Hãy thử trực tuyến!

Làm thế nào nó hoạt động

p%€,>1P€sG  Main link. Arguments: h (height), w (width)

p           Cartesian product; return all pairs in [1, ..., h] × [1, ..., w].
   ,        Yield the pair [h, w].
 %€         For each pair [i, j] in the product, compute [i % h, j % w].
    >1      Compare all resulting moduli with 1.
      P€    Compute the product of each pair of Booleans.
        s   Split the resulting flat list into rows of length w.
         G  Display the results in a 2D grid.

Câu trả lời này là tuyệt vời, nhưng nó phải trực quan là một vòng hình chữ nhật. Mặc dù sử dụng mảng, chuỗi, v.v., nó phải trông giống như một chiếc nhẫn trên màn hình khi bạn chạy nó.
Ma thuật sáng tạo

ĐỒNG Ý. Khi tôi đọc rằng các mảng 2D được cho phép, tôi không mong đợi sự thể hiện trực quan của chúng có vấn đề. Tôi đã chỉnh sửa câu trả lời của mình.
Dennis

@Dennis "[Tôi] phải trông giống như một chiếc nhẫn trên màn hình khi bạn chạy nó". Điều đó có nghĩa là không gian nên được sử dụng?
Erik the Outgolfer

3

Julia, 46 34 byte

f(n,m)=[n>i>1<j<m for i=1:n,j=1:m]

Đây là một hàm chấp nhận hai số nguyên và trả về một mảng boolean 2 chiều.

Chúng tôi xây dựng một ma trận n × m bằng cách sử dụng một sự hiểu biết mảng với một forvòng lặp kép . Đối với mỗi chỉ số từ 1 đến n và 1 đến m , tức là mỗi phần tử của ma trận, chúng tôi đặt giá trị thành truenếu n > i > 1 và 1 < j < m . Điều này đúng ở mọi nơi trừ ranh giới, vì vậy mảng kết quả sẽ có trues ở giữa vàfalse s xung quanh đường viền.

Ví dụ:

julia> f(n,m)=[n>i>1<j<m for i=1:n,j=1:m]
f (generic function with 1 method)

julia> f(4,4)
4x4 Array{Bool,2}:
 false  false  false  false
 false   true   true  false
 false   true   true  false
 false  false  false  false

julia> f(1,1)
1x1 Array{Bool,2}:
 false

julia> f(2,5)
2x5 Array{Bool,2}:
 false  false  false  false  false
 false  false  false  false  false

Đã lưu 12 byte nhờ Dennis!


2

CJam, 20 byte

l~S*a*{3a.f|W%z}4*N*

Đầu vào phải ở dạng height width, đầu ra là lưới ASCII sử dụng khoảng trắng cho tâm và# cho đường biên.

Kiểm tra nó ở đây.

Giải trình

l~       e# Read and evaluate input, dumping h and w on the stack.
S*       e# Create a string of w spaces.
a*       e# Create an array of h copies of that string.
{        e# Repeat this block 4 times...
  3a.f|  e#   For each character in the first row, take its bitwise OR with 3, turning
         e#   spaces into # and leaving # unchanged.
  W%z    e#   Reverse and transpose the grid, rotating it by 90 degrees.
}4*
N*       e# Join the lines of the result with linefeeds.


2

JavaScript (ES6), 80 82 85

Chỉnh sửa 3 byte đã lưu thx @Neil
Chỉnh sửa 2 byte được lưu bằng cách sử dụngreduce một lần

Hàm ẩn danh trả về một chuỗi nhiều dòng

(w,h)=>[...Array(h)].reduce(o=>o+(w>1?'O'+' O'[!--h|!o].repeat(w-2):'')+`O
`,'')

Kiểm tra

f=(w,h)=>[...Array(h)].reduce(o=>o+(w>1?'O'+' O'[!--h|!o].repeat(w-2):'')+`O
`,'')

function test(){
  var [w,h] = I.value.match(/\d+/g)
  w=+w,h=+h // convert to numeric
  O.textContent=f(w,h)
}  

test()
<input value='5 4' id=I><button onclick='test()'>Test</button><pre id=O></pre>


Chắc chắn !--h|!ođã là một số nguyên? Nếu không, tôi thích việc sử dụng !o.
Neil

2

Ruby, 63 byte

Chức năng ẩn danh, in ra STDOUT. Biên giới là thế #.

->x,y{h=?#;puts t=h*x,y>1?[[h+(x<2?'':' '*(x-2)+h)]*(y-2),t]:p}

Xin lỗi, bạn phải xuất ra một chiếc nhẫn, vì vậy không cho phép backticks bên trong.
Erik the Outgolfer

Và có một byte mà tôi đã hy vọng tiết kiệm bằng cách điền vào bên trong một ký tự nhỏ ít gây chú ý ...
Ink Ink

Bạn nhận được một upvote, bạn xứng đáng với nó.
Erik the Outgolfer

1

JavaScript (ES6), 97 byte

(n,m)=>Array(n).fill(' '.repeat(m).replace(/^ | $/g,0)).join`
`.replace(/^.+|.+$/g,'0'.repeat(m))

Tạo một vòng 0s. Có lẽ là một cách tiếp cận khủng khiếp nhưng tôi muốn tránh các trường hợp cạnh.


1

JavaScript (ES6), 77 byte

h=>w=>[...Array(i=h)].map(_=>(a=Array(w).fill(h-i--&&i?0:1),a[0]=a[w-1]=1,a))

Tôi không thích mảng đầu ra mảng (ngay cả khi nó được cho phép). Những gì tôi thấy trong bảng điều khiển là f(4)(4)->Array [ Array[4], Array[4], Array[4], Array[4] ]
edc65

1

Võng mạc , 45 43 byte

\d+
$*
S_`1(?=.* (1+))|.
T`1`#`^.+|.+$|.?¶.

Đầu vào phải ở dạng height width, đầu ra là lưới ASCII sử dụng 1cho trung tâm và# cho ranh giới.

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

Giải trình

\d+
$*

Chuyển đổi mỗi số Nthành một chuỗi số N(tức là chuyển đổi đầu vào thành đơn nguyên).

S_`1(?=.* (1+))|.

Phù hợp với từng 1heightvà thay thế bằng width, đồng thời cũng phù hợp với tất cả mọi thứ khác và loại bỏ nó. Chúng tôi làm điều này bằng cách lạm dụng một giai đoạn phân chia. Điều này tạo ra một w x hlưới.

T`1`#`^.+|.+$|.?¶.

Cuối cùng, chúng tôi thay thế mọi thứ 1bằng một dòng #được tìm thấy trong dòng đầu tiên, dòng cuối cùng hoặc ở đầu hoặc cuối dòng.


1

Trên thực tế , 23 byte

;'#*;))¬' *'#;)@+(+nXX(

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

Cách tiếp cận này rất giống với cách tiếp cận của tôi trong thử thách liên quan này .

Giải trình:

;'#*;))¬' *'#;)@+(+nXX(
                         (implicit) push all input to stack
;'#*                     push a string containing X #s
    ;))                  dupe, and push both to bottom of stack
       ¬' *              push a string containing (X-2) spaces
           '#;)@+(+      add a # to the front and the back of the string
                   nXX   make (Y-2) copies
                      (  bring one of the "#"*X strings back to the top
                         (implicit) pop and print each stack item, separated by newlines

2
Nếu Nghiêm túc v3 không được gọi là Chờ, Thật sao? Tôi sẽ khá thất vọng.
Alex A.

@AlexA. Bạn đã nghiêm túc chỉ?
con mèo

1

QBasic, 69 byte

INPUT x,y
FOR i=1TO y
FOR j=1TO x
?i MOD y<2OR j MOD x<2;
NEXT
?
NEXT

Có kích thước như width,height. Giá trị boolean từ kiểm tra is-it-on-the-Border được in đơn giản: -1đúng và 0sai. Một mẫu chạy giống như:

? 5,3
-1 -1 -1 -1 -1 
-1  0  0  0 -1 
-1 -1 -1 -1 -1 

Phần thưởng: Phiên bản đồ họa, 88 byte

INPUT x,y
SCREEN 9
FOR i=1TO y
FOR j=1TO x
PSET(j*3,i*3),i MOD y<2OR j MOD x<2
NEXT
NEXT

Tôi tin rằng điều này được tính là "không phải là một dòng." Khi MODbiểu thức là sai (0), PSETvẽ một pixel đen; khi nó đúng (-1), PSETrõ ràng vẽ một pixel trắng. Đây 17,31, được hiển thị ở kích thước gấp đôi:

Hình chữ nhật đồ họa


1

TSQL, 107 105 97 byte

DECLARE @ INT=3,@y INT=5

PRINT REPLICATE(1,@)+ISNULL('
'+REPLICATE('1'+ISNULL(SPACE(@-2),'')+'1
',@y-2)+REPLICATE(1,@),'')
  1. tạo dòng đầu tiên
  2. thêm dòng rỗng + ngắt dòng
  3. thêm dòng cuối cùng (khi cần)

0

Kỳ lân , 26 23 byte

P3G$PG@PS@S$L2B$T1B@T1N

Bởi vì ai không thích kỳ lân?!

Giải thích (đầu ra "chương trình danh sách"):

P3  Paint current square with 3
G$P Get: sets $ from input P
G@P Get: sets @ from input P
S@  Subtract 1 from @
S$  Subtract 1 from $
L2  ~Loop 2 times
B$  ~Brush $ more square
T1  ~Turn 1 right angle clockwise
B@  ~Brush @ more square
T1  ~Turn 1 right angle clockwise
N   ~Next (loop)

Đầu ra cho tilesX= 3, tilesY= 5:

Lưu ý: Phiên bản này chỉ hoạt động tilesXtối đa 6 vàtilesY tối đa 5. Câu hỏi không đề cập đến phạm vi chúng tôi cần hỗ trợ, vì vậy tôi cho rằng điều này là ổn. Mặt khác, một bổ sung nhỏ cho chương trình tạo ra sự thay thế này, hỗ trợ phạm vi lớn hơn một chút:

Kỳ lân, 30 27 byte

x0y9P3G$PG@PS@S$L2B$T1B@T1N

Bằng cách thêm x0y9, bắt đầu hộp ở (0,9), chương trình hoạt động tilesXtối đa 9 và tilesYtối đa 9 (vì đầu vào chỉ tăng tối đa 9).


0

J, 16 byte

0(<2#<<0 _1)}$&1

Sử dụng hình dạng $để tạo một hình chữ nhật của tất cả các kích thước của đầu vào, và sau đó sử dụng hình thức bổ sung của Sửa đổi} để biến nội thất thành số không.

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



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.