マトリックス内のすべての行と列を回転させる


15

チャレンジ

n x n整数の行列が与えられた場合n >= 2

1 2
3 4

および正確2nな要素を持つ整数のリスト

[1,2、-3、-1]

回転した行列を出力します。このマトリックスは、次の方法で構成されます。

  • リストの最初の整数を取得し、この値で最初の行を右に回転します。
  • 次の整数を取得し、最初の列をこの値だけ下に回転します。
  • 次の整数を取得し、マトリックスのすべての行と列を1回回転するまで、この値などで2番目の行を右に回転します。

リストには負の整数を含めることができます。これは、行/列を右/下ではなく左/上にシフトすることを意味します。整数がゼロの場合、行/列を回転させないでください。

上記の入力を使用した例

リスト要素マトリックスの説明
-------------------------------------------------- ----------
1 2 1 1行目を右に1回転
                   3 4

2 2 1 1列目を2回転下げる
                   3 4

-3 2 1 2行目を左に3回転
                   4 3

-1 2 3 2列目を1つ上に回転
                   4 1

ルール

  • 最も便利な入力形式を選択できます。どちらを使用するかを明確にしてください。
  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最も少なくなります。Tiebreakerは以前の提出です。

テストケース

ここでの入力形式は、マトリックスのリストのリストと整数の通常のリストです。

[[1,2]、[3,4]]、[1,2、-3、-1]-> [[2,3]、[4,1]]
[[1,2]、[3,4]]、[1,1,1,1]-> [[3,2]、[4,1]]
[[1,2]、[3,4]]、[0,0,0,0]-> [[1,2]、[3,4]]
[[1,2、-3]、[-4,5,6]、[7、-8,0]]、[1、-2,0、-1,3,4]-> [[7、 5,0]、[-3、-8,2]、[-4,1,6]]
[[1,2、-3]、[-4,5,6]、[7、-8,0]]、[3,12、-3,0、-6、-3]-> [[1 、2、-3]、[-4,5,6]、[7、-8,0]]

ハッピーコーディング!


mapcarが役立つはずです...
msh210

回答:


6

CJam、13バイト

{{a.m>1m<z}/}

スタックの最上位にあるマトリックスとリストを(この順序で)取得し、新しいマトリックスをその場所に残す名前のないブロック(関数)。

すべてのテストケースを実行します。

同じ考え、同じバイト数、異なる実装:

{{\(@m>a+z}/}
{{(Im>a+z}fI}
{{:\Im>]z}fI}

説明

理想的には、リスト内の各命令を同じものとして扱い、それを使用してマトリックスの最初の行を回転させるだけです。これは、各命令を少し実行した後にマトリックスを変換し、それらの追加の変換がすべて最終的にキャンセルされるようにすることで、非常に簡単に実行できます。したがって、各命令を処理した後、すべての行を1つ上に回転し(同じ次元に沿った次の命令が次の行を処理するように)、次に実際に列を処理するように行列を転置します。これらの追加の変換は、リスト内の命令に直交しており、まさに2n必要な期間だけです。

コードに関して:

{      e# For each instruction...
  a    e#   Wrap it in a singleton array.
  .m>  e#   Combine it element-wise with the matrix to rotate right. This is
       e#   a fairly common idiom to apply a binary operation only to the first
       e#   element of an array, since element-wise operations just retain all the
       e#   unpaired elements of the longer array.
  1m<  e#   Rotate the rows one up.
  z    e#   Transpose.
}/

4

APL(Dyalog Extended)17 15 14 13バイト

Adámによる-3バイト

(⍉1⊖⌽`@1⍢⌽)/⌽

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

入力をリストとして取得します。最初の要素は行列で、残りの要素は回転量です。⌽が左ではなく右に回転すると、CJamに勝ちます。

(⍉1⊖⌽@1 1⍢⌽)/⌽    Monadic train:
(⍉1⊖⌽@1 1⍢⌽)      Helper function to rotate and transpose once.
                        Takes args  (amount to rotate) and  (current array)
                      Function to rotate left
        1 1             2-element vector containing 1.
                        The second 1 is redundant, but saves 1 byte over (,1).
     ⌽@1 1             Function to rotate the 1st row left by ⍺.
     ⌽@1 1⍢⌽          Reverse ⍵, rotate 1st row left by ⍺, then reverse again.
                        This rotates the first row of  to the *right*.
  1                   Rotate all the rows upward,
                                                  then transpose.
(⍉1⊖⌽@1 1⍢⌽)/⌽   Fold (/) this function over the reversed input.
                     If our input is ⍵, _1, _2, ..., _2n,
                     the reversed input will be _2n, ..., _1, ⍵.
                     The / operator applies the function right to left,
                     so the  is necessary.

{⍉1⊖⌽⍺⌽@(⍳1)⌽⍵}(⍉1⊖⌽@(⍳1)⍢⌽)しかし@1@(⍳1)またはの代わりに機能しない理由を説明してもらえますか@(,1)?また、OPを使用すると、入力を逆にすることができます。
アダム

したがってat、拡張の背後にあるdfns ' は@互換性のある拡張ではないことがわかります。ただし、でバイトを節約するネイティブ@を使用できます。`@1@1 1
アダム

aplとJで回転の動作は異なりますか?私はこれをJに翻訳し、もっと冗長にしようとしています
ジョナ

2

Python 2、96バイト

def f(m,v):
    for i,x in enumerate(v):x%=len(m);r=m[i/2];m[i/2]=r[-x:]+r[:-x];m=zip(*m)
    return m

テスト

fタプルのリストを返します。関数本体の各行は、1つのタブ文字でインデントされます。


まっすぐにreturn zip(*m)5バイト節約できませんか?
デンカー

@DenkerAffe:m=zip(*m);return mちょうどに置き換えることを提案していreturn zip(*m)ますか?ループのm=zip(*m)一部であるため、私はそれを行うことができませんfor
-vaultah

ええ、それは私のことでした。ループ内にあることを見ていない、私の悪い。
デンカー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.