角から長方形の配列を再構築する


30

私はかつて美しい長方形の配列を持っていました。それは非常に対称的でしたが、残念ながらバラバラになり、今では左上隅しかありません。あなたの仕事は、元のアレイを再構築することです。

プログラムは整数の2次元配列を受け取ります。解析を簡単にするために、それらはすべて1〜9であると想定できます。タスクは、配列の列、行、およびその両方を逆にし、結果の角を縫い合わせて、結果の配列を返すことです。

配列の次元は少なくとも1x1であると仮定できます。

テストケース:

Input:
1 2 3
4 5 6

Output:
1 2 3 3 2 1
4 5 6 6 5 4
4 5 6 6 5 4
1 2 3 3 2 1

Input:
1

Output:
1 1
1 1

Input:
9
9
9

Output:
9 9
9 9
9 9
9 9
9 9
9 9

これは、最少バイトが勝ちます!


1
木炭はこれを10歳未満で行うことができると
確信します-FantaC

1
@tbfninja chat.stackexchange.com/transcript/message/43184083#43184083しかし、別の入力形式では短くなる可能性があります。
パベル

@MagicOctopusUrnはい
パベル

2
たぶん@tfbninja WS⟦ι⟧‖M→↓?入力を読み取るための5バイトと、それを反映するための4バイト。
ニール

4
私はこれを行うLANGがあることを99%確信しているだけで思い出すことができない(またはいくつかの類似した文字)が1:C
ロッド

回答:


1

プロトン、29バイト

a=>[b+b[by-1]for b:a+a[by-1]]

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

ただし、他にも興味深いアプローチがいくつかあります。

プロトン、29バイト

a=>map(g,(g=x=>x+x[by-1])(a))

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

gプロトンのため、ミラーサブ関数をインラインで定義できます。しかし、短くはありません。

プロトン、36バイト

(a=>[x[0]for x:zip(*(a+a[by-1]))])*2

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

これ(a=>zip(*(a+a[by-1])))*2は24バイトでなければなりませんが、zip関数は完全に壊れています。基本的には、ミラーリングしてzipし、それを2回実行します(関数に正の整数を掛けて、関数を複数回適用できます)。




5

Python 3、38バイト

lambda a:[b+b[::-1]for b in a+a[::-1]]

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

リストのリストを取り、リストのリストを返します。

説明:

lambda a:                              # anonymous lambda function
                   for b in a+a[::-1]  # for each row in the array and the upside-down array
          b+b[::-1]                    # the row with its reverse appended
         [                           ] # return in a list


5

網膜、13バイト

\%`$
$^$`
Vs`

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

説明

\%`$
$^$`

各行(%)で、行の終わり()に一致し、行全体$$^)の逆()を挿入し$`、結果を後続の改行(\)で印刷します。これにより、垂直軸に沿って反射が行われ、出力の前半が印刷されます。

