Dấu lưới rất đơn giản


29

Viết chương trình hoặc hàm có ba số nguyên dương là W, H và N. In hoặc trả về lưới W × H trong .đó mỗi Nth .theo thứ tự đọc tiếng Anh thông thường được thay thế bằng một X.

Ví dụ: với W = 7, H = 3, N = 3, lưới rộng 7 ký tự và cao 3 và mỗi ký tự thứ ba đọc từ trên cùng bên trái là X:

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

Tương tự, nếu đầu vào là W = 10, H = 4, N = 5, đầu ra sẽ là:

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

Ghi chú

  • "Thứ tự đọc tiếng Anh thông thường" có nghĩa là đi từ trái sang phải trên mỗi dòng, từ dòng trên cùng đến dưới cùng.
  • Khi N là 1 thì tất cả .sẽ trở thành X.
  • Bạn có thể sử dụng bất kỳ hai ký tự ASCII có thể in riêng biệt thay cho .X.
    • Nếu bạn sử dụng dấu cách ( ) thì dấu cách sẽ không bắt buộc khi kết quả sẽ giống nhau. (Các dòng trống vẫn được yêu cầu.)
    • Bạn không thể sử dụng cái gì khác thay cho dòng mới định hình lưới.
  • Định dạng và thứ tự chính xác của W, H và N không quan trọng lắm. Những điều như [H,W,N]hoặc N\nW,Hlà ổn.
  • Một dòng mới ở đầu ra là tốt.
  • Mã ngắn nhất tính bằng byte thắng!

Ví dụ

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
Tôi có đúng không khi cho rằng hạn chế " Bạn không thể sử dụng cái gì khác thay cho dòng mới định hình lưới " bao gồm " Bạn không thể trả về một mảng ["..X..X.", ".X..X..", "X..X..X"]dưới dạng lưới "?
Peter Taylor

@PeterTaylor Đúng
Sở thích của Calvin

Câu trả lời:


13

J, 9 5 byte

$":&1

Sử dụng khoảng trắng và 1của và mong đợi đầu vào trong biểu mẫuH W f N

Giải trình:

$":&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 

Sử dụng:

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

Hãy thử trực tuyến tại đây.


Nó cũng cắt bớt mảng nếu W * H nhỏ hơn N?
Martin Ender

@ MartinBüttner Có.
ngẫu nhiên

Nếu đối số là ($":&1), nó sẽ không được tính là 7 byte?
Reto Koradi

1
Không, ()không phải là một phần của chức năng; bạn có thể viết f =. $":&1và sau đó 3 7 f 3.
Lynn

11

Python 2, 60 byte

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

Điều này in không gian và 0ở vị trí .X. Đầu vào được lấy dưới dạng một tuple ở dạng w,h,n.


4
Đó là một định dạng chuỗi thông minh.
xnor

7

J, 12 byte

$'X'_1}#&'.'

Đây là một hàm dyadic lấy mảng H Wlàm đối số bên trái và Nlàm đối số bên phải của nó. Sử dụng:

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

Giải trình

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

Công cụ phù hợp cho công việc ?
Addison Crump

Là việc sử dụng X.thực sự ngắn nhất?
lirtosiast

@ThomasKwa Tôi tin là như vậy. Tôi đã cố gắng sử dụng các số 0 và 1 thay vào đó, nhưng sau đó tôi phải bao quanh số bên cạnh _1bằng dấu ngoặc đơn và định dạng khoảng cách giữa các cột và kết thúc là dài hơn.
Zgarb

5

BBC Basic, 67 ký tự ASCII, tệp được mã hóa 43 byte

Tải xuống thông dịch viên tại http://www.bbcbasic.co.uk/bbcwin/doad.html

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

BBC basic có một lệnh tiện dụng để giới hạn độ rộng trường. Chúng tôi sử dụng STRING$để tạo các w*hbản sao của chuỗi các n-1dấu chấm theo sau là X. Sau đó, chúng tôi sử dụng LEFT $ để cắt bớt phần này thành các w*hký tự.


4

