マトリックス竜巻に注意してください!


27

マトリックス竜巻は、他の竜巻とまったく同じです。中心の周りを回転するもので構成されています。この場合、空気の代わりにマトリックスの要素。

マトリックス竜巻の例を次に示します。

アクションでの竜巻

まず、マトリックスを正方形のリングに分割することから始めます。各セクションは、境界から同じ距離だけ離れた要素で構成されます。これらのセクションは、中心の周りを時計回りに回転します。実際の竜巻では、重度は中心に向かって増加し、マトリックス竜巻の回転ステップも同様に増加します。最も外側のセクション(赤いセクション)は1ステップ、次のセクション(黄色)は2ステップ回転します。に。回転ステップは、中心を中心とした90°の回転です。

仕事:

あなたの仕事は、受け入れれば、入力として正方行列を受け取り、それに竜巻効果を適用し、結果の行列を出力する関数またはプログラムを書くことです。

入力:

入力は次の正方行列である必要nがありn >= 1ます。マトリックスの要素について何も仮定する必要はありません。どんな要素でも構いません。

出力:

入力行列にトロナド効果を適用した結果となる、同じ次数の正方行列。

例:

次の行列n = 1

[['Hello']]               ===>    [['Hello']]

次の行列n = 2

[[1 , 2],                 ===>    [[5 , 1],
 [5 , 0]]                          [0 , 2]]

次の行列n = 5

[[A , B , C , D , E],             [[+ , 6 , 1 , F , A],
 [F , G , H , I , J],              [- , 9 , 8 , 7 , B],
 [1 , 2 , 3 , 4 , 5],     ===>     [/ , 4 , 3 , 2 , C],
 [6 , 7 , 8 , 9 , 0],              [* , I , H , G , D],
 [+ , - , / , * , %]]              [% , 0 , 5 , J , E]]

回転が90°回転であることを明確にしたいと思います。
エリックアウトゴルファー

また、他のどこかからこの挑戦を受けましたか?その場合、帰属を提供する必要があります。
エリックアウトゴルファー

1
@EriktheOutgolfer 1)私はそれを明確にしました。2)この課題は私のものです。
イブラヒムマハリール18

4
@Giuseppeあなたがどの半球にいるかによって異なります;)
ジョーキング

12
最初に、これは良い挑戦だと思います。いい仕事です!しかし、どんな種類のデータでもよいと言うあなたの選択があなたの挑戦を厄介な点に残してしまうので、私はこの点を塞ぎたいと思います。同様に、入力がリストのリストであるというステートメントで、オーバーヘッドの作業を多少行わずにこの問題を解決できる言語を制限しました。これらの要件が緩和されれば、課題は改善されると思います。このような素晴らしいチャレンジを投稿し続けてください!:)
FryAmTheEggman

回答:


5

Python 3、100バイト

import numpy
def f(a):
 if len(a): a=numpy.rot90(a,axes=(1,0));a[1:-1,1:-1]=f(a[1:-1,1:-1]);return a

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


8
古典的なPython、a[1:-1,1:-1]=f(a[1:-1,1:-1])2次元配列の内部全体を直接取得して設定するのが世界で最も普通のことのように落とす
ETHproductions

1
@ETHproductionsが公正であるために、その一部は、構文から継承されたnumpy
ジョー・キング

1
numpy.rot90(a,1,(1,0))3バイト短くなり、動作するはずです。
グレイファー

1
テストケースなしのTIOリンクのポイントは何ですか?..:S ここにあります(スペースif len(a):a=...を-1バイト落とした)。
ケビンクルイッセン

5

チャコール、44バイト

≔EθSθWθ«≔Eθ⮌⭆觧θνλθθM¹⁻¹Lθ≔E✂θ¹±¹¦¹✂κ¹±¹¦¹θ

オンラインでお試しください!リンクは、コードの詳細バージョンです。CharcoalのデフォルトI / Oは通常の配列の正義を実行しないため、文字の正方形でのみ機能します。説明:

