折り畳まれた行列を減算する


21

チャレンジ:

および8つの異なる「折りたたみオプション」の1つであるNxN行列が与えられた場合、値が減算された2D配列/リストを出力します。N2

8つの折りたたみオプションは次のとおりです。左から右。右から左へ; 上から下へ; 下から上 左上から右下; topright-to-bottomleft; 左下から右上へ。下から左へ。

段階的な例:

入力行列:

[[ 1, 3, 5, 7],
 [ 0, 8, 6, 4],
 [ 1, 1, 1, 1],  (a'th row in the explanation below)
 [ 1,25, 0,75]]

折りたたみオプションを上から下にすると、次の結果が出力されます。

[[ 1,-7,-5,-3],
 [ 0,22,-5,68]]

どうして?上から下に折ります。マトリックスの次元は均一なので、そのまま保持する中間層はありません。「行が減算される行目(であったであろう」の奇数次元行列の「行目)。そうなります。番目の行は、次に減算される行目(であったであろう」奇数次元行列の「行目)。そうなります。a[1, 1, 1, 1](a1)(a2)[1-0, 1-8, 1-6, 1-4][1, -7, -5, -3](a+1)[1, 25, 0, 75](a2)(a3)[1-1, 25-3, 0-5, 75-7][0, 22, -5, 68]

代わりに(上記と同じ入力行列を使用して)折りたたみオプションbottomright-to-topleftを使用して、結果として次を出力します。

[[-74,  2,  1,  7],
 [  0,  7,  6],
 [-24,  1],
 [  1]]

以下のフォールディング減算を使用します。

[[1-75,  3-1,  5-4,    7],
 [ 0-0,  8-1,    6],
 [1-25,    1],
 [   1]]

チャレンジルール:

  • 折り畳みオプションには、[A-Za-z]の範囲の8つの異なる文字または異なる数字を使用できます。数字またははおそらく最も一般的なオプションですが、スマートな計算のために範囲内で異なる数字を使用する場合は、お気軽にそうしてください。回答で使用した折りたたみオプションを明記してください。[99,99][1..8][0..7]
  • 入力行列は常に正方NxN行列になるため、長方形のNxM行列を処理する必要はありません。また、空または1x1のマトリックスは折り畳みできないため、は常に少なくとも2になります。N
  • マトリクスの入力は常に範囲内の負でない数を含むことになる(出力中の数字は、したがって、範囲内であろう)。[0,999][999,999]
  • (反)対角線の折り畳みまたは奇数次元の垂直/水平の折り畳みでは、中央の「レイヤー」は変更されません。
  • I / Oは柔軟です。整数の2D配列/リストにすることができます。スペースと改行で区切られた文字列として返すか、印刷できます。入力行列を変更し、消えるべきであることを示すためnullに、消えるべき数字または[-999, 999]範囲外の数字を置き換えることができます。などなど

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • デフォルトのI / Oルールを使用した回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッド、適切なパラメーターおよび戻り値型、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンク(TIOなど)を追加してください。
  • また、回答の説明を追加することを強くお勧めします。

テストケース:

入力行列1:

Input-matrix (for the following eight test cases):
[[ 1, 3, 5, 7],
 [ 0, 8, 6, 4],
 [ 1, 1, 1, 1],
 [ 1,25, 0,75]]

Input-folding option: left-to-right
Output: [[2,6],[-2,4],[0,0],[-25,74]]

Input-folding option: right-to-left
Output: [[-6,-2],[-4,2],[0,0],[-74,25]]

Input-folding option: top-to-bottom
Output: [[1,-7,-5,-3],[0,22,-5,68]]

Input-folding option: bottom-to-top
Output: [[0,-22,5,-68],[-1,7,5,3]]

Input-folding option: topleft-to-bottomright
Output: [[7],[6,-1],[1,-7,-2],[1,24,0,74]]

Input-folding option: topright-to-bottomleft
Output: [[1],[-3,8],[-4,-5,1],[-6,21,-1,75]]

Input-folding option: bottomleft-to-topright
Output: [[1,3,4,6],[8,5,-21],[1,1],[75]]

Input-folding option: bottomright-to-topleft
Output: [[-74,2,1,7],[0,7,6],[-24,1],[1]]

入力行列2:

Input-matrix (for the following eight test cases):
[[17, 4, 3],
 [ 8, 1,11],
 [11, 9, 7]]

Input-folding option: left-to-right
Output: [[4,-14],[1,3],[9,-4]]

Input-folding option: right-to-left
Output: [[14,4],[-3,1],[4,9]]

Input-folding option: top-to-bottom
Output: [[8,1,11],[-6,5,4]]

Input-folding option: bottom-to-top
Output: [[6,-5,-4],[8,1,11]]

Input-folding option: topleft-to-bottomright
Output: [[3],[1,7],[11,1,-10]]

Input-folding option: topright-to-bottomleft
Output: [[17],[4,1],[8,-2,7]]

Input-folding option: bottomleft-to-topright
Output: [[17,-4,-8],[1,2],[7]]

Input-folding option: bottomright-to-topleft
Output: [[10,-7,3],[-1,1],[11]]

折りたたみオプションの順序は重要ですか?
期限切れデータ

また、可能なすべてのフォールドの8xNxNマトリックスを出力することはできますか?
期限切れデータ

このテストは、入力折り畳みオプションを下から上に出力するサンプルではありません:[[-1,7,5,3]、[0、-22,5、-68]]
OrangeCherries

マトリックス2の場合、17-11は4ではなく6ですか?
OrangeCherries

@ExpiredDataルールで指定されているようA-Za-zに、範囲内の任意の文字または整数を使用できる[-999,999]ため、順序は関係ありません。申し訳ありませんが、入力に基づいて正しいフォールドを出力する必要があるため、8つすべてを出力することはできません。
ケビンクルーイッセン

回答:


5

オクターブ256 248 244 248バイト

m=d=x=@(a,b=1)rot90(a,b)
y=@(a,b=2)flip(a,b)
z=@(a,b=1)tril(a+1e3,-1)+a-x(y(tril(a)))+b*diag(diag(a))
f=@(a,b){m=((a-y(a))(:,1:(d=size(a,2)/2))),-y(m),m=y(x((a=x(a))-y(a)))(d+1:end,:),y(m,1),-y(z(a,-1)),x(z(x(a,2)),2),z(a=x(a,3)),x(z(x(a,2)),2)}{b}

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

ルイスメンドーのおかげで-2バイト(そして片付けが少し)

TBの修正により+2バイト

1から8までのbの値に対する1インデックス付き操作:

R-L
L-R
B-T
T-B
BR-TL
TR-BL
BL-TR
TL-BR

これは私に頭痛を与えた、私は後で適切にゴルフします


提案rows(a)の代わりにsize(a,2)
ceilingcat

5

ゼリー 39  34 バイト

2つの「機能」のいくつかを組み合わせることで、さらにゴルフが可能になる可能性があります。
...うん:Nick- 5に感謝します!

ṃ“Z“Ṛ“U“ “ŒDṙL ZZṚ”ŒḄFḲj“ŒH_Ṛ}¥/”v

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

