创建一个棋盘格矩阵


26

以一个正整数n作为输入,并输出一个由10组成的n × n棋盘矩阵。

左上角的数字应始终为1

测试用例:

n = 1
1

n = 2
1 0
0 1

n = 3
1 0 1
0 1 0
1 0 1

n = 4
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1

输入和输出格式是可选的。接受将矩阵输出为列表列表。


字符串列表可以吗?
xnor

是的,没关系。
Stewie Griffin


2
您的示例显示了同一行数字之间的空格,这是必需的,以便看起来更像正方形吗?
BradC

@BradC这不是必需的。这里的第一种方法是有效的。
Stewie Griffin

Answers:



9

MATL,5个字节

:otYT

在线尝试在MATL!

说明

以输入4为例。

:    % Implicit input, n. Push range [1 2 ... n]
     %   STACK: [1 2 3 4]
o    % Parity, element-wise
     %   STACK: [1 0 1 0]
t    % Duplicate
     %   STACK: [1 0 1 0], [1 0 1 0]
YT   % Toeplitz matrix with two inputs. Implicit display
     %   STACK: [1 0 1 0;
     %           0 1 0 1;
     %           1 0 1 0;
     5           0 1 0 1]

7

Japt,6个字节

ÆÇ+X v

在线测试!(使用-Q标志可以更容易地看到)

说明

 Æ   Ç   +X v
UoX{UoZ{Z+X v}}  // Ungolfed
                 // Implicit: U = input number
UoX{          }  // Create the range [0...U), and map each item X to
    UoZ{     }   //   create the range [0...U), and map each item Z to
        Z+X      //     Z + X
            v    //     is divisible by 2.
                 // Implicit: output result of last expression

需要注意的有趣一点是,v不是内置的“可被2整除”的函数。而是内置了“可被X整除”的功能。但是,与大多数高尔夫语言不同,Japt的功能没有固定的通用性(它们可以接受任意数量的右参数)。当给定0个右参数时,v假定您需要2,因此其行为与给定的一样,2而不是没有给出的情况。



7

Haskell50 41 39 38字节

感谢nimi和xnor帮助削减了9个10字节

f n=r[r"10",r"01"]where r=take n.cycle

或者,再增加一个字节:

(!)=(.cycle).take
f n=n![n!"10",n!"01"]

要么:

r=flip take.cycle
f n=r[r"10"n,r"01"n]n

可能不是最佳选择,但是干净,直接的方法。


concat.repeatcyclen!l=take n$cycle l。如果您没有意义,它将再节省一个字节:(!)=(.cycle).take
nimi 2015年

可爱!我知道有一个内置功能,但不记得我的名字
朱利安·沃尔夫

我打算提出f n|r<-take n.cycle=r[r"10",r"01"]类似建议。但是Haskell似乎推断出错误的类型r?它适用于显式键入f n|r<-take n.cycle::[a]->[a]=r[r"10",r"01"]
xnor

1
@JulianWolf Haskell似乎难以推断多态类型
xnor

1
@zbw我以为是这种情况,但是使用NoMonomorphismRestriction没有帮助。也没有Rank2TypesRankNTypes。你知道那里发生了什么吗?
xnor

5

APL(Dyalog),8字节

~2|⍳∘.+⍳

在线尝试!

说明

让我们称之为参数n

⍳∘.+⍳

这将创建一个矩阵

1+1 1+2 1+2 .. 1+n
2+1 2+2 2+3 .. 2+n
...
n+1 n+2 n+3 .. n+n

然后2|取矩阵的模2(向量化),然后~取结果的非。



4

的JavaScript ES6,55 54 51 46字节

@Neil节省了1个字节

@Arnauld节省了2个字节

n=>[...Array(n)].map((_,i,a)=>a.map(_=>++i&1))

在线尝试!

这输出为数组的数组。JavaScript范围非常笨拙,但我使用[...Array(n)]它会生成一个大小数组n


使用索引参数还短了一个字节:n=>[...Array(n)].map((_,i,a)=>a.map((_,j)=>(i+j+1)%2))
尼尔(Neil)

@Neil呵呵,我从没想过要在map中使用第三个参数,谢谢!
Downgoat

@Arnauld谢谢!启发了我再节省5个字节!
Downgoat

