Reconstruir una matriz rectangular desde una esquina

30

Una vez tuve una hermosa matriz rectangular. Era muy simétrico, pero desafortunadamente se ha desmoronado y ahora solo tengo la esquina superior izquierda. Su tarea será reconstruir la matriz original.

Su programa recibirá una matriz bidimensional de enteros. Para facilitar el análisis, puede suponer que todos están entre 1 y 9. Su tarea es invertir las columnas de la matriz, sus filas y ambas, unir las esquinas resultantes y devolver la matriz resultante.

Puede suponer que las dimensiones de la matriz serán al menos 1x1.

Casos de prueba:

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

Este es el , ¡la menor cantidad de bytes gana!

Pavel
fuente
1
Apuesto a que el carbón puede hacer esto en menos de 10 años
FantaC
1
@tbfninja chat.stackexchange.com/transcript/message/43184083#43184083 pero podría ser más corto con un formato de entrada diferente.
Pavel
@MagicOctopusUrn sí
Pavel
2
@tfbninja WS⟦ι⟧‖M→↓tal vez? 5 bytes para leer la entrada y 4 para reflejarla.
Neil
44
Estoy 99% seguro de que hay un idioma que hace esto con (o algún personaje similar) simplemente no puedo recordar cuál: c
Rod

Respuestas:

1

Protón , 29 bytes

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

Pruébalo en línea!

Sin embargo, hay algunos otros enfoques interesantes:

Protón , 29 bytes

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

Pruébalo en línea!

Puede definir la subfunción espejo gen línea, porque Protón. Sin embargo, no es más corto.

Protón , 36 bytes

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

Pruébalo en línea!

Esto debería ser de (a=>zip(*(a+a[by-1])))*224 bytes, pero la función zip está completamente rota. Básicamente, lo refleja y comprime, y luego lo hace dos veces (puede multiplicar una función por un entero positivo para aplicar la función varias veces).

Hiperneutrino
fuente
19

Lona , 1 byte

Pruébalo aquí!

Salidas como una cadena multilínea

dzaima
fuente
2
Bien, @Rod lo llamó ¡ja! ¿Es este tu idioma también Dzaima?
Urna de pulpo mágico
Maldición ... debería haber recordado ...
totalmente humano
@MagicOctopusUrn Sí, IIRC está destinado a ser básicamente SOGL II: ¿Boogaloo eléctrico?
Solo ASCII
5

Python 3, 38 bytes

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

Pruébalo en línea!

Toma una lista de listas y devuelve una lista de listas.

Explicación:

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
pizzapants184
fuente
5

Retina , 13 bytes

\%`$
$^$`
Vs`

Pruébalo en línea!

Explicación

\%`$
$^$`

En cada línea ( %), haga coincidir el final de la línea ( $) e inserte el reverso ( $^) de toda la línea ( $`) e imprima el resultado con un salto de línea final ( \). Esto hace la reflexión a lo largo del eje vertical e imprime la primera mitad de la salida.