≔EθSθ

文字の四角を読みます。

Wθ«

空になるまでループします。

≔Eθ⮌⭆觧θνλθ

回転させます。

θM¹⁻¹Lθ

印刷しますが、カーソルを元の角から斜めに1つの正方形に移動します。

≔E✂θ¹±¹¦¹✂κ¹±¹¦¹θ

配列から外側を切り取ります。


5

ゼリー、27バイト

J«þ`UṚ«Ɗ‘ịZU$LСŒĖḢŒHEƊƇṁµG

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

これはもっと短くなると思います。

           Input: n×n matrix A.
J          Get [1..n].
 «þ`       Table of min(x, y).
    UṚ«Ɗ   min with its 180° rotation.

Now we have a matrix like: 1 1 1 1 1
                           1 2 2 2 1
                           1 2 3 2 1
                           1 2 2 2 1
                           1 1 1 1 1

‘ị          Increment all, and use as indices into...
     LС    List of [A, f(A), f(f(A)), …, f^n(A)]
  ZU$       where f = rotate 90°

Now we have a 4D array (a 2D array of 2D arrays).
We wish to extract the [i,j]th element from the [i,j]th array.

ŒĖ     Multidimensional enumerate

This gives us: [[[1,1,1,1],X],
                [[1,1,1,2],Y],
                ...,
                [[n,n,n,n],Z]]

ḢŒHEƊƇ     Keep elements whose Ḣead (the index) split into equal halves (ŒH)
           has the halves Equal to one another. i.e. indices of form [i,j,i,j]
           (Also, the head is POPPED from each pair, so now only [X] [Y] etc remain.)

ṁµG        Shape this like the input and format it in a grid.

1
おそらく、ちょうど置くことができµG、あなたの提出が25であることをフッターと主張して
氏Xcoder

5

Perl 6の78の73 72バイト

-5バイトのnwellnhofに感謝します!

$!={my@a;{(@a=[RZ] rotor @_: sqrt @_)[1..*-2;1..@a-2].=$!}if @_;@a[*;*]}

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

平坦化された2D配列を受け取り、同様に平坦化された配列を返す再帰的なコードブロック。

説明:

$!={      # Assign code block to pre-declared variable $!
    my@a; # Create local array variable a
   {
     (@a=[RZ]  # Transpose:
             rotor @_: sqrt @_;  # The input array converted to a square matrix
     )[1..*-2;1..@a-2].=$!  # And recursively call the function on the inside of the array
   }if @_;    # But only do all this if the input matrix is not empty
   @a[*;*]  # Return the flattened array
}