整数(命令)および数値リストのリスト(マトリックス)を受け入れるダイアディックリンク。

[99,99]

           Instruction  |  integer
------------------------+---------
         left-to-right  |     4
         right-to-left  |    14
         top-to-bottom  |     9
         bottom-to-top  |    39
topleft-to-bottomright  |    65
topright-to-bottomleft  |    15
bottomleft-to-topright  |    10
bottomright-to-topleft  |     0

どうやって?

リンクは、入力としてMを使用して評価されるJellyコードを作成します...

ṃ“Z“Ṛ“U“ “ŒDṙL ZZṚ”ŒḄFḲj“ŒH_Ṛ}¥/”v - Link: integer, I; matrix, M
 “Z“Ṛ“U“ “ŒDṙL ZZṚ”                - list of lists of characters = ["Z", "Ṛ", "U", " ", "ŒDṙL ZZṚ"]
ṃ                                  - base decompress (I) using those lists as the digits
                                   -  ...i.e. convert to base 5 and then convert the digits:
                                   -          [1,2,3,4,0] -> ["Z", "Ṛ", "U", " ", "ŒDṙL ZZṚ"]
                   ŒḄ              - bounce
                                   -  ...e.g. [a, b, c] -> [a, b, c, b, a]
                     F             - flatten to a list of characters
                      Ḳ            - split at spaces
                       j           - join with:
                        “ŒH_Ṛ}¥/”  -   list of characters = "ŒH_Ṛ}¥/"
                                 v - evaluate as Jelly code with an input of M

