从角落重建矩形阵列


30

我曾经有一个美丽的矩形阵列。这是非常对称的,但是不幸的是它已经崩溃了,现在我只有左上角。您的任务将是重建原始阵列。

您的程序将收到一个二维整数数组。为了便于解析,您可以假定它们都在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是
Pavel

2
@tfbninja WS⟦ι⟧‖M→↓也许?5个字节读取输入,4个字节反映输入。
尼尔

4
我99%的肯定有一个用(或类似字符)进行操作的lang 只是不记得是哪个:c
Rod

Answers:


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,因为Proton。它并不短。

质子,36字节

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

在线尝试!

应该(a=>zip(*(a+a[by-1])))*2是24字节,但是zip功能已完全损坏。基本上,将其镜像并压缩,然后执行两次(可以将一个函数乘以一个正整数来多次应用该函数)。




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默认的regex(反向)为(?m:^.*$),通常匹配字符串的每一行。但是,我们激活了singleline选项s,该选项也使.换行符匹配,因此,此默认正则表达式实际上与整个字符串匹配。

结果将在程序结束时自动打印,从而为我们提供输出的后半部分。


这看起来与我所知的任何正则表达式都不一样:P
Pavel

@Pavel因为Retina不仅仅是正则表达式。:)
暴民埃里克(Erik the Outgolfer)

@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先生指出,字符串数组可以算作2D数组,而Pavel可以确认。



为了便于解析,您可以假设它们都在1到9之间 –因此,我认为这是有效的。我想等待Pavel的确认
Xcoder先生18年

@ Mr.Xcoder是我最初使用的,然后将TIO 2D数组作为输入很奇怪...因此必须提出该标头的东西。
Magic Octopus Urn

字符串是字符数组,因此字符串列表仍然是二维数组。@ Mr.Xcoder的解决方案有效。
帕维尔

Coolio,为我工作。
魔术章鱼缸


3

MATL,5个字节

,tPv!

在线尝试!

说明:

(implicit input)
,               # do twice:
 t              # dup top of stack
 P              # flip vertically
 v              # vertically concatenate
 !              # transpose
(implicit output)



3

JavaScript(Node.js)62 55 49 46字节

A=>(j=x=>[...x,...[...x].reverse()])(A).map(j)

在线尝试!

因为Array.prototype.reverse()将数组反转到位,所以我必须先在某个地方进行浅表复制。A=>(j=x=>[...x,...x.reverse()])(A).map(j)不起作用。



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个字节

提示输入二维整数数组。

m⍪⊖m←m,⌽m←⎕

2

Stax,5个字节

:mm:m

在线运行和调试

:m表示镜像,即input.concat(reverse(input))m在这种情况下,意味着在应用...之后输出每一行。

因此,镜像行的数组,然后镜像每一行并输出。






2

红宝石,35字节

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

在线尝试!

Lambda接受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

J,11个字节

匿名默认前缀功能。

|:@(,|.)^:2

在线尝试!

|: 转置

@(…) 的结果:

, 争论之后

|. 相反

^:2 所有这一切都做了两次


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)114111字节

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个字节(易于解析)

  • 感谢Kevin Cruijssen建议只允许输入一位数字。保存了两个字节。
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;)
凯文·克鲁伊森

不符合规格;打印数组,而不是返回数组。

为便于解析,您可能会认为它们都在1到9之间。 ”,因此您可以在printf("%d"-1处再删除逗号。
凯文·克鲁伊森

@Rogem我要说,打印数组属于可接受的I / O。
乔纳森·弗雷希

1
@KevinCruijssen非常感谢;通过轻松的解析,我设法剃掉了另一个字节。
乔纳森·弗雷希

2

木炭,5字节

θ‖C→↓

在线尝试!

多亏了纯ASCII码,以获得更好的输入格式。


我想知道这种输入格式是否有效,因为我担心木炭无法处理其他输入。如果不是,我将很乐意删除此答案。
暴民埃里克

这是有效的I / O。
帕维尔

@Pavel我只是想知道,因为您曾说过“您的程序将接收一个二维整数数组”,而一个字符串是一维数组(不,外层[]不完全将其设为2D)。
暴民埃里克

@ASCII纯木炭真的需要更好的I / O方法...
Neil

@Neil他没有在这里被ping通,但我通过TNB对其进行了ping操作。:)
暴民埃里克(Erik the Outgolfer)

2

加++,30字节

D,f,@,bU€{r}B]{r}
D,r,@,dbR+

在线尝试!

页脚仅将嵌套数组转换为问题中的格式。定义一个函数f,该函数需要一个矩阵(嵌套数组)作为参数。


1

朱0.655个 49字节

~i=i:-1:1
!x=[x x[:,~end];x[~end,:] x[~end,~end]]

在线尝试!

~(i)是从i下到下创建切片的功能1
所以~end给切片end:-1:1

!(x) 是用于重建数组的函数。


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.