Vs`

これは、ストリング全体を単に反転させます。これは180°の回転に相当します。この例では(水平対称性により)水平軸に沿った反射に相当します。このように動作するのは、Vの(逆の)デフォルトの正規表現がで(?m:^.*$)、通常は文字列の各行に一致するということです。ただし、singlelineオプションをアクティブsにする.と、改行も一致するため、このデフォルトの正規表現は実際に文字列全体と一致します。

この結果はプログラムの最後に自動的に印刷され、出力の後半を提供します。


これは私が知っている正規表現のようには見えません:P
Pavel

@Pavel Retinaは単なる正規表現ではないからです。:)
エリック・ザ・アウトゴルファー

@Pavel実際の正規表現であるコードの唯一の部分は$、最初の行にあります。;)後で説明を追加します。
マーティンエンダー

5

05AB1E、2バイト

∞∊

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


   # Input:Array of String | ['12','34']
---#-----------------------+------------------------------------------
∞  # Mirror horizontally.  | [12,34]       -> [1221,3443]
 ∊ # Mirror vertically.    | [1221,3443]   -> [1221\n3443\n3443\n1221]

以下のためのクレジット氏Xcoderは、文字列の配列は、2次元アレイとしてカウントしてもよいことを指摘パベルそれを確認するため。



解析を簡単にするために、それらはすべて1から9の間であると想定することができます。したがって、これは有効だと思います。パベルの確認を待って、私は推測する
氏Xcoder

@ Mr.Xcoderは当初私が持っていたものでしたが、入力としてのTIO 2D配列は奇妙でした。
魔法のタコ

文字列は文字の配列であるため、文字列のリストは2次元配列のままです。@ Mr.Xcoderのソリューションは有効です。
パベル

Coolio、私のために働いています。
魔法のタコ






3

awk、88バイト

{s="";for(i=NF;i>0;i--)s=" "$i s" "$i;a[FNR]=s;print s}END{for(i=NR;i>0;i--)print a[i]}

3
PPCGへようこそ!素敵な最初の答え:)
HyperNeutrino

2

三角度、31バイト

...)...
..IEM..
.DRs+}.
DRs+...

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

説明

パディングを構成する文字を削除すると、プログラムは次のようになります。

)IEMDRs+}DRs+ – Full program. Takes a matrix as a 2D list from STDIN.
)             – Push a 0 onto the stack.
 I            – Take the input at that index.
  E           – Evaluate it.
   M    }     – For each row...
    DR        – Duplicate and replace the second copy by its reverse.
      s+      – Swap and append.
         DR   – Duplicate the result and replace the second copy by its reverse.
           s+ – Swap and append.


2

APL + WIN、11バイト

整数の2D配列の入力を求めます。

m⍪⊖m←m,⌽m←⎕






2

ルビー、35バイト

->a{r=->b{b+b.reverse}
r[a].map &r}

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

2D配列を受け入れ、2D配列を返すラムダ。それは簡単ですが、とにかくここには未使用のバージョンがあります:

->a{
  r=->b{ b+b.reverse } # r is a lambda that returns the argument and its reverse
  r[a].map &r          # Add the array's reverse, then add each row's reverse
}

2

ジャワ8、140の 131バイト

m->{String r="";for(int a=m.length,b=m[0].length,i=a+a,j;i-->0;r+="\n")for(j=b+b;j-->0;)r+=m[i<a?i:a+a+~i][j<b?j:b+b+~j];return r;}

説明:

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

m->{                      // Method with integer-matrix parameter and String return-type
  String r="";            //  Result-String, starting empty
  for(int a=m.length,     //  Amount of rows of the input-matrix
          b=m[0].length,  //  Amount of columns of the input-matrix
          i=a+a,j;        //  Index integers
      i-->0;              //  Loop over double the rows
      r+="\n")            //    After every iteration: append a new-line to the result
     for(j=b+b;j-->0;)    //   Inner loop over double the columns
       r+=                //    Append the result with:
          m[i<a?          //     If `i` is smaller than the amount of rows
             i            //      Use `i` as index in the input-matrix
            :             //     Else:
             a+a+~i]      //      Use `a+a+i-1` as index instead
           [j<b?          //     If `j` is smaller than the amount of columns
             j            //      Use `j` as index in the input-matrix
            :             //     Else:
             b+b+~j];     //      Use `b+b+j-1` as index instead
  return r;}              //  Return the result-String


2

SNOBOL4(CSNOBOL4)119 113バイト

	T =TABLE()
I	X =X + 1
	I =INPUT	:F(D)
	OUTPUT =T<X> =I REVERSE(I)	:(I)
D	X =X - 1
	OUTPUT =GT(X) T<X>	:S(D)
END	

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

入力をスペースなしのSTDINの文字列として受け取ります。これは、数字が1-9そうでなければ失敗するためにのみ機能します。


なぜ人々がこの言語をもう使わないのかがわかります。これはとても奇妙です。
パベル

1
@Pavel SNOBOLは、本当に使いにくい言語です。これは、より現代的なCの実装であり、次のような追加の組み込み関数がありREVERSEます。私が知る限りでは、元のものは整数演算のみをサポートしていました。
ジュゼッペ

2

C(gcc)114 111バイト

j,i;f(A,w,h)int*A;{for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)printf("%d,",A[(i<h?i:h+h+~i)*w+(j<w?j:w+w+~j)]);}

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

C(gcc)、109バイト(解析の容易さを損なう)

  • 1桁の入力整数のみを許可することを提案してくれたKevin Cruijssenに感謝します。2バイト節約しました。
j,i;f(A,w,h)int*A;{for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)putchar(A[(i<h?i:h+h+~i)*w+(j<w?j:w+w+~j)]+48);}

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


ループを反転することにより、3バイトを節約できます。for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)
ケビンCruijssen

仕様を満たしていません。返すのではなく、配列を出力します。

解析を簡単にするために、それらはすべて1から9の間であると想定することができます」のでprintf("%d"、追加の-1バイトのコンマを削除できます。
ケビンクルーッセン

@Rogem配列の印刷は受け入れられたI / Oに該当すると言います。
ジョナサン

1
@KevinCruijssenどうもありがとう。解析の容易さを使用して、別のバイトを削ることができました。
ジョナサンフレッチ

2

木炭、5バイト

θ‖C→↓

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

より良い入力フォーマットを提供してくれたASCIIのみに感謝します。


Charcoalは入力を処理できないのではないかと思うので、この入力形式が有効かどうかは疑問です。そうでない場合は、この回答を喜んで削除します。
エリックアウトゴルファー

これは有効なI / Oです。
パベル

@Pavel「あなたのプログラムは整数の2次元配列を受け取る」と言っていたので、文字列は1次元です(そして、外側[]は正確に2Dにしないので)。
エリックアウトゴルファー

@ASCIIのみの炭は本当に優れたI / Oメソッドを必要としています...
ニール

@Neil彼はここではpingを受信しませんでしたが、TNBで彼にpingを送信しました。:)
エリック・ザ・アウトゴルファー



1

V、12バイト

yGæGPÎy$æ_|P

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

説明:

yG              " Yank every line
  æG            " Reverse the order of the lines
    P           " Paste what we yanked
     Î          " On every line:
      y$        "   Yank the whole line
        æ_      "   Reverse the whole line
          |     "   Move to the beginning of the line
           P    "   Paste what we yanked
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.