@a[*;*]代わりにmap |*,@aを使用して、アレイをフラット化できます。(
平坦化され

しかし、@a[1..*-2;1..@a-2].=$!動作します。
-nwellnhof

5

オクターブ86 81バイト

f(f=@(g)@(M,v=length(M))rot90({@(){M(z,z)=g(g)(M(z=2:v-1,z)),M}{2},M}{1+~v}(),3))

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

再帰的な匿名関数は、Octaveで物事を行うための最短の方法ではないことを知っていますが、それらは最も楽しい方法です。これは、私が思いつくことができる最短の匿名関数ですが、私はゴルフをしすぎてみたいです。

説明

再帰関数は、ceilingcatによるこの 回答に従って定義されます。再帰呼び出しをq=f(f=@(g)@(M) ... g(g)(M) ...伴うg(g)(M)、このような匿名関数の基本構造です。これは無期限に繰り返されるため、条件付きセル配列で再帰呼び出しをラップします{@()g(g)(M),M}{condition}()。空の引数リストを持つ匿名関数は、条件が選択された後まで評価を遅らせます(後で、その引数リストを使用してを定義できることがわかりますz)。これまでのところ、基本的な簿記にすぎません。

さあ、実際の仕事に。Mの中央部分で再帰的に呼び出されrot90(P,-1)た行列を関数で返す必要がありますg(g)。M z=2:end-1のインデックス付けで非表示にできる設定から始めます。このようにして、M(z,z)必要な行列の中央部分を選択します。再帰呼び出しによってさらに竜巻が発生します。,3部分は回転が時計回りであることを保証します。南半球に住んでいる場合は、このバイトを-2バイト削除することができます。

それからM(z,z)=g(g)M(z,z)。ただし、この操作の結果値は、Pマトリックス全体ではなく、変更された中央部分のみです。したがって、{M(z,z)=g(g)M(z,z),M}{2}基本的にはStewie Griffinによるこの 答えから盗まれます。

最後conditionに、入力が空になると再帰が停止するだけです。


南半球の+1
ceilingcat

私はまだ匿名関数で再帰に頭を包むことを試みていないので、それを試みることはしませんが、再帰がこのループのループより短いかどうかを知りたいです。
Stewie Griffin

@StewieGriffin私に何ができるか見てみましょう:)
Sanchises

@StewieGriffinところで、このチャレンジにOctaveでループベースのバージョンを投稿するのは難しいと感じてください。再帰的なアプローチに打ち勝つことができるかどうかは本当に疑問です。
Sanchises

4

R、87バイト

function(m,n=nrow(m)){for(i in seq(l=n%/%2))m[j,j]=t(apply(m[j<-i:(n-i+1),j],2,rev));m}

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



許可されていますか?画像は時計回りの矢印を示し、その下の説明は時計回りの回転を示しています
...-digEmAll

私は質問を10回読んだはずで、時計回りに記載されていることに気付いたことはありませんでした(したがって、私のコメント)。ああ。
ジュゼッペ

ええ、それについて教えてください...私は投稿を読み間違えの王です:D
digEmAll

1
残念ながら、1x1マトリックスは機能しません(seq(0.5)空のベクターの代わりに1を返すため)
digEmAll

4

MATL25 24 23 22

t"tX@Jyq-ht3$)3X!7Mt&(

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

MATLでのインデックス作成は決して簡単ではありませんが、いくつかのゴルフでは実際に現在のベストゼリーの答えを打ち負かしています

t                       % Take input implicitly, duplicate.  
 "                      % Loop over the columns of the input*
   X@                   % Push iteration index, starting with 0. Indicates the start of the indexing range.
     Jyq-               % Push 1i-k+1 with k the iteration index. Indicates the end of the indexing range
         t              % Duplicate for 2-dimensional indexing.
  t       3$)           % Index into a copy of the matrix. In each loop, the indexing range gets smaller
             3X!        % Rotate by 270 degrees anti-clockwise
                7Mt&(   % Paste the result back into the original matrix. 

* n x nマトリックスの場合、このプログラムはn繰り返しを行いますが、実際にはn/2回転のみが必要です。ただし、MATL(AB)のインデックス付けは十分に柔軟であるため、不可能な範囲のインデックス付けは無操作です。このように、適切な反復回数を得るためにバイトを浪費する必要はありません。



3

K(ngn / k)41 39 38バイト

{s#(+,/'4(+|:)\x)@'4!1+i&|i:&/!s:2##x}

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

{ } 引数付きの関数 x

#x長さx-マトリックスの高さ

2##x 2つのコピー-高さと幅(同じと仮定)

s:s「形状」に割り当てる

!s形状の行列のすべての指標s、例えば!5 5あります

(0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4
 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4)

これは2行のマトリックス(リストのリスト)であり、その列は5x5マトリックスのインデックスに対応しています。

&/ 2行にわたる最小:

0 0 0 0 0 0 1 1 1 1 0 1 2 2 2 0 1 2 3 3 0 1 2 3 4

i&|i:に割り当てi、逆(|)、最小(&)を取得i

0 0 0 0 0 0 1 1 1 0 0 1 2 1 0 0 1 1 1 0 0 0 0 0 0

これらは、5x5マトリックスの平坦化されたリング番号です。

4!1+ 1を加算し、4を法とする剰余を取る

(+|:)は、反転(|- :強制的に単項式にする必要があります)してから転置(+-「train」の右端の動詞ではないため、必要ありません:)によって回転する関数です

4(+|:)\x4回適用しx、中間結果を保存します

,/' 平らにする

+ 転置

( )@' 左側の各値にインデックスを付け、右側の各値にインデックスを付けます

s# に形を変える s


2
コードの説明を見ることができてうれしいです
ガレンイワノフ

1
@GalenIvanov確かに。これ以上ゴルフできないと思うので、説明しようと思うかもしれません。
-ngn

ありがとう!あなたのソリューションは、私がKを学習を開始する(あるいはNGN / K :))たくなる
ガレン・イワノフ

@GalenIvanov J(およびAPL?)に精通しているので、あなたはすでに中途半端です。Kは小さくてシンプルなので、学ぶことを強くお勧めします。もちろん、いつでもオーチャードでチャットできることを嬉しく思います。ngn / kは本物のサブセットにすぎませんが、高速で実用的なものにすることを目指しています。
ngn

はい、試してみたいと思います。
ガレンイワノフ

3

JavaScript(ES6)、99バイト

f=(a,k=m=~-a.length/2)=>~k?f(a.map((r,y)=>r.map(v=>y-m>k|m-y>k|--x*x>k*k?v:a[m+x][y],x=m+1)),k-1):a

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

どうやって?

W

m=W12tx,y=max(|ym|,|xm|)

5x5マトリックス(、)の出力例:tx,yW=5m=2

(2222221112210122111222222)

開始し条件を満たすすべてのセルを時計回りに90度回転します。k=m(x,y)

tx,yk

他のものは変更されません。

これは、次の場合にセルが回転しないと言うことと同じです。

(ym>k) OR (my>k) OR (X2>k2) with X=mx

コードで使用されるテストは次のとおりです。

a.map((r, y) =>
  r.map(v =>
    y - m > k | m - y > k | --x * x > k * k ?
      v
    :
      a[m + x][y],
    x = m + 1
  )
)

その後、我々はデクリメントまで、そして再び開始又は(のパリティに依存)。いずれにせよ、それは停止状態を引き起こします:K = - 1 、K = - 3 / 2 Wkk=1k=3/2W

~k === 0

3

ゼリー、24バイト

ṙ⁹ṙ€
ḊṖ$⁺€ßḷ""ç1$ç-ZUµḊ¡

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

これはもっと短くなると思います。

リン


私はこのような解決策について疑問に思いました!それḷ""は私には魔法のように見えます^^説明を追加してくれませんか?
リン

@Lynn私が最後に期待したことḷ""は、それが魔法だと聞いたことでした。それは単にḷ"余分なもの"です...ああ、それḷ"は私が「発明した」ものであり、あまり使用されていないものである可能性があります。入力も含めることができます0)。
エリックアウトゴルファー

2

Haskell、108バイト

e=[]:e
r=foldl(flip$zipWith(:))e
g!(h:t)=h:g(init t)++[last t]
f[x,y]=r[x,y]
f[x]=[x]
f x=r$(r.r.r.(f!).r)!x

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

Laikoniのトランスポーズを使用し、少し変更して、アレイを90°回転させました。

  e=[]:e;foldr(zipWith(:))e.reverse
 e=[]:e;foldl(flip$zipWith(:))e

説明

r 配列を90°回転します。

(!)上位レベルの機能:「センターに適用」。g![1,2,3,4,5]です[1] ++ g[2,3,4] ++ [5]

f は竜巻関数です。ベースケースはサイズ1と2です(どういうわけか0は機能しません)。

最後の行は、魔法が発生する場所です。r.r.r.(f!).r中央の行に適用しx、結果を回転させます。これらの中央の行をMと呼びましょう。私たちは、真ん中に再帰したいM、およびそれらで取得するには、我々が回転することができMをしてから使用します(f!)。次に、Mr.r.rを回転させて元の方向に戻します。


2

Java 10、198 192バイト

m->{int d=m.length,b=0,i,j;var r=new Object[d][d];for(;b<=d/2;b++){for(i=b;i<d-b;i++)for(j=b;j<d-b;)r[j][d+~i]=m[i][j++];for(m=new Object[d][d],i=d*d;i-->0;)m[i/d][i%d]=r[i/d][i%d];}return r;}

@ceilingcatのおかげで-6バイト。

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

説明:

m->{                         // Method with Object-matrix as both parameter and return-type
  int d=m.length,            //  Dimensions of the matrix
      b=0,                   //  Boundaries-integer, starting at 0
      i,j;                   //  Index-integers
  var r=new Object[d][d];    //  Result-matrix of size `d` by `d`
  for(;b<=d/2;b++){          //  Loop `b` in the range [0, `d/2`]
    for(i=b;i<d-b;i++)       //   Inner loop `i` in the range [`b`, `d-b`)
      for(j=b;j<d-b;)        //    Inner loop `j` in the range [`b`, `d-b`)
        r[j][d+~i]=          //     Set the result-cell at {`j`, `d-i-1`} to:
          m[i][j++];         //      The cell at {`i`, `j`} of the input-matrix
    for(m=new Object[d][d],  //   Empty the input-matrix
        i=d*d;i-->0;)        //   Inner loop `i` in the range (`d*d`, 0]
      m[i/d][i%d]            //     Copy the cell at {`i/d`, `i%d`} from the result-matrix
        =r[i/d][i%d];}       //      to the replaced input-matrix
  return r;}                 //  Return the result-matrix as result

b基本的にどのリングにいるかを示すために使用されます。そして、すべての反復中に時計回りに一度その中のすべてを含むこのリングを回転させます。

Javaは参照渡しであるため、入力行列の置換が行われます。したがって、単純に設定r=mすると、セルからコピーするときに両方の行列が変更され、誤った結果が生じます。したがって、新しいObject-matrix(新しい参照)を作成し、代わりにすべてのセルの値を1つずつコピーする必要があります。


1

MATLAB、93バイト

function m=t(m),for i=0:nnz(m),m(1+i:end-i,1+i:end-i)=(rot90(m(1+i:end-i,1+i:end-i),3));end;end

これは何らかの形でもっとゴルフできると確信しています。

説明

function m=t(m),                                                                          end % Function definition
                for i=0:nnz(m),                                                       end;    % Loop from 0 to n^2 (too large a number but matlab indexing doesn't care)
                                                            m(1+i:end-i,1+i:end-i)            % Take the whole matrix to start, and then smaller matrices on each iteration
                                                      rot90(                      ,3)         % Rotate 90deg clockwise (anti-clockwise 3 times)
                               m(1+i:end-i,1+i:end-i)=                                        % Replace the old section of the matrix with the rotated one


1

Haskell、274バイト

w[[a]] -> [[a]]あなたが期待するタイプを持つメイン関数です。

より経験豊富なHaskellゴルファーがこれを改善できると確信しています。

w m|t m==1=m|0<1=let m'=p m in(\a b->[h a]++x(\(o,i)->[h o]++i++[f o])(zip(tail a)b)++[f a])m'(w(g m'))
p m|t m==1=m|0<1=z(:)(f m)(z(\l->(l++).(:[]))(r(x h(i m)):(p(g m))++[r(x f(i m))])(h m))
t[]=1
t[[_]]=1
t _=0
h=head
f=last
x=map
i=tail.init
g=x i.i
z=zipWith
r=reverse

Haskellでのゴルフのヒントをご覧ください。たとえば、条件の代わりにガードを使用すると、バイト数が節約されます。
ライコニ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.