8つのオプションはそれぞれ次のとおりです。

left-to-right           (4): ŒH_Ṛ}¥/
right-to-left          (14): ṚŒH_Ṛ}¥/Ṛ
top-to-bottom           (9): ZŒH_Ṛ}¥/Z
bottom-to-top          (39): ZṚŒH_Ṛ}¥/ṚZ
topleft-to-bottomright (65): ṚUŒDṙLŒH_Ṛ}¥/ZZṚUṚ
topright-to-bottomleft (15): UŒDṙLŒH_Ṛ}¥/ZZṚU
bottomleft-to-topright (10): ṚŒDṙLŒH_Ṛ}¥/ZZṚṚ
bottomright-to-topleft  (0): ŒDṙLŒH_Ṛ}¥/ZZṚ

これらの各(除く04)に変換を適用するMいくつかの使用Z(転置)を、(逆)、及びU(各逆)。次に、2つの関数のいずれか(以下を参照)、セットアップ変換の逆(ある場合)をコードの逆で実装します。

2つの内部関数は次のとおりです。

ŒH_Ṛ}¥/ - Function A: Fold bottom-to-top: matrix, M
ŒH       - split M into two equal lists of rows (first half bigger by 1 if need be)
      / - reduce by:
     ¥  - last two links as a dyad:
    }   -  using the right argument (i.e. second half):
   Ṛ    -    reverse
  _     -  subtract

ŒDṙLŒH_Ṛ}¥/ZZṚ - Function B: Fold topright-to-bottomleft: matrix, M
ŒD             - diagonals of M
  ṙ            - rotate left by:
   L           -   length of M (puts them in order from bottom left most)
    ŒH_Ṛ}¥/    - same action as calling Function A on the diagonals
           Z   - transpose
            Z  - transpose
             Ṛ - reverse

1
ああ、すこし柔軟な入力オプションを誰かが利用するのではないかと思っていました!便利なJellyコードへのベース変換の値を使用して、目的の折り畳みを評価する方法をご覧ください。:)
ケビンクルーッセン

私の答えからいくつかのコードを使用し、両方に共通のコードを再利用します。34バイトです:tio.run
Nick Kennedy

16ビット整数が許可された場合、さらに短くなる可能性があります
Nick Kennedy

16ビット整数をどのフォールドを選択するためのパラメーターとして使用する競合しない23バイトの答え:tio.run
ニックケネディ

@NickKennedy-ありがとう。私はスプリットとジョインが好きです!説明を完全に変更するには、後で戻る必要があります。
ジョナサンアラン

3

JavaScript(ES6)、 149 ... 133  128バイト

(matrix)(d)0d7NaN

0=1=2=3=4=5=6=7=

m=>d=>m.map((r,y)=>r.map((v,x)=>v-=(w=m.length+~y)-(p=[x+x-y,y,x,q=w+y-x][d&3])&&[r[q],m[w][x],m[q][w],m[x][y]][d>3^p>w?d&3:m]))

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

コメント済み

m => d =>                   // m[] = matrix; d = direction
  m.map((r, y) =>           // for each row r[] at position y in m[]:
    r.map((v, x) =>         //   for each value v at position x in r[]:
      v -=                  //     subtract from v:
        (                   //       define w as:
          w = m.length + ~y //         the width of input matrix - y - 1
        ) - (               //       and compare it with
          p = [             //       p defined as:
            x + x - y,      //         2 * x - y for vertical folding
            y,              //         y for horizontal folding
            x,              //         x for diagonal folding
            q = w + y - x   //         q = w + y - x for anti-diagonal folding
          ][d & 3]          //       using d MOD 4
        ) &&                //       if p is equal to w, leave v unchanged
        [                   //       otherwise, subtract:
          r[q],             //         r[q] for vertical folding
          m[w][x],          //         m[w][x] for horizontal folding
          m[q][w],          //         m[q][w] for diagonal folding
          m[x][y]           //         m[x][y] for anti-diagonal folding
        ][                  //       provided that we're located in the target area:
          d > 3 ^           //         test p < w if d > 3 
          p > w ? d & 3     //         or p > w if d <= 3
                : m         //         and yield either d MOD 4 or m[]
        ]                   //       (when using m[], we subtract 'undefined' from v,
                            //       which sets it to NaN instead)
    )                       //   end of inner map()
  )                         // end of outer map()

