対角線を回転させる


32

バックグラウンド

ほとんどの合理的なプログラミング言語では、2D配列の行または列を簡単に回転できます。この課題では、代わりに対角線を回転させることがタスクです。2D配列の対角線は、北東方向に取られた1Dスライスであることに注意してください。

入力

妥当な形式の1桁の数字の空でない長方形の2D配列。配列は正方形ではないことに注意してください。

出力

同じ配列ですが、各対角線が1ステップ右に回転しています。

3x4入力配列を考えます

0 1 2 3
4 5 6 7
8 9 0 1

この配列の対角線は

0
4 1
8 5 2
9 6 3
0 7
1

回転したバージョンは

0
1 4
2 8 5
3 9 6
7 0
1

したがって、正しい出力は

0 4 5 6
1 8 9 0
2 3 7 1

ルールとスコアリング

完全なプログラムまたは関数を作成できます。言語で許可されている場合は、入力配列を適切に変更する関数を作成することもできます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計である場合、インタープリターフラグペナルティを個別にリストする場合、または改善した古いスコアを表示する場合)、実際のスコアを確認します。ある最後のヘッダ内の数字は。

追加のテストケース

Input:
4
Output:
4

Input:
5 6 1
Output:
5 6 1

Input:
0 1
6 2
Output:
0 6
1 2

Input:
6 3 0 8
4 6 1 4
6 2 3 3
9 3 0 3
Output:
6 4 6 1
3 6 2 3
0 9 3 0
8 4 3 3

Input:
5 8 2
6 7 3
2 6 1
6 0 6
6 4 1
Output:
5 6 7
8 2 6
2 6 0
3 6 4
1 6 1

Input:
9 9 4 0 6 2
2 3 2 6 4 7
1 5 9 3 1 5
0 2 6 0 4 7
Output:
9 2 3 2 6 4
9 1 5 9 3 1
4 0 2 6 0 4
0 6 2 7 5 7 

回答:


20

CJam、20

{z_)\zLa+(@+\.+s\,/}

機能ブロックとして書かれています。オンラインで試す

説明:

入力は次のように表示できます。

入力図

つまり、一番上の行と右の列を残りのマトリックスから分離し、それらの要素を矢印で示された順序で検討します。

次に、出力は次のようになります。

出力図

残りの長方形ブロックは全体として斜めに移動し、エッジ要素は新しい矢印で示される順序/位置に再配置されます。

コードはそれをほぼ正確に行いますが、出力は最初に矢印が真下に向かって生成されるため(マトリックスは文字Pのような尾部を持ちます)、修正されます。

z      zip (transpose) the matrix
_      make a copy
)      take out the last row (right column before transposing)
\      swap with the rest of the matrix
z      transpose back
La+    append an empty row (needed for the single-column case,
        which leaves an empty matrix here)