Chồn 0,14 , 34 30 28 22 byte

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

Kiểm tra một trường hợp ở đâykiểm tra tất cả các trường hợp thử nghiệm ở đây. Mong đợi đầu vào như thế nào N W H.

Giải trình

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

Vì codebox của Minkolang là hình xuyến, điều này sẽ bao bọc từ đầu. Như mọi thứ nbây giờ sẽ đưa vào -1, điều này cuối cùng gặp sự cố và không có đầu ra nữa, được cho phép.


Vì vậy, thật dễ dàng để bạn so sánh. (Lưu ý rằng nó không hoàn toàn giống mã.)
El'endia Starman

Trước mắt bạn! : P :)
El'endia Starman

4

CJam (16 byte)

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

Lấy đầu vào trên ngăn xếp theo thứ tự N W H, trả về chuỗi bằng các ký tự 01. Bản demo trực tuyến

Mổ xẻ

{        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
}

; -; bạn đánh tôi; -; nhưng công việc tốt : D
anOKsquirrel

4

APL, 13 byte

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

Điều này nhận H Wlàm đối số bên trái và Nđối số bên phải.

Giải trình:

{⍪,/⍕¨⍺⍴⍵=⍳⍵}     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

Dùng thử trực tuyến: trường hợp thử nghiệm đầu tiên , trường hợp thử nghiệm cuối cùng . Lưu ý rằng mặc dù điều này cho thấy đầu ra đóng hộp, bản sao Dyalog của tôi không có.


Là những cái thực sự chỉ là hộp, hoặc ứng dụng SE không hiển thị đúng các ký tự?
Carcigenicate

@Carcigenicate Chúng không phải là hộp. Các ký tự sẽ hiển thị tốt trên liên kết trực tuyến, bởi vì nó có một phông chữ khác nhau.
lirtosiast

À, phải rồi. Tôi bỏ lỡ điều đó. Bạn có một bàn phím đặc biệt hoặc bạn là một masochist?
Carcigenicate

