Lưới hình thoi ASCII


27

Viết mã ngắn nhất được đo bằng số byte để tạo lưới ASCII gồm rhombi, với các tham số sau:

  • m - số lượng hình thoi hoàn chỉnh trong một hàng
  • n - số lượng hàng
  • s - bên của hình thoi nhỏ nhất
  • r - mức độ lồng nhau - có bao nhiêu hình thoi bên trong "những cái cơ sở" (đó là sự kết hợp giữa các giao điểm của lưới)

Ví dụ

1. Input: 5 3 1 0
Output:

/\/\/\/\/\
\/\/\/\/\/
/\/\/\/\/\
\/\/\/\/\/
/\/\/\/\/\
\/\/\/\/\/

A 5x3 grid of rhombi with side 1, no nesting

2. Input: 3 2 2 0
Output:

 /\  /\  /\
/  \/  \/  \
\  /\  /\  /
 \/  \/  \/ 
 /\  /\  /\
/  \/  \/  \
\  /\  /\  /
 \/  \/  \/ 

A 3x2 grid of rhombi with side 2, no nesting

3. Input: 5 2 1 2
Output:

///\\\///\\\///\\\///\\\///\\\
///\\\///\\\///\\\///\\\///\\\
///\\\///\\\///\\\///\\\///\\\
\\\///\\\///\\\///\\\///\\\///
\\\///\\\///\\\///\\\///\\\///
\\\///\\\///\\\///\\\///\\\///
///\\\///\\\///\\\///\\\///\\\
///\\\///\\\///\\\///\\\///\\\
///\\\///\\\///\\\///\\\///\\\
\\\///\\\///\\\///\\\///\\\///
\\\///\\\///\\\///\\\///\\\///
\\\///\\\///\\\///\\\///\\\///

A 5x2 grid of rhombi with side 1 (the smallest rhombus), level of nesting is 2

4. Input: 4 2 2 1
Output:

 //\\  //\\  //\\  //\\ 
///\\\///\\\///\\\///\\\
//  \\//  \\//  \\//  \\
\\  //\\  //\\  //\\  //
\\\///\\\///\\\///\\\///
 \\//  \\//  \\//  \\//   
 //\\  //\\  //\\  //\\ 
///\\\///\\\///\\\///\\\
//  \\//  \\//  \\//  \\
\\  //\\  //\\  //\\  //
\\\///\\\///\\\///\\\///
 \\//  \\//  \\//  \\//   

A 4x2 grid of rhombi with side 2 with level of nesting 1 

5. Input: 4 2 3 3
Output:

  ////\\\\    ////\\\\    ////\\\\    ////\\\\
 /////\\\\\  /////\\\\\  /////\\\\\  /////\\\\\
//////\\\\\\//////\\\\\\//////\\\\\\//////\\\\\\
//////\\\\\\//////\\\\\\//////\\\\\\//////\\\\\\
/////  \\\\\/////  \\\\\/////  \\\\\/////  \\\\\
////    \\\\////    \\\\////    \\\\////    \\\\
\\\\    ////\\\\    ////\\\\    ////\\\\    ////
\\\\\  /////\\\\\  /////\\\\\  /////\\\\\  /////
\\\\\\//////\\\\\\//////\\\\\\//////\\\\\\//////
\\\\\\//////\\\\\\//////\\\\\\//////\\\\\\//////
 \\\\\/////  \\\\\/////  \\\\\/////  \\\\\/////  
  \\\\////    \\\\////    \\\\////    \\\\////  
  ////\\\\    ////\\\\    ////\\\\    ////\\\\
 /////\\\\\  /////\\\\\  /////\\\\\  /////\\\\\
//////\\\\\\//////\\\\\\//////\\\\\\//////\\\\\\
//////\\\\\\//////\\\\\\//////\\\\\\//////\\\\\\
/////  \\\\\/////  \\\\\/////  \\\\\/////  \\\\\
////    \\\\////    \\\\////    \\\\////    \\\\
\\\\    ////\\\\    ////\\\\    ////\\\\    ////
\\\\\  /////\\\\\  /////\\\\\  /////\\\\\  /////
\\\\\\//////\\\\\\//////\\\\\\//////\\\\\\//////
\\\\\\//////\\\\\\//////\\\\\\//////\\\\\\//////
 \\\\\/////  \\\\\/////  \\\\\/////  \\\\\/////  
  \\\\////    \\\\////    \\\\////    \\\\////  

A 4x2 grid of rhombi with side 3, level of nesting 3

Hãy chắc chắn để hiển thị hình thoi có thể nhìn thấy một phần ở các cạnh và góc khi cần thiết.


