以一个正整数n作为输入,并输出一个由1和0组成的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
输入和输出格式是可选的。接受将矩阵输出为列表列表。
以一个正整数n作为输入,并输出一个由1和0组成的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
输入和输出格式是可选的。接受将矩阵输出为列表列表。
Answers:
:otYT
以输入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]
ÆÇ+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
而不是没有给出的情况。
感谢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.repeat
是cycle
:n!l=take n$cycle l
。如果您没有意义,它将再节省一个字节:(!)=(.cycle).take
。
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"]
。
NoMonomorphismRestriction
没有帮助。也没有Rank2Types
或RankNTypes
。你知道那里发生了什么吗?
~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(向量化),然后~
取结果的非。
@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))
: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~
Y
使用@LuisMendo使用的那些讨厌的修改指令。
^₂⟦₁%₂ᵐ;?ḍ₎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]]
-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
。
-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。:)
ToeplitzMatrix@#~Mod~2&
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成功。感谢@Kevin Cruijssen保存了两个字节,而@ceilingcat保存了四个字节!
i,j;f(n){for(i=n;i--;puts(""))for(j=n;j;)printf("%d",j--+i&1);}
printf("%d "
,因为这是另一种有效的输出方法。
(j+++i)%2
来j+++i&1
删除这些括号。
[:|?[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.
/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)
1
s为单位的一元输入,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)
V
和D
分别去打高尔夫\/
和//
。
/*/k#/
并将/&1/k#&//&|//
输入分离为'k#'*len(input())
/#k//k#//&k/k&//\/k/k\//
将所有k
s移至/r/S/
块
S
s仅用于填充k
s 在s之后/
的实例,以便它们不会移到其他位置,然后将S
s删除
#
s然后变成r\n
s
k
s 的字符串变成交替的1010...
字符串
该r\n
s的变成了1010...\n
小号
每对1010...\n1010\n
变成1010...\01010...;\n
任一0;
或1;
被修剪掉(因为01010...
字符串太长通过1)