@Carcigenicate Trên tryapl (và phiên bản sinh viên Dyalog), bạn có thể nhập các ký tự APL bằng cách sử dụng backticks. `biến thành ⍺ chẳng hạn.
lirtosiast

2

CJam, 20 byte

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

Có đầu vào là HW N.


Rất tiếc, không hợp lệ
anOKsquirrel

đã sửa: D: D: D: D
anOKsquirrel

Vẫn dài hơn nhiều so với một số giải pháp trong các ngôn ngữ khác, nhưng tôi đã nhận được tới 18 byte với CJam : q~_@*,@(S*'X+f=/N*, với đầu vào theo thứ tự NH W.
Reto Koradi

1
@RetoKoradi Hãy lấy một cái khác bằng cách thay thế 'Xbằng 0, và đó sẽ là 17
Sp3000

2

MATLAB, 61 55 54 byte

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

Ồ, tôi nghĩ MATLAB sẽ cạnh tranh trong phần này, nhưng tôi đã sai như thế nào!

Hàm tạo một mảng có kích thước chính xác là 1 và sau đó đặt mọi phần tử thứ n thành 0 (MATLAB xử lý ngầm bao quanh các chỉ số thành 2D). Sau đó, chúng tôi thêm vào 45 ('-') vào số này và chuyển đổi thành một mảng char sẽ được trả về.

Các câu hỏi cho phép sử dụng bất kỳ hai ký tự ASCII riêng biệt nào cho lưới, tôi đang sử dụng '-' thay cho 'x' để lưu một số byte. Định dạng đầu vào cũng không cố định, do đó nó phải được cung cấp dưới dạng [w h],n- tức là một mảng có chiều rộng và chiều cao, và sau đó n là tham số thứ hai.


Điều này cũng hoạt động với Octave và có thể được thử trực tuyến tại đây . Hàm đã được thiết lập trong không gian làm việc được liên kết, vì vậy bạn chỉ cần gọi ví dụ:

g([4,5],3)

Đầu ra nào:

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

Lưu một byte:c=[b'+45,''];
Stewie Griffin

@StewieGriffin Cảm ơn :). Vì một số lý do khi tôi đã thử mà tôi không nghĩ rằng nó đã lưu bất kỳ byte nào, tôi chắc chắn đã bị nhầm lẫn!
Tom Carpenter

2

Đang xử lý, 93 byte (Java, 104 byte)

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":""));}}

Lý do tôi đã sử dụng Xử lý thay vì Java là vì bạn không cần phải truy cập con trỏ bằng cách tip System.outvì một biến cục bộ có thể truy cập trực tiếp. Tôi đã kiếm được 11 byte với điều này. Hàm không trả về kết quả nhưng in ra.


2
Bạn có thể lưu cái khác bằng cách di chuyển số gia (như i++%a...) và có vẻ như bạn cũng để lại một khoản dự phòng }vào cuối mà bạn không cần.
Geobits 7/12/2015

2

Japt , 33 32 27 25 byte

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

Đưa đầu vào ở định dạng W H N. Sử dụng  " thay thế .X, tương ứng. Hãy thử trực tuyến!

Ung dung và giải thích

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

Gợi ý chào mừng!


2

Vitsy , 25 23 22 21 19 byte

Cảm ơn @ Sp3000 vì đã chỉ ra rằng tôi không cần một bản sao và tiết kiệm cho tôi 2 byte!

Đưa đầu vào là N W H. Hãy thử trực tuyến!

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 byte

Đưa ra các đối số như (H W;N):

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

Trong hành động:

  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 byte

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

Đây là một hàm chấp nhận ba số nguyên và trả về một ma trận các giá trị ký tự. Để gọi nó, gán nó cho một biến.

Ung dung:

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

JavaScript (ES6), 65 60 byte

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

Giải trình

(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
')

Kiểm tra


1

Toán học, 85 byte

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

Cũng như nhiều giải pháp khác, điều này tạo ra một hàng duy nhất, sau đó phân vùng nó.


1

JavaScript (ES6), 55 byte

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

Sử dụng IIFE f để lặp để lưu câu lệnh return.

Đầu ra cho w = 5, h = 3, n = 7:

00000
01000
00010

1

C #, 185 byte

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

Để đọc dễ đọc hơn:

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

Sử dụng:

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

0

Julia, 50 byte

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

Điều này tạo ra một hàm fchấp nhận ba số nguyên và trả về một chuỗi 2 chiều.

Ung dung:

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

Ruby, 67 56 byte

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

In một mảng kể từ khi nó được chấp nhận.

67 byte

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

Ung dung:

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

Sử dụng:

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

Lưu ý: Cách tiếp cận rất khác so với cách tiếp cận được sử dụng bởi Tom Carpenter.

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

Xác định một hàm ẩn danh chấp nhận đầu vào là [W,H],N. Tôi đã tiếp cận vấn đề này bằng cách sử dụng not-the-modulo-of- N cho mảng 1: W * H và sau đó chỉ cần định hình lại giải pháp thành mảng hai chiều, sau đó được chuyển đổi thành mảng ký tự.

Ví dụ đầu ra cho [5,3],7:

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

0

Lisp thường gặp, SBCL, 94 byte

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

Giải trình

~:[.~;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) Trông khá ngớ ngẩn (vì nó rất giống nhưng tôi không biết liệu nó có thể được giải quyết hay không, tiết kiệm byte

Tôi sử dụng (1+ i)thay ivì bởi vì dotimesbắt đầu từ i=0và tôi muốn bắt đầu từ 1. Nó cũng hữu ích vì tôi có thể sử dụng (* a b)thay vì(1+(* a b))


-1

Java, 185 183 byte

Cảm ơn Thomas Kwa, vì đã tiết kiệm cho tôi 2 byte!

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":""));}}

Ungolfed (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" : ""
      ));
  }
}

Sử dụng:

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

Có lẽ java sẽ thắng một ngày: P


Tôi nghĩ bạn có thể sử dụng >0thay vì !=0, và <1thay vì ==0.
lirtosiast
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.