1
@AdmBorkBork Bằng cách "lồng" Tôi có nghĩa là số lượng hình thoi được ghi trong các cơ sở, được tìm thấy giữa các giao điểm của lưới.
Galen Ivanov


@Luis Mendo - vâng, nó rõ ràng liên quan đến nhiệm vụ của tôi.
Galen Ivanov

@Stewie Griffin: codegolf.stackexchange.com/questions/146747/NH - Trường hợp thử nghiệm thứ 3
sergiol

5
Ôi, làm thế nào tôi nhớ gối của tôi!
Stewie Griffin

Câu trả lời:


17

SOGL V0.12 , 20 byte

ā.I∫e+H╚╬8}:±№╬8╬¡∙*

Hãy thử nó ở đây! Đưa đầu vào theo thứ tự đảo ngược của những gì chúng có trong các ví dụ - r, s, n, m.

Giải trình:

ā                     push an empty array - canvas
 .I∫      }           for each in range(input) (1-indexed)
    e+                  add the second input
      H                 decrement
       ╚                create a diagonal of that size
        ╬8              insert into the canvas
           :          create a duplicate of the canvas
            ±№        reverse it vertically and horizotally
              ╬8      insert that into the canvas
                έ    quad-palindromize
                  ∙   multiply vertically by the next input
                   *  multiply horizontally by the next input

2
Điều này thật tuyệt vời, làm thế nào để bạn thậm chí nén một chương trình như vậy trong 20 byte.
Erik the Outgolfer 31/10/17

1
Điều này thật tuyệt vời ... +1 từ tôi vì đã đánh bại Char than bằng 28 byte đáng kinh ngạc: O
Ông Xcoder

Điều đó thực sự ấn tượng!
Galen Ivanov

@ Mr.Xcoder 19 byte bây giờ. Nhưng sau đó, tôi chống lại các nội dung như ∙*...
Neil

1
Lặp lại chuỗi Vectorised là hợp lý ngắn trong Than; nếu tôi có thể xây dựng một chuỗi đại diện cho viên kim cương, nó sẽ chỉ tốn 6 byte để lặp lại nó. Thật không may, tôi phải mất 50 byte để làm điều đó. Mặt khác, vẽ kim cương chỉ mất tôi 17 byte, chỉ hơn 1 SOGL ... nhưng sau đó phải mất 20 byte để nhân lên khung vẽ.
Neil

8

Than , 48 39 37 byte

UO⊕Iε\F⊖IζC¹¦¹‖ML≔⊗⁺IζIεδF⊖NCδ⁰F⊖NC⁰δ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

UO⊕Iε\

Vẽ một hình vuông có kích thước r + 1. Đây là một phần tư của một viên kim cương lồng nhau có kích thước 1.

F⊖IζC¹¦¹

Sao chép hình vuông 1 lần vuông và s - 1lần xuống để có kích thước phù hợp.

‖ML

Phản ánh nó để trở thành một viên kim cương lồng nhau đầy đủ.

≔⊗⁺IζIεδ

Tính kích thước của viên kim cương lồng nhau này.

F⊖NCδ⁰

Sao chép kim cương vào đúng m - 1thời điểm.

F⊖NC⁰δ

Sao chép kim cương xuống n - 1lần.


8

Con trăn 2 , 160 159 158 byte

-1 byte nhờ Jonathan Frech

m,n,s,r=input()
l=~-s*' '+'/'*(r-~r)+~-s*' '
for x in range(n*2):print'\n'.join(m*(l[i:i+s+r]+l.replace(*'/\\')[i:i+s+r][::-1])for i in range(r+s))[::1-x%2*2]

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

Điều này sử dụng thực tế là đáy của hình thoi là đỉnh đảo ngược ( [::-1]), lặp đi lặp lại range(n*2)và sử dụng ~x%2*2-1để kiểm soát nếu nó là đỉnh hoặc đáy.
Đối với phần trên cùng (và phía dưới), bên phải chỉ là phần bên trái được đảo ngược và thay thế /bằng \-> l.replace(*'/\\')..[::-1]
Để tạo mẫu / lồng ~-s*' '+'/'*(1+r*2)+~-s*' 'được sử dụng để tạo một chuỗi như thế /// sẽ được lặp lại và cắt nhỏ:

   '|  //|/  '  
  ' | ///|  '  
 '  |/// | '  
'  /|//  |'  

Tôi nghĩ rằng (1+r*2)có thể (r-~r).
Jonathan Frech

7

Julia 0,6 , 190 byte

