fbr*_*eto 26 language-agnostic code-golf rosetta-stone
采用单个输入整数N(N> = 3)的字符数最短的代码,并返回索引数组,迭代时将根据JPEG"zigzag"扫描模式遍历Nx N矩阵.以下是遍历8x8矩阵src的示例遍历:
![]()
(中间矩阵不是输入或输出的一部分,只是输入表示的NxN矩阵的表示.)
1 2 3
(Input) 3 --> 4 5 6 --> 1 2 4 7 5 3 6 8 9 (Output)
7 8 9
1 2 3 4
(Input) 4 --> 5 6 7 8 --> 1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16 (Output)
9 10 11 12
13 14 15 16
Run Code Online (Sandbox Code Playgroud)
扩展您的答案以获取两个输入N并且M(N,M> = 3)并在Nx M矩阵上执行相同的扫描.(在这种情况下,N将是列M数和行数.)
1 2 3 4
(Input) 4 3 --> 5 6 7 8 --> 1 2 5 9 6 3 4 7 10 11 8 12 (Output)
9 10 11 12
1 2 3
(Input) 3 4 --> 4 5 6 --> 1 2 4 7 5 3 6 8 10 11 9 12 (Output)
7 8 9
10 11 12
Run Code Online (Sandbox Code Playgroud)
Dav*_*vid 16
;<@|.`</.i.2$
Run Code Online (Sandbox Code Playgroud)
用法:
;<@|.`</.i.2$ 3
0 1 3 6 4 2 5 7 8
;<@|.`</.i.2$ 4
0 1 4 8 5 2 3 6 9 12 13 10 7 11 14 15
Run Code Online (Sandbox Code Playgroud)
(NB.是J的评论指标)
; NB. Link together...
<@|.`< NB. ... 'take the reverse of' and 'take normally'
/. NB. ... applied to alternating diagonals of...
i. NB. ... successive integers starting at 0 and counting up to fill an array with dimensions of...
2$ NB. ... the input extended cyclically to a list of length two.
Run Code Online (Sandbox Code Playgroud)
;<@|.`</.i.|.
Run Code Online (Sandbox Code Playgroud)
用法:
;<@|.`</.i.|. 3 4
0 1 3 6 4 2 5 7 9 10 8 11
;<@|.`</.i.|. 9 6
0 1 9 18 10 2 3 11 19 27 36 28 20 12 4 5 13 21 29 37 45 46 38 30 22 14 6 7 15 23 31 39 47 48 40 32 24 16 8 17 25 33 41 49 50 42 34 26 35 43 51 52 44 53
Run Code Online (Sandbox Code Playgroud)
dou*_*lep 11
N=input()
for a in sorted((p%N+p/N,(p%N,p/N)[(p%N-p/N)%2],p)for p in range(N*N)):print a[2],
Run Code Online (Sandbox Code Playgroud)
测试:
$ echo 3 | python ./code-golf.py
0 1 3 6 4 2 5 7 8
$ echo 4 | python ./code-golf.py
0 1 4 8 5 2 3 6 9 12 13 10 7 11 14 15
Run Code Online (Sandbox Code Playgroud)
这个解决方案很容易推广到Nx M板:调整输入处理并替换N*N为N*M:
N,M=map(int,raw_input().split())
for a in sorted((p%N+p/N,(p%N,p/N)[(p%N-p/N)%2],p)for p in range(N*M)):print a[2],
Run Code Online (Sandbox Code Playgroud)
我怀疑有两种简单/更短的方式可以读取两个数字.
测试:
$ echo 4 3 | python ./code-golf.py
0 1 4 8 5 2 3 6 9 10 7 11
Run Code Online (Sandbox Code Playgroud)
n=gets.to_i
puts (0...n*n).sort_by{|p|[t=p%n+p/n,[p%n,p/n][t%2]]}*' '
Run Code Online (Sandbox Code Playgroud)
n=gets.to_i
puts (0...n*n).map{|p|[t=p%n+p/n,[p%n,p/n][t%2],p]}.sort.map{|i|i[2]}.join' '
Run Code Online (Sandbox Code Playgroud)
跑
> zigzag.rb
3
0 1 3 6 4 2 5 7 8
> zigzag.rb
4
0 1 4 8 5 2 3 6 9 12 13 10 7 11 14 15
Run Code Online (Sandbox Code Playgroud)
对于排序方法,可以加倍.
let n=stdin.ReadLine()|>int
for i=0 to 2*n do for j in[id;List.rev].[i%2][0..i]do if i-j<n&&j<n then(i-j)*n+j|>printf"%d "
Run Code Online (Sandbox Code Playgroud)
例子:
$ echo 3 | fsi --exec Program.fsx
0 1 3 6 4 2 5 7 8
$ echo 4 | fsi --exec Program.fsx
0 1 4 8 5 2 3 6 9 12 13 10 7 11 14 15
Run Code Online (Sandbox Code Playgroud)