Vs`

Esto simplemente invierte toda la cadena, que es equivalente a una rotación de 180 °, o en nuestro caso (debido a la simetría horizontal) una reflexión a lo largo del eje horizontal. De esta manera, esto funciona es que Vla expresión regular predeterminada (inversa) es (?m:^.*$), que normalmente coincide con cada línea de la cadena. Sin embargo, activamos la opción de línea única s, que también hace que los saltos de .línea coincidan y, por lo tanto, esta expresión regular predeterminada coincide realmente con toda la cadena.

El resultado de esto se imprime automáticamente al final del programa, dándonos la segunda mitad de la salida.

Martin Ender
fuente
Esto no se parece a ningún sabor regex que conozca: P
Pavel
@Pavel Porque Retina no es solo expresión regular. :)
Erik the Outgolfer
@Pavel, la única parte de ese código que es una expresión regular real es la $de la primera línea. ;) Agregaré una explicación más tarde.
Martin Ender
5

05AB1E , 2 bytes

∞∊

Pruébalo en línea!


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

Crédito para el Sr. Xcoder señalando que las matrices de cadenas pueden contar como matrices 2D y Pavel por confirmarlo.

Urna de pulpo mágico
fuente
... 2 bytes
Sr. Xcoder
Para facilitar el análisis, puede suponer que todos están entre 1 y 9 , por lo que creo que esto es válido. Esperando la confirmación de Pavel, supongo
Sr. Xcoder
@ Mr.Xcoder que era lo que tenía inicialmente, luego los arreglos TIO 2D como entrada eran extraños ... así que tuve que pensar en ese encabezado.
Urna de pulpo mágico
Una cadena es una matriz de caracteres, por lo que una lista de cadenas sigue siendo una matriz 2d. La solución de @ Mr.Xcoder es válida.
Pavel
Coolio, funciona para mí.
Urna mágica de pulpo
3

MATL , 5 bytes

,tPv!

Pruébalo en línea!

Explicación:

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

Giuseppe
fuente
3

JavaScript (Node.js) , 62 55 49 46 bytes

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

Pruébalo en línea!

Como Array.prototype.reverse()invierte la matriz en su lugar, primero tengo que hacer una copia superficial en algún lugar. A=>(j=x=>[...x,...x.reverse()])(A).map(j)No funciona.

Shieru Asakoto
fuente
3

J , 12 bytes

(,|.)@,.|."1

Pruébalo en línea!

Explicación

         |."1 - reverse each row
       ,.     - and stitch them to the input
 (   )@       - and 
  ,|.         - append the rows in reversed order        
Galen Ivanov
fuente
3

awk, 88 bytes

{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]}
mmuntag
fuente
3
Bienvenido a PPCG! Buena primera respuesta :)
HyperNeutrino
2

Triangularidad , 31 bytes.

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

Pruébalo en línea!

Explicación

Al eliminar los caracteres que componen el relleno, esto es lo que hace el programa:

)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.
Sr. Xcoder
fuente
2

APL + WIN, 11 bytes

Solicita una matriz 2D de enteros.

m⍪⊖m←m,⌽m←⎕
Graham
fuente
2

Stax , 5 bytes

:mm:m

Ejecútelo y depúrelo en línea

:msignifica espejo, que es input.concat(reverse(input)). m, en este contexto significa salida de cada línea después de aplicar ...

Entonces, refleje la matriz de filas y luego refleje cada fila y salida.

recursivo
fuente
2

Japt , 6 bytes

mê1 ê1

Pruébalo aquí


Explicación

           :Implicit input of 2D array
m          :Map
 ê1        :  Mirror sub array
    ê1     :Mirror main array
Lanudo
fuente
2

Ruby , 35 bytes

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

Pruébalo en línea!

Una lambda que acepta una matriz 2D y devuelve una matriz 2D. Es sencillo, pero de todos modos aquí está la versión sin golf:

->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
}
benj2240
fuente
2

Java 8, 140 131 bytes

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;}

Explicación:

Pruébalo en línea.

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
Kevin Cruijssen
fuente
2

J , 11 bytes

Función de prefijo tácito anónimo.

|:@(,|.)^:2

Pruébalo en línea!

|: transponer

@(…) el resultado de:

, el argumento seguido por

|. su reverso

^:2 y todo esto hecho dos veces

Adán
fuente
2

SNOBOL4 (CSNOBOL4) , 119 113 bytes

	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	

Pruébalo en línea!

Toma la entrada como cadenas en STDIN, sin espacios. Esto solo funciona porque los dígitos son 1-9y fallarían de lo contrario.

Giuseppe
fuente
Puedo ver por qué la gente ya no usa este lenguaje. Esto es tan extraño.
Pavel
1
@Pavel SNOBOL es realmente un lenguaje terrible para trabajar. Esta es una implementación de C más moderna que tiene funciones incorporadas adicionales como REVERSE; el original solo admite aritmética de enteros también, por lo que puedo decir.
Giuseppe
2

C (gcc) , 114 111 bytes

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)]);}

Pruébalo en línea!

C (gcc) , 109 bytes (abusando de la facilidad de análisis)

  • Gracias a Kevin Cruijssen por sugerir que solo se permitan enteros de entrada de un dígito; Guardado dos bytes.
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);}

Pruébalo en línea!

Jonathan Frech
fuente
Puede guardar 3 bytes invirtiendo los bucles. for(i=h+h;i-->0;puts(""))for(j=w+w;j-->0;)
Kevin Cruijssen
No cumple con las especificaciones; imprime la matriz, en lugar de devolverla.
" Para facilitar el análisis, puede suponer que todos están entre 1 y 9. ", por lo que puede eliminar la coma en el printf("%d"byte -1 adicional.
Kevin Cruijssen
@Rogem Yo diría que la impresión de la matriz cae dentro de las E / S aceptadas.
Jonathan Frech
1
@KevinCruijssen Muchas gracias; Utilizando la facilidad de análisis, logré depilar otro byte.
Jonathan Frech
2

Carbón de leña , 5 bytes

θ‖C→↓

Pruébalo en línea!

Gracias a ASCII-only por un mejor formato de entrada.

Erik el Outgolfer
fuente
Me pregunto si este formato de entrada es válido, ya que me temo que Charcoal no puede manejar la entrada de otra manera. Si no es así, eliminaré esta respuesta.
Erik the Outgolfer
Esta es una E / S válida.
Pavel
@Pavel Me acabo de preguntar porque dijiste que "Tu programa recibirá una matriz de enteros bidimensional", mientras que una cadena es unidimensional (y no, el exterior []no lo convierte exactamente en 2D).
Erik the Outgolfer
@ El carbón solo ASCII realmente necesita un mejor método de E / S ...
Neil
@Neil No lo pincharon aquí, pero lo puse sobre TNB. :)
Erik the Outgolfer
2

Añadir ++ , 30 bytes

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

Pruébalo en línea!

El pie de página simplemente transforma la matriz anidada en el formato de la pregunta. Define una función f, que espera una matriz (matriz anidada) como argumento.

caird coinheringaahing
fuente
1

Julia 0.6 , 55 49 bytes

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

Pruébalo en línea!

~(i)es una función para crear un corte de iabajo a 1.
Asi que~end da la rebanadaend:-1:1

!(x) es la función para hacer la reconstrucción de la matriz.

Lyndon White
fuente
1

V , 12 bytes

yGæGPÎy$æ_|P

Pruébalo en línea!

Explicación:

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
DJMcMayhem
fuente