Code Golf:锯齿形图案扫描

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)

笔记

  • 生成的数组的基础应该适合您的语言(例如,Matlab数组是基于1的,C++数组是基于0的).
  • 这与这个问题有关.

奖金

扩展您的答案以获取两个输入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

J,13 15个字符

;<@|.`</.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)

J,奖金,13个字符

;<@|.`</.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)

  • 我喜欢两个角色'应用于交替对角线'的方式. (6认同)

dou*_*lep 11

Python,第92,95,110,111,114,120,122,162,164个字符

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*NN*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)


Dog*_*ert 9

Ruby,69 89个字符

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)

89个字符

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)

对于排序方法,可以加倍.


Bri*_*ian 5

F#,126个字符

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)

  • `[x; y].[i%2]`而不是`if i%2 = 0然后x else y` - 很好,要记住那个 - 道具到@doublep (3认同)