4

视网膜33 30字节

.+
$*
1
$_¶
11
10
T`10`01`¶.+¶

在线尝试!说明:第一级使用1s(方便地!)将输入转换为一元,而第二级将值转换为平方。第三级反转每行的交替位,而最后一级反转交替的行。编辑:由于@MartinEnder,节省了3个字节。


$`1$'就是$_
Martin Ender

@MartinEnder啊,我不熟悉$_,谢谢!
尼尔

3

MATL,7个字节

:t!+2\~

在线尝试!

说明:

         % Implicit input (n)
:        % Range from 1-n, [1,2,3]
 t       % Duplicate, [1,2,3], [1,2,3]
  !      % Transpose, [1,2,3], [1;2;3]
   +     % Add        [2,3,4; 3,4,5; 4,5,6]
    2    % Push 2     [2,3,4; 3,4,5; 4,5,6], 2
     \   % Modulus    [0,1,0; 1,0,1; 0,1,0]
      ~  % Negate     [1,0,1; 0,1,0; 1,0,1]

注意:发布挑战后,我开始在MATL中解决此问题。


同等:&+o~
且更

1
还在学习:-)我明天再更新。我也喜欢您的其他方法:-)
Stewie Griffin

1
这也是我想出的。嘿,您只使用 MATL指令集,而不Y使用@LuisMendo使用的那些讨厌的修改指令。
Sanchises

@Sanchises Pesky,吗?:-P
Luis Mendo

3

Brachylog,15个字节

^₂⟦₁%₂ᵐ;?ḍ₎pᵐ.\

在线尝试!

说明

Example Input: 4

^₂               Square:                            16
  ⟦₁             1-indexed Range:                   [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
    %₂ᵐ          Map Mod 2:                         [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]
       ;?ḍ₎      Input-Chotomize:                   [[1,0,1,0],[0,1,0,1],[1,0,1,0],[0,1,0,1]]
           pᵐ.   Map permute such that..
             .\  ..the output is its own transpose: [[1,0,1,0],[0,1,0,1],[1,0,1,0],[0,1,0,1]]

3

Clojure,36个字节

#(take %(partition % 1(cycle[1 0])))

是的,正确的工作工具。


3

05AB1E9 7字节

-2字节归功于Emigna

LDÈD_‚è

在线尝试!

说明

LDÈD_‚sè» Argument n
LD        Push list [1 .. n], duplicate
  ÈD      Map is_uneven, duplicate
    _     Negate boolean (0 -> 1, 1 -> 0)
     ‚    List of top two elements of stack
      è   For each i in [1 .. n], get element at i in above created list
          In 05AB1E the element at index 2 in [0, 1] is 0 again

您可以剪切,»因为list-of-lists输出是可以的,也可以删除s
Emigna

@Emigna Yep,谢谢!
kalsowerus

解释有点无关紧要。
暴民埃里克(Erik the Outgolfer)

3

Java(OpenJDK 8)80 77字节

-3个字节,感谢Kevin Cruijssen

j->{String s="1";for(int i=1;i<j*j;s+=i++/j+i%j&1)s+=1>i%j?"\n":"";return s;}

在线尝试!

哦,看,一个半合理长度的Java答案,里面有很多有趣的运算符。

接受一个int并返回一个String的lambda。通过使用行号和列号并使用/和%来确定它应该是哪个值,mod 2;

取消高尔夫:

j->{
    String s="1";
    for(int i=1; i<j*j; s+= i++/j + i%j&1 )
        s+= 1>i%j ? "\n" : "";
    return s;
}

您可以删除空间以保存一个字节。挑战表明输出格式很灵活。哦,您可以通过更改(i++/j+i%j)%2为来多保存两个字节,i++/j+i%j&1这样就不需要那些括号了。这使总字节数比我的嵌套for循环解决方案(n->{String r="";for(int i=0,j;i++<n;r+="\n")for(j=0;j<n;r+=j+++i&1);return r;})短1个字节,因此对我而言为+1。:)
Kevin Cruijssen

@KevinCruijssen是的,我仍在等待空间响应。我没想到&具有比%和&1 ==%2更高的优先级
PunPun1000

2

木炭,8个字节

UON10¶01

