インターレース回転


25

チャレンジ

文字の正方行列(1バイトの印刷可能なASCII文字)を指定すると、行列の各「リング」を反対方向に回転させます。

例を見てみましょう:

1 2 3 4 5
6 7 8 9 A
B C D E F
G H I J K
L M N O P

次に、次のように、最も外側のリングが時計回りに90度回転します。

1 2 3 4 5    L G B 6 1
6       A    M       2
B       F => N       3
G       K    O       4
L M N O P    P K F A 5

2番目のリングは反時計回りに90度回転します。

7 8 9    9 E J
C   E => 8   I
H I J    7 C H

最後のリングは時計回りに90度回転しますが、1つの数字(この例では文字)であるため、実際には影響を受けません。

最終結果は次のとおりです。

L G B 6 1
M 9 E J 2
N 8 D I 3
O 7 C H 4
P K F A 5

マトリックスの辺の長さが偶数の場合、最も内側のリングは2x2の正方形になり、回転する必要があります。

入力

妥当な標準形式のリストのリスト。たとえば、改行で区切られたスペースで区切られた文字列またはスペースで区切られた文字列のリストは受け入れられますが、マトリックスを囲むリングとしての値のリストは受け入れられません。文字は必ずしも一意ではありません。

出力

妥当な標準形式のリストのリスト。入力と同じルール。

テストケース

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

1 2 3 4 5 6    Y S M G A 1
A B C D E F    Z E K Q W 2
G H I J K L => ! D O I V 3
M N O P Q R    @ C P J U 4
S T U V W X    # B H N T 5
Y Z ! @ # $    $ X R L F 6

クレジット

各要素を反時計回りに1ポジション(90度ではなく)回転させる、関連する課題に大きく触発されました。



@ rahnema1そうですね、その投稿を覚えています。この投稿は主にその1つに触発されています。クレジットします。ありがとう!
ハイパーニュートリノ

@ Mr.Xcoderおっと。あなたは正しい、ありがとう。
ハイパーニュートリノ

@HyperNeutrinoは、入力の一部として行列の次元を取ることができますか?
ウリエル

あなたの例のすべてのキャラクターはユニークです。これは常に当てはまりますか?
デニス

回答:


9

Haskell、94バイト

Stringsのリストを取得して返す匿名関数。

として使用し(cycle[t.r,r.t,r.t,r.t]?)["123", "456", "789"]ます。

(cycle[t.r,r.t,r.t,r.t]?)
(g:h)?(a:b)=g$a:h?t(r b)
_?a=a
r=reverse;t=zipWith(:)`foldr`repeat[]

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

使い方

  • rですreversetはインポートより1バイト短いですData.List.transposet.rリストのリストを時計回りに90度r.t回転し、反時計回りに回転します。
  • 演算子?は、関数のリストと文字列のリストとしてのマトリックスの2つの引数を取ります。
    • 空の行列が返されるだけです。
    • それ以外の場合、?関数fのリストから最初の関数をa取り除き、行列から最初の行を取り除きます。
    • 次にb、行列の残りの部分を時計回りに回転し、それと残りの関数で再帰します。これにより、4ステップごとに1つのリングでマトリックスが外側から徐々に取り除かれます。
    • 次にa、結果に元の行を追加し、関数を適用しますfをてマトリックスの方向を調整します。
  • 無名関数は?、文字列のリストとしての入力行列と、4ステップごとに周期的に繰り返される関数の無限リストで呼び出します。
    • ほとんどのステップで、関数は反時計回りに回転します。これにより、暗黙的な時計回りの回転が取り消されます。 ?、再帰時にたに戻します。
    • ただし、最初のステップとその後の4番目のステップは、代わりに時計回りに回転します。
      • この関数は、マトリックスのリングが完成したときに適用され、各リングが次のリングに対して180度回転します。
      • 幸運なことに、これは最終的な完成したマトリックスに適用して最終結果を得るための正しい変換でもあります。

6

Python 2、104バイト

def f(x):l=len(x)-1;r=range(l+1);return[[[x[l-i][j],x[i][l-j]][min(i,j,l-i,l-j)%2]for i in r]for j in r]

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

x[l-i][j]反時計回りの回転の時計回りの回転の座標ですx[i][l-j]min(i,j,l-i,l-j)%2正しい方向を選ぶために使用されます


回転を再帰的に返します。
-tuskiomi

@tuskiomiうーん??
ロッド

@tuskiomi ES6で再帰的なアプローチを試みました。それは...この回答の簡単なポートの約2倍の長さだった
ニール・

4

Mathematica、113バイト

r=Reverse;(l=Length[s=#];Table[s[[i+1;;l-i,i+1;;l-i]]=r/@r@s[[i+1;;l-i,i+1;;l-i]],{i,⌊l/2⌋}];r/@Transpose@s)&


E、I ...などの特殊文字の場合は、「E」などの文字列として入力することをお勧めします。

入力

[{{1、2、3、4、5、6}、{A、B、C、D、 "E"、F}、{G、H、 "I"、J、K、L}、{M 、N、O、P、Q、R}、{S、T、U、V、W、X}、{Y、Z、「!」、「@」、「#」、「&」}}]

出力

{{Y、S、M、G、A、1}、{Z、「E」、K、Q、W、2}、{"!"、D、O、「I」、V、3}、{ 「@」、C、P、J、U、4}、{「#」、B、H、N、T、5}、{「&」、X、R、L、F、6}}


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