マトリックス内の2x2ブロックごとに回転する


11

チャレンジ

整数で満たされたn x m行列が与えられた場合n > 1m > 1

1 2 3
4 5 6

2x2マトリックス内のブロックと正確に同じ数の値を持つ整数のリスト((n-1)*(m-1)正確な数が必要な場合)

[1、2]

2x2リスト内の現在の値で指定された順序で各ブロックを回転させた行列を出力します。上記の例では、

4 6 2
5 3 1

最初のブロックは1回右に回転し、2番目のブロックは2回右に回転します。

ノート

  • 正の整数は、その数のステップだけ右に回転することを意味します。
  • 負の整数は、その数のステップだけ左に回転することを意味します。
  • ゼロは回転しないことを意味します。
  • ブロックを行ごとに回転させます。つまり、最初の行から開始して右に移動します。その行のすべてのブロックを回転させたら、次のブロックに進みます。最後に、すべてのブロックが1回だけ回転しました。
  • ブロックは互いに重なり合っていることに注意してください。上記の最初のマトリックスには、ブロック[[1,2],[4,5]]など[[2,3],[5,6]]があります。
  • ブロックの各回転は、隣接するブロックの回転に影響します。これが、上記のパターンで回転を行わなければならない理由です。

ルール

  • 最も便利な形式で入力することができます。どちらを使用するかを回答で指定してください。ただし、ブロック単位でマトリックスを読み取ることできませ
  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最も少なくなります。Tiebreakerは以前の提出です。

テストケース

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

[[1,2]、[3,4]]、[-3]-> [[4,1]、[3,2]]
[[1,1,1]、[1,1,1]]、[-333、666]-> [[1,1,1]、[1,1,1]]
[[1,2,3]、[4,5,6]]、[1,2]-> [[4,6,2]、[5,3,1]]
[[1,2,3]、[4,5,6]、[7,8,9]]、[4,0,12、-20]-> [[1,2,3]、[4、 5,6]、[7,8,9]]
[[1,2,3,4,5]、[5,4,3,2,1]、[1,2,3,4,5]]、[2、-3,4,1,6、 24,21、-5]-> [[4,1,5,2,4]、[2,1,3,5,5]、[3,2,4,3,1]]

ハッピーコーディング!

回答:


4

CJam(42 40バイト)

{(\@2$,(/.{@a@a+z(\@.{4,={+2/zW%~}*}z~}}

オンラインデモ

基本的に、これはブロックを折り畳むために同じテクニックを2回適用します

{4,={+2/zW%~}*}

これは、2x2行列で動作し、何度も回転します。

[first row] [[second row] [third row] ... [last row]] [value_0 value_1 ... value_n]

で処理できます

.{block}

そしての効果があります

[first row]
[second row] value_0 {block}~
[third row] value_1 {block}~
...

理由.(のように%、それが終了されるまでCJamに)配列に結果を収集しません。


4,=ブロックを少なくとも1回実行する必要がない限り、正しいモジュロを使用してバイトを保存できます。
マーティンエンダー

またzW%、回転についてはどうですか?
マーティンエンダー

@MartinBüttner、回転が長すぎるように思えましたが、短い方を思い出せませんでした。モジュロの素晴らしいトリック。
ピーターテイラー

2

CJam、65 63 60 55バイト

これを行うにはより良い方法が必要です...

{_e_\z,:N(@/Ta*ee{~4,=,f{;1$,,\[XTN_)]f+_(+er\f=}~}/N/}

これは名前のない関数で、スタック上の命令とマトリックスを(この順序で)期待し、結果のマトリックスをその場所に残します。

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

説明

私は今、コードの完全な内訳を書くつもりはないので、大まかな概要を以下に示します。

  • 2D配列操作はCJamの苦痛なので、代わりにマトリックスを展開し、特定の位置で要素の順列として各回転を計算し、最後に配列を再び行に分割します。行列の幅はに保存されNます。
  • 位置に回転kアンロールアレイでは、4つのインデックスを変更:k <- k+1k+1 <- k+1+Nk+N <- kk+1+N <- k+1k命令リストに沿った各インデックスについて、これに対応する順列を計算し、展開された入力配列に適用します。
  • これにより問題が残ります。線形配列では、入力の最後の列の左上隅にいくつかの回転が配置されます。これらをスキップするために、これらの無効な2x2サブブロック技術的に処理されるように命令リストにゼロをリフリングします、何もしません。

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