在线尝试!说明:这大致翻译为以下冗长的代码(不幸的是,deverbosifier当前正在附加不必要的分隔符):

Oblong(InputNumber(), "10\n01");





2

R38 37字节

n=scan();(matrix(1:n,n,n,T)+1:n-1)%%2

在线尝试!

-1个字节,感谢Giuseppe

利用R的回收规则,首先是在创建矩阵时,其次是在该矩阵上添加0:(n-1)。


您可以删除并删除一个字节t,而可以使用构造矩阵byrow=T,即(matrix(1:n,n,n,T)+1:n-1)%%2
Giuseppe

1
outer(1:n,1:n-1,"+")%%2短了几个字节:)
JAD

2

Swi-Prolog,142个字节。

t(0,1).
t(1,0).
r([],_).
r([H|T],H):-t(H,I),r(T,I).
f([],_,_).
f([H|T],N,B):-length(H,N),r(H,B),t(B,D),f(T,N,D).
c(N,C):-length(C,N),f(C,N,1).

在线尝试-http: //swish.swi-prolog.org/p/BuabBPrw.pl

它输出一个嵌套列表,所以规则说:

  • t() 是一个切换,它使0-> 1和1-> 0。
  • r() 对于单个行成功执行,这是对行进行递归检查,确定行仅是交替的零。
  • f()递归检查所有行,它们的长度正确,是否是有效行,r()并且每行以不同的0/1开头。
  • c(N,C) 说如果行(嵌套列表)的数量为N,则C是大小为N的有效棋盘,并且帮助程序f成功。

测试用例: 在此处输入图片说明


2

C,69 67 63字节

感谢@Kevin Cruijssen保存了两个字节,而@ceilingcat保存了四个字节!

i,j;f(n){for(i=n;i--;puts(""))for(j=n;j;)printf("%d",j--+i&1);}

在线尝试!


您可以删除中的空格printf("%d ",因为这是另一种有效的输出方法。
Conor O'Brien

@ ConorO'Brien是的,谢谢。
Steadybox

您可以通过更改保存两个字节(j+++i)%2j+++i&1删除这些括号。
Kevin Cruijssen

@ceilingcat谢谢!
Steadybox

1

QBIC,19个字节

[:|?[b|?(a+c+1)%2';

说明

[:|         FOR a = 1 to b (b is read from cmd line)
?           PRINT - linsert a linebreak in the output
[b|         FOR c = 1 to b
?(a+c+1)%2  PRINT a=c=1 modulo 2 (giving us the 1's and 0's
';            PRINT is followed b a literal semi-colon, suppressing newlines and 
              tabs. Printing numbers in QBasic adds one space automatically.






1

///,87字节+输入

/V/\\\///D/VV//*/k#D#k/k#D&k/k&DVk/k\D/SD/#/r
DSkk/10DSk/1D&/V#rV#0r;VV0;VVV1;V\D/r/S/&[unary input in asterisks]

在线尝试!(输入4)

1s为单位的一元输入,95字节+输入

/V/\\\///D/VV//&1/k#&D&|D/#k/k#D&k/k&DVk/k\D/SD/#/r
DSkk/10DSk/1D&/V#rV#0r;VV0;VVV1;V\D/r/S/&&[unary input in ones]|

在线尝试!(输入8)

这是如何运作的?

  • VD分别去打高尔夫\///

  • /*/k#/并将/&1/k#&//&|//输入分离为'k#'*len(input())

  • /#k//k#//&k/k&//\/k/k\//将所有ks移至/r/S/

  • Ss仅用于填充ks 在s之后/的实例,以便它们不会移到其他位置,然后将Ss删除

  • #s然后变成r\ns

  • ks 的字符串变成交替的1010...字符串

  • r\ns的变成了1010...\n小号

  • 每对1010...\n1010\n变成1010...\01010...;\n

  • 任一0;1;被修剪掉(因为01010...字符串太长通过1)


1

Mathematica,28个字节

Cos[+##/2Pi]^2&~Array~{#,#}&

接受正整数作为输入并返回2D数组的纯函数。使用周期函数cos²(πx/ 2)生成1和0。

为了获得更多乐趣,32字节解决方案如何

Sign@Zeta[1-+##]^2&~Array~{#,#}&

它使用黎曼zeta函数的平凡零点的位置。

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.