非常简单的网格标记


29

编写一个包含三个正整数W,H和N的程序或函数。打印或返回W的H×H网格,.其中.正常英语阅读顺序中的每N个N均被替换为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正确
卡尔文的爱好

Answers:


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 2015年

1
不,()不是函数的一部分;你可以写f =. $":&1然后3 7 f 3
林恩

11

Python 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右参数。用法:

  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,2015年

@ThomasKwa我相信。我尝试使用数字0和1代替,但是后来我不得不_1用括号将数字包围起来,并格式化列之间的空格,结果变得更长了。
Zgarb 2015年

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 basic具有方便的命令来限制字段宽度。我们STRING$用来w*h复制n-1后跟一个X 的句点字符串。然后我们使用LEFT $将其截断为w*h字符。


4

Minkolang 0.1434个 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 2015年

在你前面!:P :)
El'endia Starman 2015年

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,2015年

@Carcigenicate他们不是盒子。字符应该在联机链接上显示正常,因为它具有不同的字体。
lirtosiast

啊,对。我错过了。您有特殊的键盘还是受虐狂?
Carcigenicate,2015年

@Carcigenicate在tryapl(和Dyalog学生版)上,您可以使用反引号键入APL字符。例如,`a变成⍺。
lirtosiast,2015年

2

CJam,20字节

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

将输入作为HWN。


哎呀

固定:D:D:D:D
ansquisrel 2015年

:仍比一些其他语言的解决方案更长的时间,但我把它与CJam得到了18个字节q~_@*,@(S*'X+f=/N*,以NH W.,与输入
雷托Koradi

1
@RetoKoradi再举一个关闭的替换'X0,这将是17
SP3000

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,''];
Stewie Griffin

@StewieGriffin谢谢:)。出于某种原因,当我尝试不认为它节省了任何字节时,我肯定算错了!
汤姆·卡彭特

2

处理,93字节(Java,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":""));}}

我使用Processing而不是Java的原因是您不需要通过提示System.out访问指针,因为可以直接访问局部变量。我为此赚了11个字节。该函数不返回结果,而是打印结果。


2
您可以通过移动增量(例如i++%a...)来保存另一个,看起来您}在不需要的末尾也留下了一个备用。
Geobits,2015年

2

Japt33 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

Vitsy25 23 22 21 19字节

感谢@ Sp3000指出我不需要重复并为我节省了2个字节!

将输入作为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

JavaScript(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

Mathematica,85个字节

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

与许多其他解决方案一样,这将创建一行,然后对其进行分区。


1

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

这创建了一个功能 f接受三个整数并返回二维字符串数组的。

取消高尔夫:

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字节

->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。我对数组1:W * H 使用N的非模数方法解决了这个问题,然后将解决方案重塑为二维数组,然后将其转换为字符数组。

输出示例[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)而不是i因为dotimes从开始i=0,但我想从开始1。这也很有帮助,因为我可以(* a b)代替(1+(* a b))


-1

Java中,185个 183字节

感谢Thomas Kwa,为我节省了2个字节!

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 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.