g(n,m,s,r)=(s+=r+1;f(i,j,u=mod(i-j+r,2s),v=mod(j+i+r,2s))=(" \\/")[abs(u-r)<abs(v-r)?1+(u<=2r):1+2(v<=2r)];
for i=1:2(s-1)m println((f(i+(i-1)÷(s-1),s+j+(j-1)÷(s-1))for j=1:2(s-1)n)...)end)

Đây là một giải pháp chức năng tính toán cho mọi cặp chỉ số i,jnhững gì biểu tượng sẽ được hiển thị.

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

Hình minh họa

Bắt đầu với một lưới

f(i,j,u=mod(i,2s),v=mod(j,2s))=(" -|*")[1+(u==0)+2(v==0)]
for i=1:2(s-1)m println((f(i-1,j)for j=1:2(s-1)n)...)end

---------*---------*----
         |         |    
         |         |    
         |         |    
         |         |    
         |         |    
         |         |    
         |         |    
         |         |    
         |         |    
---------*---------*----
         |         |    
         |         |    
         |         |    
         |         |    
         |         |    

r > 0 có nghĩa là dòng dày hơn

f(i,j,u=mod(i+r,2s),v=mod(j+r,2s))=(" -|*")[1+(u<=2r)+2(v<=2r)]
for i=1:2(s-1)m println((f(i,j)for j=1:2(s-1)n)...)end

**-----*****-----*****--
**-----*****-----*****--
||     |||||     |||||  
||     |||||     |||||  
||     |||||     |||||  
||     |||||     |||||  
||     |||||     |||||  
**-----*****-----*****--
**-----*****-----*****--
**-----*****-----*****--
**-----*****-----*****--
**-----*****-----*****--
||     |||||     |||||  
||     |||||     |||||  
||     |||||     |||||  
||     |||||     ||||| 

Xử lý các góc bằng cách kiểm tra đường nào trên lưới ban đầu là gần nhất

f(i,j,u=mod(i+r,2s),v=mod(j+r,2s))=(" -|")[abs(u-r)<abs(v-r)?1+(u<=2r):1+2(v<=2r)]
for i=1:2(s-1)m println((f(i,j)for j=1:2(s-1)n)...)end

|-------|||-------|||---
||-----|||||-----|||||--
||     |||||     |||||  
||     |||||     |||||  
||     |||||     |||||  
||     |||||     |||||  
||     |||||     |||||  
||-----|||||-----|||||--
|-------|||-------|||---
---------|---------|----
|-------|||-------|||---
||-----|||||-----|||||--
||     |||||     |||||  
||     |||||     |||||  
||     |||||     |||||  
||     |||||     |||||  

Một nàng tiên bảo chúng ta xóa bỏ từng s-1dòng

f(i,j,u=mod(i+r,2s),v=mod(j+r,2s))=(" -|")[abs(u-r)<abs(v-r)?1+(u<=2r):1+2(v<=2r)]
for i=1:2(s-1)m println((f(i+(i-1)÷(s-1),s+j+(j-1)÷(s-1))for j=1:2(s-1)n)...)end

---||------||------||---
--||||----||||----||||--
  ||||    ||||    ||||  
  ||||    ||||    ||||  
  ||||    ||||    ||||  
  ||||    ||||    ||||  
--||||----||||----||||--
---||------||------||---
---||------||------||---
--||||----||||----||||--
  ||||    ||||    ||||  
  ||||    ||||    ||||  
  ||||    ||||    ||||  
  ||||    ||||    ||||  
--||||----||||----||||--
---||------||------||---

Đi qua đường chéo và thực hiện

f(i,j,u=mod(i-j+r,2s),v=mod(j+i+r,2s))=(" \\/")[abs(u-r)<abs(v-r)?1+(u<=2r):1+2(v<=2r)]
for i=1:2(s-1)m println((f(i+(i-1)÷(s-1),s+j+(j-1)÷(s-1))for j=1:2(s-1)n)...)end

 ///\\\  ///\\\  ///\\\ 
////\\\\////\\\\////\\\\
////\\\\////\\\\////\\\\
///  \\\///  \\\///  \\\
\\\  ///\\\  ///\\\  ///
\\\\////\\\\////\\\\////
\\\\////\\\\////\\\\////
 \\\///  \\\///  \\\/// 
 ///\\\  ///\\\  ///\\\ 
////\\\\////\\\\////\\\\
////\\\\////\\\\////\\\\
///  \\\///  \\\///  \\\
\\\  ///\\\  ///\\\  ///
\\\\////\\\\////\\\\////
\\\\////\\\\////\\\\////
 \\\///  \\\///  \\\/// 

