매우 간단한 그리드 마크


29

양의 정수 W, H 및 N을 사용하는 프로그램 또는 함수를 작성하십시오. 일반 영어 읽기 순서의 .모든 N 번째 .가으로 대체 되는 WxH 격자를 인쇄하거나 반환하십시오 X.

예를 들어, W = 7, H = 3, N = 3 인 경우 그리드의 너비는 7 자, 높이는 3이며 왼쪽 상단에서 읽는 세 번째 문자는 모두 다음과 X같습니다.

..X..X.
.X..X..
X..X..X

마찬가지로 입력이 W = 10, H = 4, N = 5이면 출력은 다음과 같습니다.

....X....X
....X....X
....X....X
....X....X

노트

  • "일반 영어 읽기 순서"는 각 행에서 왼쪽에서 오른쪽으로, 위쪽에서 아래쪽으로가는 것을 의미합니다.
  • N이 1이면 모든 .의가됩니다 X.
  • 및 대신에 두 개의 고유 한 인쇄 가능한 ASCII 문자를 사용할 수 있습니다 . .X
    • 공백 ( )을 사용 하면 결과가 시각적으로 동일 할 때 후행 공백이 필요하지 않습니다. (빈 줄이 여전히 필요합니다.)
    • 격자를 형성하는 개행 대신 다른 것을 사용하지 않을 수 있습니다.
  • W, H 및 N의 정확한 입력 형식과 순서는 중요하지 않습니다. 좋아 [H,W,N]하거나 N\nW,H괜찮습니다.
  • 출력에서 후행 줄 바꿈이 좋습니다.
  • 바이트 단위의 가장 짧은 코드가 이깁니다!

W = 5, H = 3, N = 1
XXXXX
XXXXX
XXXXX

W = 5, H = 3, N = 2
.X.X.
X.X.X
.X.X.

W = 5, H = 3, N = 3
..X..
X..X.
.X..X

W = 5, H = 3, N = 4
...X.
..X..
.X...

W = 5, H = 3, N = 5
....X
....X
....X

W = 5, H = 3, N = 6
.....
X....
.X...

W = 5, H = 3, N = 7
.....
.X...
...X.

W = 5, H = 3, N = 15
.....
.....
....X

W = 5, H = 3, N = 16 (or more)
.....
.....
.....

W = 1, H = 1, N = 1
X

W = 1, H = 1, N = 2 (or more)
.

W = 8, H = 6, N = 2
.X.X.X.X
.X.X.X.X
.X.X.X.X
.X.X.X.X
.X.X.X.X
.X.X.X.X

W = 8, H = 6, N = 3
..X..X..
X..X..X.
.X..X..X
..X..X..
X..X..X.
.X..X..X

W = 8, H = 6, N = 4
...X...X
...X...X
...X...X
...X...X
...X...X
...X...X

W = 8, H = 6, N = 7
......X.
.....X..
....X...
...X....
..X.....
.X......

W = 8, H = 6, N = 16
........
.......X
........
.......X
........
.......X

W = 37, H = 1, N = 4
...X...X...X...X...X...X...X...X...X.

W = 1, H = 10, N = 8
.
.
.
.
.
.
.
X
.
.

1
" 그리드를 형성하는 줄 바꿈 대신에 다른 것을 사용 하지 않을 수 있습니다["..X..X.", ".X..X..", "X..X..X"] " "" 배열 을 그리드로 반환 할 수 없습니다 "
피터 테일러

@PeterTaylor 수정
캘빈의 취미

답변:


13

J, 9 5 바이트

$":&1

공백과를 사용 1하고 형식의 입력을 예상합니다.H W f N

설명:

$":&1
   &1 bonds the fixed right argument 1 to ":
 ":   formats the right argument number (1) to take up left argument (N) number of cells
      padding with spaces, resulting  in "  1"
$     reshape to H-by-W with repeating the string if necessary 

