ASCII 마름모꼴 그리드


27

다음과 같은 매개 변수를 사용하여 바이트 수로 측정 된 가장 짧은 코드를 작성하여 마름모꼴로 구성된 ASCII 그리드를 생성하십시오.

  • m-한 행에 완전한 마름모꼴 수
  • n-행 수
  • s-가장 작은 마름모의 측면
  • r-중첩 수준- "기본 것들"내부에 몇 개의 마름모꼴이 있는지 (그리드의 교차점 사이에서 퐁당 함)

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

필요한 경우 가장자리와 모서리에 부분적으로 보이는 마름모꼴을 표시하십시오.


1
@AdmBorkBork "nesting"이란 기본 그리드에 새겨진 마름모꼴의 수를 의미하며 그리드의 교차점 사이에 있습니다.
Galen Ivanov


@Luis Mendo-예, 그것은 분명히 내 작업과 관련이 있습니다.
Galen Ivanov

@Stewie Griffin : codegolf.stackexchange.com/questions/146747/… — 세 번째 테스트 사례
sergiol 1976

5
오, 내가 베개를 그리워하는 방법!
Stewie Griffin

답변:


17

SOGL V0.12 , 20 바이트

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

여기 사용해보십시오! 예제에있는 순서와 반대로 입력을 취합니다 (r, s, n, m).

설명:

ā                     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
이것은 놀랍습니다. 어떻게 그런 프로그램을 20 바이트로 압축합니까?
Outgolfer Erik

1
엄청나게 28 바이트로 숯을 두들겨 준 +1 : O
Mr. Xcoder

정말 인상적입니다!
Galen Ivanov

@ Mr.Xcoder 이제 19 바이트입니다. 하지만 내가 좋아하는 내장 명령에 반대 해요 ∙*...

1
차콜에서는 벡터화 된 문자열 반복이 상당히 짧습니다. 다이아몬드의 문자열 표현을 만들 수 있다면 반복하는 데 6 바이트 밖에 들지 않습니다. 불행히도 그렇게하려면 50 바이트가 걸립니다. 반면에 다이아몬드를 그리면 17 바이트 만 걸리고 SOGL보다 1 바이트 만 더 걸리지 만 캔버스를 곱하는 데 20 바이트가 걸립니다.
Neil

8

, 48 39 37 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

UO⊕Iε\

크기의 제곱을 그 r + 1립니다. 이것은 크기가 1 인 내포 다이아몬드의 1/4입니다.

F⊖IζC¹¦¹

정사각형 1 정사각형을 오른쪽 및 아래쪽으로 복사하여 s - 1올바른 크기로 만듭니다.

‖ML

완전히 중첩 된 다이아몬드가되도록 반영하십시오.

≔⊗⁺IζIεδ

이 중첩 다이아몬드의 크기를 계산합니다.

F⊖NCδ⁰

다이아몬드를 적시에 복사하십시오 m - 1.

F⊖NC⁰δ

다이아몬드를 아래쪽으로 복사하십시오 n - 1.


8

파이썬 (2) , 160 (159) 158 바이트

Jonathan Frech 덕분에 -1 바이트

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]

온라인으로 사용해보십시오!

이것은 마름모꼴의 맨 아래가 맨 위가 맨 위 (맨 아래 [::-1])인지 반복 range(n*2)하여 사용 ~x%2*2-1하여 맨 위 또는 맨 아래인지를 제어하는 ​​데 사용 됩니다.
상단 (및 하단)의 경우 오른쪽은 왼쪽이 반전되고 다음으로 대체 /됩니다 \-> l.replace(*'/\\')..[::-1]
패턴 생성 / 중첩 ~-s*' '+'/'*(1+r*2)+~-s*' ' /// 반복되고 잘린 문자열을 만드는 데 사용됩니다 .

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

나는 (1+r*2)될 수 있다고 생각 한다 (r-~r).
Jonathan Frech

7

줄리아 0.6 , 190 바이트

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)

이것은 모든 인덱스 쌍에 i,j대해 기호가 표시 되는 것을 계산하는 기능 솔루션입니다 .

온라인으로 사용해보십시오!

삽화

그리드로 시작

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 더 두꺼운 선을 의미

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

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

원본 그리드에서 가장 가까운 선을 확인하여 모서리를 처리하십시오.

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

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

요정은 우리에게 모든 s-1줄 을 제거하라고 말합니다

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

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

대각선으로 이동하여 완료

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

자바 스크립트 (ES6), 154 바이트

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>

출력의 각 셀에서 문자를 직접 계산합니다.


2

CJam, 44

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

온라인으로 사용해보십시오

설명:

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 코어) 167 바이트

(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;}

온라인으로 사용해보십시오!

내가 관리 한 규모에 놀랐습니다. 처음에는 더 긴 솔루션을 기대하고있었습니다. 이것을 말하면서, 내가 놓친 다른 트릭이 있다고 확신합니다.

골프

(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

파이썬 2 , 201 189 바이트

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)

온라인으로 사용해보십시오!

하단이 상단과 동일하지만 이동 된 사실을 사용합니다.

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

Jonathan Frech 덕분에 22 바이트 절약


s-i-1s+~i2 바이트를 절약 할 수 있습니다 . 다른 것을 저장할 r+1+min(...수 있습니다 r-~min(.... 더 많은 바이트를 절약 L=[(...)*m for할 수 있습니다 L=[m*(...)for.
Jonathan Frech

L+=[...];print'\n'.join(L*n)print'\n'.join((L+[...])*n)다른 바이트를 저장하여 196 바이트 가 될 수 있습니다 .
Jonathan Frech

195 바이트 , 하나는 또한 대체하는 경우 s+r-i-1s+~i+r.
Jonathan Frech


및 문자열 형식을 사용하는 대체 192 바이트 버전 또는 191 바이트 버전exec .
Jonathan Frech

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.