(      take out the first row (top row without the corner)
@+     bring the right column to the top of the stack and concatenate
        obtaining an array of the edge elements (marked with the blue arrow)
\      swap with the remaining part (big white block in the diagrams)
.+     concatenate element by element
        each edge element is concatenated with a row of the white block
        after the white block runs out, the remaining elements form new rows
s      convert the whole thing to a string (concatenating all rows)
\      swap with the copy of the transposed matrix
,      get its length (number of original columns)
/      split the string into rows of that length

Pythの回答も20バイトですが、あなたの回答は以前のものだったので、受け入れます。
ズガルブ

9

CJam、44 43 42 40バイト

qN/:ReeSf.*:sz1fm<{Rz,{(S-(o\}*~]{},No}h

ここでテストしてください。

うーん、私の最初の試みよりもはるかに優れていますが、デニスはとにかくこれをはるかに少ない方法で解決すると感じています...

入力と出力はASCIIグリッドです。

0123
4567
8901

与える

0456
1890
2371


3
@TimmyD猶予期間が終了するまで、47から43に編集するのを待つ必要がありました。:P
マーティンエンダー

はい!ミームになりました。
intrepidcoder

1
私は最終的にゴルフ言語を学び、4バイトから3バイトまでゴルフをしてリンクチェーンに参加できるようになりました:)
Khuldraeseth na'Barya

6

J、24文字

1つの引数を取る関数。

$$<@(1&|.)/./:&;</.@i.@$

Jは、オペレーターがある/.と呼ばれる斜めに。それを逆にすることはできないため、再構成は簡単ではありませんが、配列の要素の順列として「斜めのリスト」を考慮することができます。そのため、そのサイズ()の「リストオブリーク」置換を右側に、適切に回転した左側の新しい傾斜値を配置することにより、その置換を/:(ダイアディックソート)で反転し</.@i.@$ます。次に、good oldを使用して、このリストを古い長方形配列に再整形します$$

   3 4$i.10
0 1 2 3
4 5 6 7
8 9 0 1
   ($$<@(1&|.)/./:&;</.@i.@$) 3 4$i.10
0 4 5 6
1 8 9 0
2 3 7 1

オンラインでお試しください。


これがここのピークJです。よくやった。
ヨナ

5

J、38 30バイト

@algorithmsharkのおかげで8バイトが節約されました。

{./.((}.~#),~({.~#),.])}:"1@}.   

この関数は、上端と左端を収集してリストにし、リストを十分なサイズの2つの部分に切り取り、コアパーツの右と下にステッチします。

使用法:

   ]input=.0 1 2 3, 4 5 6 7,: 8 9 0 1
0 1 2 3
4 5 6 7
8 9 0 1
   ({./.((}.~#),~({.~#),.])}:"1@}.) input
0 4 5 6
1 8 9 0
2 3 7 1

こちらからオンラインでお試しください。


1
30文字まで:を{./.置き換え}:@{.,{:"1ます{./.((}.~#),~({.~#),.])}:"1@}.。列車を前後に動かすことで、2つのチルダを保存できます。
algorithmshark

4

ジュリア、153 149 139バイト

A->(length(A)>1&&((m,n)=size(A);r(X)=for i=1:n X[:,i]=reverse(X[:,i])end;r(A);for i=-m:m A[diagind(A,i)]=circshift(diag(A,i),1)end;r(A));A)

これにより、配列を受け入れ、その場で変更された入力配列を返す名前のない関数が作成されます。

ゴルフをしていない:

# Create a function to reverse the columns of a matrix
function revcols!(X)
    for = 1:size(X, 2)
        X[:,i] = reverse(X[:,i])
    end
    return X
end

# Our main function
function zgarb!(A)
    # Only perform operations if the array isn't one element
    if length(A) > 1
        # Record the number of rows
        m = size(A, 1)

        # Reverse the columns in place
        revcols!(A)

        # Shift each diagonal
        for i = -m:m
            A[diagind(A, i)] = circshift(diag(A, i), 1)
        end

        # Reverse the columns back
        revcols!(A)
    end
    return A
end

アルゴリズムに関するアドバイスと4バイトの節約について、MartinBüttnerに感謝します!


3

ES6、75バイト

これは、パラメーターとして配列の配列を受け入れ、その場で変更します。

a=>{t=a.shift();a.map(r=>{t.push(r.pop());r.unshift(t.shift())});a.push(t)}

ゴルフをしていない:

function anti_diagonal(array) {
    var temp = array.shift(); // strip off the first row
    array.forEach(row => temp.push(row.pop())); // strip off the last elements of each row
    array.forEach(row => row.unshift(temp.shift())); // distribute the elements to the beginning of each row
    array.push(temp); // the remaining elements become the last row
}

詳細については、@ aditsuの図を参照してください。


{t.push(r.pop());r.unshift(t.shift())}t.push(r.pop())+r.unshift(t.shift())
-user81655

3

Pyth、20バイト

J+PhQ.)MQ++L.(J0tQ]J

上の行と右の列を削除し、それらを左と下に貼り付けるというAdistuのアプローチを使用します。しかし、転置ではなく可変データ構造を使用します。


2

オクターブ、85バイト

@(a)[(b=[a(1,1:end),a(2:end,end)'])(1:(s=size(a)(1)))',[a(2:end,1:end-1);b(s+1:end)]]

を削除できるといいendのですが。


1

パイソン2113の 104 94バイト

f=lambda i,b=[]:i and[b and b[:1]+i[0][:-1]]+f(i[1:],b[1:]or i[0][:-1]+[l[-1]for l in i])or[b]

オンラインでお試しください!

これは、@ aditsuのメソッドのかなり文字通りの解釈です。空のリストをFalseとして処理するPythonの構文は、余分な10バイトを節約するのに役立ちました。


行を破棄することで8バイトを節約
SmileAndNod


1
あなたはおそらく必要はありません0[0:1]
ジョー・キング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.