용법:

   3 7 ($":&1) 3
  1  1 
 1  1  
1  1  1

여기에서 온라인으로 사용해보십시오.


W * H가 N보다 작 으면 배열을 자르는가?
마틴 엔더

@ MartinBüttner 네.
randomra

인수가 ($":&1)인 경우 7 바이트로 계산되지 않습니까?
Reto Koradi

1
아니요, ()기능의 일부가 아닙니다. 당신은 쓸 수 f =. $":&1다음과 3 7 f 3.
Lynn

11

파이썬 2, 60 바이트

w,h,n=input()
s='%%%dd'%n%0*w*h
exec"print s[:w];s=s[w:];"*h

이 공간과 인쇄 0의 자리에 .X. 입력은의 형태로 튜플로 사용됩니다 w,h,n.


4
영리한 문자열 형식입니다.
xnor

7

J, 12 바이트

$'X'_1}#&'.'

이것은 배열 H W을 왼쪽 인수와 N오른쪽 인수로 사용 하는 2 차원 함수입니다 . 용법:

  f =: $'X'_1}#&'.'
  3 5 f 3
..X..
X..X.
.X..X

설명

$'X'_1}#&'.'
         '.'  The character '.'
       #&     repeated N times
    _1}       with the last character
 'X'          replaced by 'X'
$             reshaped into an HxW array

작업에 적합한 도구 ?
애디슨 크럼프

의 사용은 X.정말 짧은?
lirtosiast

@ThomasKwa 나는 그렇게 믿는다. 대신 숫자 0과 1을 사용하려고했지만 _1괄호로 옆에 하나를 둘러싸고 열 사이의 공백을 포맷해야하고 결국 더 길어졌습니다.
Zgarb

5

BBC Basic, 67 ASCII 문자, 토큰 화 된 파일 크기는 43 바이트

http://www.bbcbasic.co.uk/bbcwin/download.html 에서 통역사 다운로드

INPUTw,h,n:WIDTHw:PRINTLEFT$(STRING$(w*h,STRING$(n-1,".")+"X"),w*h)

BBC 기본에는 필드 너비를 제한하는 편리한 명령이 있습니다. 우리 는 마침표 문자열 다음에 X를 복사 STRING$하는 데 사용 합니다. 그런 다음 LEFT $를 사용하여 문자 를 자릅니다 .w*hn-1w*h


4

Minkolang 0.14 , 34 30 28 22 바이트

n2-D1n$zn[z[1Rd6ZO]lO]

여기에서 한 가지 사례확인하고 모든 테스트 사례를 확인하십시오. 과 같은 입력이 필요 N W H합니다.

설명

n                 Take number from input (N)
 2-               Subtract 2
   D              Duplicate the top of stack (which is 0 because it's empty) N-2 times
    1             Push a 1 onto the stack
n                 Take number from input (W)
 $z               Store W in the register (z)
n                 Take number from input (H)
 [                Open a for loop that repeats H times
  z[              Open a for loop that repeats W times
    1R            Rotate 1 step to the right
      d           Duplicate top of stack
       6Z         Convert number to string
         O        Output as character
          ]       Close for loop
           lO     Output a newline
             ]    Close for loop

Minkolang의 코드 상자는 환상적이므로 처음부터 끝납니다. 모든 사람 n이 이제 들어갈 것이므로 -1결국 오류가 발생하고 더 이상 출력되지 않으므로 오류가 발생합니다.


따라서 비교하기가 쉽습니다. (정확히 동일한 코드는 아닙니다.)
El'endia Starman 11:29

당신보다 앞서! : P :)
El'endia Starman

4

CJam (16 바이트)

{1$*,:)@f%:!/N*}

순서대로 스택에 입력을 받아 N W H, 반환 문자열 문자를 사용 0하고 1. 온라인 데모

해부

{        e# Anonymous function. Stack: N W H
  1$*,   e# Stack: N W [0 1 ... W*H-1]
  :)     e# Stack: N W [1 2 ... W*H]
  @f%    e# Stack: W [1%N 2%N ... W*H%N]
  :!     e# Map Boolean not, taking 0 to 1 and anything else to 0
  /      e# Split into W-sized chunks (i.e. the lines of the grid)
  N*     e# Join the lines with newlines
}

;-; 네가 날 이겼어 ;-; 그러나 좋은 일! : D
anOKsquirrel

4

APL, 13 바이트

{⍪,/⍕¨⍺⍴⍵=⍳⍵}

이것은 H W왼쪽 주장과 N오른쪽 주장으로 간주됩니다.