3

JavaScript (ES6), 154 byte

f=
(m,n,s,r)=>[...Array((s+=r)*n*2)].map((_,i)=>[...Array(s*m*2)].map((_,j)=>i/s&1^j/s&1?`\\ `[g(j%s)]:`/ `[g(s-1-j%s)],g=j=>i%s-j>r|j-i%s>r).join``).join`
`
<div oninput=o.textContent=f(+m.value,+n.value,+s.value,+r.value)>
m: <input type=number min=0 id=m><br>
n: <input type=number min=0 id=n><br>
s: <input type=number min=0 id=s><br>
r: <input type=number min=0 id=r></div>
<pre id=o>

Trực tiếp tính toán ký tự tại mỗi ô của đầu ra.


2

CJam, 44

q~:R+,_ff{-zR>}{_W%:~\+"\ /"f=}%_W%Wf%+*f*N*

Dùng thử trực tuyến

Giải trình:

q~           read and evaluate the input
:R+          save the last number in variable R, then add the last 2 numbers (s+r)
,_           make an array [0 1 … s+r-1] and duplicate it
ff{…}        make a matrix, calculating for each (x,y) pair from the 2 arrays:
  -z         abs(x-y)
  R>         compared with R (1 if greater, 0 if not)
{…}%         transform each row of the matrix:
  _W%        duplicate and reverse it
  :~         bitwise-NOT each element (0 → -1, 1 → -2)
  \+         prepend to the original row
  "\ /"f=    replace numbers with characters from this string (by index):
              0 → '\'; 1, -2 → ' '; -1 → '/'
              this generates the "/\" part
_W%          duplicate the matrix and reverse the rows
Wf%+         reverse each row, then append (by rows) to the original matrix
              this adds the "\/" part
*            repeat the matrix (by rows) n times
f*           repeat each row m times
N*           join the rows with newlines

2

C # (.NET Core) , 167 byte

(c,r,s,n)=>{int w=s+n,i=0,j;var g="";for(;i<r*2*w;i++,g+="\n")for(j=0;j<c*2*w;){int y=i%w,q=(j/w+i/w+1)%2,p=~-w*q+j++%w*(1-2*q);g+=p>y+n|p<y-n?' ':"\\/"[q];}return g;}

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

Tôi ngạc nhiên bởi kích thước tôi quản lý; Ban đầu tôi đã mong đợi một giải pháp lâu hơn. Khi nói điều này, tôi chắc chắn có những thủ thuật khác mà tôi đã bỏ lỡ.

Khói

(c,r,s,n)=>{
    int w=s+n, // rhombus quadrant width, and height
        i=0, // string row
        j; // string column

    var g="";

    // go through every character row and column
    for(; i < r*2*w; i++, g += "\n")
        for(j = 0; j < c*2*w;)
        {
            int y = i % w, // vertical position in the quadrant
                q = ( j / w + i / w + 1) % 2, // Get the rhombus quadrant as a 0 or 1
                p = ~-w * q + j++ % w * (1-2*q); // horizontal position in quadrant. the value is either ascending or descending depending on the quadrant

            // select which character to use at this [i,j] position
            g += p > y + n | p < y - n ? ' ' : "\\/"[q];
        }

    return g;
}

1

Python 2 , 201 189 byte

def f(m,n,s,r):Z=range(s+r);R=[r-~min(i,s+~i+r,min(s-1,r))for i in Z];L=[m*(' '*(s+~i)+'/'*R[i]+'  '*(i-r)+'\\'*R[i]+' '*(s+~i))for i in Z];print'\n'.join((L+[l[s+r:]+l[:s+r]for l in L])*n)

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

Sử dụng thực tế là đáy giống như đỉnh, nhưng đã thay đổi:

Top:       /\/\/\
Bottom:     /\/\/\

Đã lưu 22 byte nhờ Jonathan Frech


s-i-1có thể s+~i, tiết kiệm hai byte. r+1+min(...có thể r-~min(..., tiết kiệm một cái khác L=[(...)*m forcó thể L=[m*(...)for, tiết kiệm thêm một byte.
Jonathan Frech

L+=[...];print'\n'.join(L*n)có thể print'\n'.join((L+[...])*n)để lưu một byte khác, dẫn đến 196 byte .
Jonathan Frech

195 byte , nếu ai cũng thay thế s+r-i-1bằng s+~i+r.
Jonathan Frech


Phiên bản 192 byte thay thế hoặc phiên bản 191 byte sử dụng execvà định dạng chuỗi.
Jonathan Frech

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.