25

チャレンジ

単一の入力整数(N> = 3)を取り、繰り返されるとJPEG「ジグザグ」スキャンパターンに従ってx行列Nをトラバースするインデックスの配列を返す、文字数による最短のコード。以下は、8x8マトリックスsrcのトラバーサルの例です。NN

ジグザグレイアウトパターン

(中央の行列は入力または出力の一部ではなく、入力が表す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

ノート

  • 結果の配列のベースは、使用する言語に適している必要があります(たとえば、Matlab配列は1ベース、C ++配列は0ベースです)。
  • これはこの質問に関連しています。

ボーナス

答えを拡張して、2つの入力NM(N、M> = 3)を取得し、NxM行列に対して同じスキャンを実行します。(この場合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
4

10 に答える 10

16

J、1315文字

;<@|.`</.i.2$

使用法:

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

説明

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.

J、ボーナス、13文字

;<@|.`</.i.|.

使用法:

   ;<@|.`</.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
于 2010-06-12T05:10:56.343 に答える
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],

テスト:

$ 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

このソリューションは、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],

2つの数字を読むのにもっと簡単/短い方法があるのではないかと思います。

テスト:

$ echo 4 3 | python ./code-golf.py 
0 1 4 8 5 2 3 6 9 10 7 11
于 2010-06-11T20:19:10.860 に答える
9

ルビー、6898文字

n=gets.to_i
puts (0...n*n).sort_by{|p|[t=p%n+p/n,[p%n,p/n][t%2]]}*' '

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' '

走る

> 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

ソート方法で2倍にするクレジット。

于 2010-06-11T22:54:51.680 に答える
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 "

例:

$ 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
于 2010-06-11T20:13:43.637 に答える
4

Golfscript、26 / 30 32/364559 文字

これまでの最短の非Jソリューション:

ソートを更新しました(他の人には言わないでください!)-30文字:

 ~:1.*,{..1/\1%+.2%.+(@*]}$' '* #solution 1
#~:\.*,{.\/1$\%+.1&@.~if]}$' '* #solution 2
#~\:1*,{..1/\1%+.2%.+(@*]}$' '* #(bonus)
#~\:\*,{.\/1$\%+.1&@.~if]}$' '* #(bonus)

単純な実装-36文字:

 ~:@.*,{[.@%:|\@/:^+|^- 2%^|if]}$' '*
#~\:@*,{[.@%:|\@/:^+|^- 2%^|if]}$' '* #(bonus)

「013 6 4 2 5 7 8」ではなく「013642578」として出力できる場合は、最後の4文字を削除できます。

ソート手法を2倍にするクレジット。


説明:

~\:@*        #read input, store first number into @, multiply the two
,            #put range(@^2) on the stack
{...}$       #sort array using the key in ...
" "*         #join array w/ spaces

そして鍵のために:

[            #put into an array whatever is left on the stack until ]
.@%:|        #store @%n on the stack, also save it as |
\@/:^        #store @/n on the stack, also save it as ^
+            #add them together. this remains on the stack.
|^- 2%^|if   #if (| - ^) % 2 == 1, then put ^ on stack, else put | on stack.
]            #collect them into an array
于 2010-06-12T23:33:44.100 に答える
3

MATLAB、101/116文字

これは基本的に、コマンドプロンプトで直接実行される、ここに示されている同じ回答の要約バージョンです。

N=input('');i=fliplr(spdiags(fliplr(reshape(1:N*N,N,N)')));i(:,1:2:end)=flipud(i(:,1:2:end));i(i~=0)'

そして、ユーザーから2つの値を読み取る拡張されたもの:

S=str2num(input('','s'));i=fliplr(spdiags(fliplr(reshape(1:prod(S),S)')));i(:,1:2:end)=flipud(i(:,1:2:end));i(i~=0)'

テスト:

3
ans =
     1     2     4     7     5     3     6     8     9

4 3
ans =
     1     2     5     9     6     3     4     7    10    11     8    12
于 2010-06-12T01:56:45.070 に答える
2

Ruby 137130138 文字_

n=gets.to_i
def g(a,b,r,t,s);x=[s*r]*t;t==r ?[a,x,a]:[a,x,g(b,a,r,t+1,-s),x,a];end
q=0;puts ([1]+g(1,n,n-1,1,1)).flatten.map{|s|q+=s}*' '

$ zz.rb
3
1 2 4 7 5 3 6 8 9

$ zz.rb
4
1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16
于 2010-06-12T04:57:17.597 に答える
2

C89(280バイト)

これはまだ最適化できると思います。壁にぶつかったときに可能な移動ベクトルを格納するために4つの配列を使用します。定義でいくつかの文字を節約して、それを行うことができると思いますが、ロジックをさらに下に実装するには、より多くのコストがかかると思います。とにかく、ここに行きます:

t,l,b,r,i,v,n;main(int c,char**a){n=atoi(*++a);b=n%2;int T[]={n-1,1},L[]={1-n,n}
,B[]={1-n,1},R[]={n-1,n};for(c=n*n;c--;){printf("%d%c",i,c?32:10);if(i>=n*(n-1))
v=B[b=!b];else if(i%n>n-2){if(!(n%2)&&i<n)goto g;v=R[r=!r];}else if(i<n)g:v=T[t=
!t];else if(!(i%n))v=L[l=!l];i+=v;}}

いくつかの警告とともにコンパイルされますが、私が知る限り、それはポータブルC89です。私のアルゴリズムが賢いのかどうかは実際にはわかりません。おそらく、より良いアルゴリズムでもっと短くすることができます(他の解決策を理解するのにまだ時間がかかりませんでした)。

于 2010-08-28T18:31:32.560 に答える
1

Haskell117文字

i s=concatMap(\q->d q++(reverse.d$q+1))[0,2..s+s]
 where d r=[x+s*(r-x)|x<-[0..r],x<s&&(r-x)<s]
main=readLn>>=print.i

実行:

$ echo 3 | ./Diagonals 
[0,1,3,6,4,2,5,7,8]

$ echo 4 | ./Diagonals 
[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15]

長方形のバリエーションは少し長く、120文字です。

j(w,h)=concatMap(\q->d q++(reverse.d$q+1))[0,2..w+h]
 where d r=[x+w*(r-x)|x<-[0..r],x<w&&(r-x)<h]
main=readLn>>=print.j

ここでの入力にはタプルが必要です。

$ echo '(4,3)' | ./Diagonals 
[0,1,4,8,5,2,3,6,9,10,7,11]

$ echo '(3,4)' | ./Diagonals 
[0,1,3,6,4,2,5,7,9,10,8,11]

回答はすべて0ベースで、リスト(Haskellの自然な形式)として返されます。

于 2010-06-13T17:59:54.600 に答える
0

Perl102文字

<>=~/ /;print map{$_%1e6," "}sort map{($x=($%=$_%$`)+($/=int$_/$`))*1e9+($x%2?$/:$%)*1e6+$_}0..$'*$`-1

利用方法 :

echo 3 4 | perl zigzag.pl
0 1 3 6 4 2 5 7 9 10 8 11
于 2010-06-21T14:36:41.603 に答える