설명:

{⍪,/⍕¨⍺⍴⍵=⍳⍵}     Dyadic function (args are ⍺ on left, ⍵ on right):
        ⍵=⍳⍵      ⍵ = (1 2 3...⍵); this is ⍵-1 0s followed by a 1
      ⍺⍴          Shape by the left argument; e.g. 5 3 gives a 5x3 array
    ⍕¨            Stringify each entry
  ,/              Join the strings in each row 
 ⍪                Make column vector of strings

온라인으로 시도하십시오 : 첫 번째 테스트 사례 , 마지막 테스트 사례 . 이것은 박스 출력을 보여 주지만 내 Dyalog 사본은 그렇지 않습니다.


그것들은 실제로 박스입니까, 아니면 SE 앱이 문자를 올바르게 표시하지 않습니까?
Carcigenicate

@Carcigenicate 그들은 상자가 아닙니다. 글꼴이 다르기 때문에 온라인 링크에서 문자가 제대로 표시되어야합니다.
lirtosiast

아, 맞아 나는 그것을 놓쳤다. 당신은 특별한 키보드를 가지고 있거나 당신은 마조히스트입니까?
Carcigenicate

@Carcigenicate tryapl (및 Dyalog 학생 판)에서는 백틱을 사용하여 APL 문자를 입력 할 수 있습니다. 예를 들어`a는 ⍺로 바뀝니다.
lirtosiast

2

CJam, 20 바이트

q~:Z;_@*,:){Z%!}%/N*

HW N으로 입력을받습니다.



고정 : D : D : D : D
anOKsquirrel

다른 언어의 일부 솔루션보다 훨씬 길지만 CJam : q~_@*,@(S*'X+f=/N*을 사용하여 NH 바이트 순서 로 18 바이트를 얻었습니다.
Reto Koradi

1
@RetoKoradi로 교체 'X하여 또 하나를 0
빼면

2

MATLAB, 61 55 54 바이트

function c=g(d,n);b=ones(d);b(n:n:end)=0;c=[b'+45,''];

와, MATLAB이 이것에서 경쟁력이 있다고 생각했지만, 내가 틀렸다!

이 함수는 올바른 차원의 1로 구성된 배열을 만든 다음 모든 n 번째 요소를 0으로 설정합니다 (MATLAB은 암시 적으로 인덱스를 2D로 감싸는 것을 처리합니다). 그런 다음이 숫자에 45 ( '-')를 더한 다음 char 배열로 변환하여 반환합니다.

질문은 그리드에 두 개의 ASCII 문자를 사용할 수 있도록 허용합니다 .'x '대신'- '를 사용하여 일부 바이트를 저장합니다. 입력 형식도 고정되어 있지 않으므로 [w h],n너비와 높이의 배열 로 제공 한 다음 n을 두 번째 매개 변수로 제공해야합니다.


이것은 또한 Octave 와 함께 작동하며 여기서 온라인으로 시도 할 수 있습니다 . 이 함수는 이미 연결된 작업 공간에 설정되어 있으므로 다음과 같이 간단히 호출 할 수 있습니다.

g([4,5],3)

어떤 출력 :

..-.
.-..
-..-
..-.
.-..

저장 한 바이트 :c=[b'+45,''];
스튜이 그리핀

@StewieGriffin 감사합니다 :). 어떤 이유로 든 바이트를 저장하지 않았다고 생각했을 때 잘못 계산해야합니다!
톰 카펜터

2

처리, 93 바이트 (자바, 104 바이트)

void f(int a,int b,int c){for(int i=0;i<a*b;i++)print((i%c>c-2?"X":".")+(i%a>a-2?"\n":""));}}

Java 대신 Processing을 사용하는 이유 System.out는 로컬 변수에 직접 액세스 할 수 있기 때문에 팁으로 포인터를 액세스 할 필요가 없기 때문입니다. 이것으로 11 바이트를 벌었습니다. 이 함수는 결과를 반환하지 않지만 인쇄합니다.


2
증분을 이동하여 다른 파일을 저장할 수 있습니다 (예 i++%a...:) }. 필요없는 끝에 여유 공간을 남겨둔 것처럼 보입니다 .
Geobits

2

Japt , 33 32 27 25 바이트

SpW-1 +Q p-~U*V/W f'.pU)·

형식으로 입력을 W H N받습니다. 사용  "대신 .X각각. 온라인으로 사용해보십시오!

언 골프와 설명

SpW-1 +Q p-~U*V/W f'.pU)·qR
          // Implicit: U = width, V = height, W = interval
SpW-1 +Q  // Create a string of W - 1 spaces, plus a quotation mark.
p-~U*V/W  // Repeat this string ceil(U*V/W) times.
f'.pU)    // Split the resulting string into groups of U characters.
qR        // Join with newlines.
          // Implicit: output last expression

제안을 환영합니다!


2

Vitsy , 25 23 22 21 19 바이트

중복이 필요 없으며 2 바이트를 절약 할 수 있음을 지적 한 @ Sp3000에게 감사드립니다!

로 입력을 N W H받습니다. 온라인으로 사용해보십시오!

1}\0XrV\[V\[{DN]aO]
1                         Push 1 to the stack.
 }                        Push the backmost to the front and subtract 2.
  \0X                     Duplicate the 0 temp variable times.
     r                    Reverse the stack.
      V                   Save as final global variable.
       \[         ]       Repeat top item times.
         V\[   ]          Repeat global variable times.
            {DO           Duplicate, output, then shift over an item.
                aO        Output a newline.

1

K, 21 19 18 14 바이트

인수를 (H W;N)다음 과 같이 사용합니다 .

{".X"x#y=1+!y}

실제로 :

  f:{".X"x#y=1+!y};

  f.'((3 5;1);(3 5;2);(3 7;3);(4 10;5);(3 5;16))
(("XXXXX"
  "XXXXX"
  "XXXXX")
 (".X.X."
  "X.X.X"
  ".X.X.")
 ("..X..X."
  ".X..X.."
  "X..X..X")
 ("....X....X"
  "....X....X"
  "....X....X"
  "....X....X")
 ("....."
  "....."
  "....."))


1

R, 66 바이트

function(w,h,n){x=rep(".",a<-w*h);x[1:a%%n<1]="X";matrix(x,h,w,T)}

세 개의 정수를 허용하고 문자 값의 행렬을 반환하는 함수입니다. 호출하려면 변수에 지정하십시오.

언 골프 드 :

f <- function(w, h, n) {
    # Get the area of the square
    a <- w*h

    # Construct a vector of dots
    x <- rep(".", a)

    # Replace every nth entry with X
    x[1:a %% n == 0] <- "X"

    # Return a matrix constructed by row
    matrix(x, nrow = h, ncol = w, byrow = TRUE)
}

1

자바 스크립트 (ES6), 65 60 바이트

(w,h,n)=>eval('for(i=r=``;i++<w*h;i%w?0:r+=`\n`)r+=i%n?0:1')

설명

(w,h,n)=>eval('    // use eval to remove need for return keyword
  for(
    i=             // i = current grid index
      r=``;        // r = result
    i++<w*h;       // iterate for each index of the grid
    i%w?0:r+=`\n`  // if we are at the end of a line, print a newline character
                   // note: we need to escape the newline character inside the template
  )                //       string because this is already inside a string for the eval
    r+=i%n?0:1     // add a 0 for . or 1 for X to the result
                   // implicit: return r
')

테스트


1

수학, 85 바이트

""<>(#<>"
"&/@ReplacePart["."~Table~{t=# #2},List/@Range[#3,t,#3]->"X"]~Partition~#)&

다른 많은 솔루션과 마찬가지로 단일 행을 만든 다음 분할합니다.


1

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

(w,h,n)=>(f=i=>i++<w*h?+!(i%n)+(i%w?"":`
`)+f(i):"")(0)

반복문을 저장하기 위해 IIFE f 를 사용하여 루프합니다.

w = 5, h = 3, n = 7에 대한 출력 :

00000
01000
00010

1

C #, 185 바이트

using System;class x{void a(int w,int h,int n){int c=1;for(int i=0;i<h;i++){for(int j=1;j<=w;j++){if(c%n==0){Console.Write("x");}else{Console.Write(".");}c++;}Console.WriteLine();}}}

더 읽기 쉬운 읽기 :

using System;
class x
{
  void a(int w, int h, int n)
  {
    int c = 1;
    for (int i = 0; i < h; i++)
    {
        for (int j = 1; j <= w; j++)
        {
            if (c % n == 0)
            {
                Console.Write("x");
            }
            else
            {
                Console.Write(".");
            }
            c++;
        }
        Console.WriteLine();
     }
  }
}

용법:

new x().a(7, 3, 3);

0

줄리아, 50 바이트

f(w,h,n)=reshape([i%n<1?"X":"." for i=1:w*h],w,h)'

f3 개의 정수를 받아들이고 2 차원 문자열 배열을 반환 하는 함수 를 만듭니다 .

언 골프 드 :

function f(w::Integer, h::Integer, n::Integer)
    # Construct an array of strings in reading order
    a = [i % n == 0 ? "X" : "." for i = 1:w*h]

    # Reshape this columnwise into a w×h array
    r = reshape(a, w, h)

    # Return the transpose
    return transpose(r)
end

0

루비, 67 56 바이트

->w,h,n{(1..h).map{(1..w).map{o,$.=$.%n<1?1:0,$.+=1;o}}}

배열이 승인되었으므로 인쇄합니다.

67 바이트

->w,h,n{i=1;puts (1..h).map{(1..w).map{o,i=i%n<1?1:0,i+=1;o}.join}}

언 골프 드 :

-> w, h, n {
  (1..h).map {
    (1..w).map {
      o, $. = $.%n < 1 ? 1 : 0, $.+ = 1
      o
    }
  }
}

용법:

->w,h,n{(1..h).map{(1..w).map{o,$.=$.%n<1?1:0,$.+=1;o}}}[8,6,7]
=> [[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]]

0

MATLAB, 44 바이트

참고 : Tom Carpenter가 사용하는 것과는 매우 다른 접근 방식입니다.

@(x,y)char(reshape(~mod(1:prod(x),y),x)'+46)

입력을로받는 익명 함수를 정의합니다 [W,H],N. N 이 아닌 모듈로를 사용 하여이 문제에 접근했습니다.배열 1 : W * H에 대해 을 한 다음 간단히 솔루션을 2 차원 배열로 재구성 한 다음 문자 배열로 변환합니다.

의 출력 예 [5,3],7:

.....
./...
.../.

0

공통 Lisp, SBCL, 94 바이트

(lambda(a b c)(dotimes(i(* a b))(format t"~:[.~;X~]~@[~%~]"(=(mod(1+ i)c)0)(=(mod(1+ i)a)0))))

설명

~:[.~;X~] <-- takes argument - if argument is true write ., if false write X
~@[~%~] <-- takes argument - if argument is true write newline, if not treat argument as if it was not used

(=(mod(1+ i)c)0)(=(mod(1+ i)a)0) 꽤 어리석은 것처럼 보이기 때문에 해결할 수 있는지 모르겠지만 바이트를 절약 할 수 있습니다.

에서 시작 하기 때문에 (1+ i)대신 사용 하고에서 시작하고 싶습니다 . 대신 사용할 수 있기 때문에 도움 이됩니다.idotimesi=01(* a b)(1+(* a b))


-1

자바, 185 183 바이트

2 바이트를 절약 해 준 Thomas Kwa에게 감사합니다!

interface B{static void main(String[] a){int w = Byte.parseByte(a[0]);for(int i=0;i++<w*Byte.parseByte(a[1]);)System.out.print((i%Byte.parseByte(a[2])>0?".":"X")+(i%w<1?"\n":""));}}

언 골프 (ish) :

interface A {
  static void main(String[] a) {
    int w = Byte.parseByte(a[0]);
    for(
      int i = 0;
      i++ < w*Byte.parseByte(a[1]);
    )
      System.out.print((
        i%Byte.parseByte(a[2]) > 0 ? "." : "X"
        )+(
        i%w < 1 ? "\n" : ""
      ));
  }
}

용법:

$ java B 5 3 7
.....
.X...
...X.

아마 java는 언젠가 이길 것입니다 : P


>0대신 !=0<1대신 사용할 수 있다고 생각합니다 ==0.
lirtosiast
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.