3

ゼリー71 34バイト

ḃ2ŒḄ,UZṚŒDṙLƊŒH_Ṛ}¥/$ZZṚƊṚZ8ƭ$ị@¥ƒ

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

テストスイート

完全なプログラム。右の引数は行列です。左引数はフォールドのタイプです:

44 = L-R
40 = R-L
36 = T-B
32 = B-T
50 = TL-BR
34 = TR-BR
54 = BL-TR
38 = BR-TL

入力として5ビット全単射バイナリを使用するように書き直されました。上記のプログラムは、複数のフォールドに対して繰り返し動作しないことに注意してください。


1

オクターブ482バイト、459バイト

折りたたみ方向を決定するための入力は次のとおりです
。1)左から右
2)下から上
3)右から左
4)上から下
5)trからbl
6)brからtl
7)blからtr
8)tlからbr
各呼び出しすべてを生成するのではなく、指定した折り畳みのみを生成します(おそらく、バイト数が少なくなります)。最大の問題は、この場合、フォールド1-4と5-8を同じループに入れる方法がわからないことです。しかし、少なくともオクターブには見栄えの良い行列があります。

    function[m]=f(n,o)
    k=length(n);m=NaN(k);if(o<5)
    if(mod(o,2)>0)n=n'end
    q=[0,0,k+1,k+1](o)
    for x=1:ceil(k/2)if(x*2>k)m(x,:)=n(x,:)else
    for a=1:k
    m(abs(q-x),a)=n(abs(q-x),a)-n(abs(q-(k+1-x)),a)end
    end
    end
    if(mod(o,2)>0)m=flipud(m')end
    else
    if(mod(o,2)>0)n=flip(n)end
    q=[0,0,k+1,k+1](o-4)
    for x=1:k
    for a=1:k+1-x
    if(a==k+1-x)m(x,a)=n(x,a)else
    m(abs(q-x),abs(q-a))=n(abs(q-x),abs(q-a))-n(abs(q-(k+1-a)),abs(q-(k+1-x)))end
    end
    end
    end
    if(mod(o,2)>0)m=flip(m)end
    end

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

出力の抑制にはバイトがかかるため、returnステートメント(ans =)以外のすべてを無視します。


「終了」の書き込みで何バイトを失いましたか?
期限切れデータ

終わりを書く必要はありませんか?
OrangeCherries

if / elseとforステートメントの束ではないように再構築しない限り、あなたはそれを行います
Expired Data

あなたのコードを見てうわー、私はあなたがmatlabでできることさえ知らなかったたくさんのものがあります。
OrangeCherries

オクターブtbhについてはあまり知りませんが、おそらく50〜100バイトをかなり簡単に保存できます
Expired Data

1

78 77バイト

F⁴«UMηE⮌η§μλ¿⁼ιθUMηEκ⎇‹⊕⊗νLη⁻μ§⮌κν⎇›⊕⊗νLηωμ¿⁼ι﹪θ⁴UMηEκ⎇‹λν⁻짧ηνλ⎇›λνωμ»Eη⪫ι,

オンラインでお試しください!リンクは、コードの詳細バージョンです。次の折りたたみオプションを使用します。

0   top-to-bottom
1   left-to-right
2   bottom-to-top
3   right-to-left
4   bottomright-to-topleft
5   topright-to-bottomleft
6   topleft-to-bottomright
7   bottomleft-to-topright

折り畳まれた値は空の文字列に置き換えられます。説明:

F⁴«≔UMηE⮌η§μλ

アレイを4回回転させます。

¿⁼ιθUMηEκ⎇‹⊕⊗νLη⁻μ§⮌κν⎇›⊕⊗νLηωμ

必要に応じて、アレイを水平方向に折りたたみます。

¿⁼ι﹪θ⁴UMηEκ⎇‹λν⁻짧ηνλ⎇›λνωμ

必要に応じて、配列を斜めに折ります。

»Eη⪫ι,

配列が元の方向に戻されたら、配列を出力します。

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