Envuelva un regalo estacional

21

Tarea

Dado un elemento envoltorio y una matriz 3D no irregular, envuelva la matriz en la parte superior, inferior y completa. Debe manejar los datos numéricos y de caracteres, pero el contenedor y el presente tendrán el mismo tipo de datos.


Ejemplo de personaje

Para los datos de caracteres, puede elegir manejar matrices 3D de caracteres individuales o matrices 2D de cadenas:

Dada la matriz de caracteres de 2 capas, 2 filas y 4 columnas

[[["Y","o","u","r"],
  ["g","i","f","t"]],

  [["g","o","e","s"],
  ["h","e","r","e"]]]

y el carácter ".", responda la matriz de caracteres de 4 capas, 4 filas y 6 columnas

[[[".",".",".",".",".","."],
  [".",".",".",".",".","."],
  [".",".",".",".",".","."],
  [".",".",".",".",".","."]],

 [[".",".",".",".",".","."],
  [".","Y","o","u","r","."],
  [".","g","i","f","t","."],
  [".",".",".",".",".","."]],

 [[".",".",".",".",".","."],
  [".","g","o","e","s","."],
  [".","h","e","r","e","."],
  [".",".",".",".",".","."]],

 [[".",".",".",".",".","."],
  [".",".",".",".",".","."],
  [".",".",".",".",".","."],
  [".",".",".",".",".","."]]]

o dada la matriz de 2 filas y 2 columnas de cadenas de 4 caracteres

[["Your",
  "gift"],

 ["goes",
  "here"]]

y el carácter ".", responda la matriz de 4 filas y 4 columnas de cadenas de 6 caracteres

[["......",
  "......",
  "......",
  "......"],

 ["......",
  ".Your.",
  ".gift.",
  "......"],

 ["......",
  ".goes.",
  ".here.",
  "......"],

 ["......",
  "......",
  "......",
  "......"]]

Ejemplo numérico

Dada la matriz numérica de 2 capas, 2 filas y 2 columnas

[[[1,2],
  [3,4]],

 [[5,6],
  [7,8]]]`

y el número 0, responda la matriz numérica de 4 capas, 4 filas, 4 columnas

[[[0,0,0,0],
   [0,0,0,0],
   [0,0,0,0],
   [0,0,0,0]],

  [[0,0,0,0],
   [0,1,2,0],
   [0,3,4,0],
   [0,0,0,0]],

  [[0,0,0,0],
   [0,5,6,0],
   [0,7,8,0],
   [0,0,0,0]],

  [[0,0,0,0],
   [0,0,0,0],
   [0,0,0,0],
   [0,0,0,0]]]
Adán
fuente
¿Podemos suponer que la longitud de cada "elemento de regalo" para envolver es idéntica?
XavCo7
@ XavCo7 Sí, puedes.
Adám
Relacionado.
Martin Ender
Qué tipo de salida es aceptable. Necesita sea una estructura de datos de una matriz de tres d o es salida textual aceptable
Rohan Jhunjhunwala
@RohanJhunjhunwala Puede elegir libremente la representación, pero los formatos de entrada y salida deben ser los mismos.
Adám

Respuestas:

8

J , 16 15 bytes

[h"2[h"1 h=.,,[

Este es un verbo anónimo. Pruébalo en línea!

¡Gracias a Adám por 1 byte!

Explicación

[h"2[h"1 h=.,,[  Wrapper is x, present is y.
            ,    Prepend x to y
             ,   then append
              [  x.
                 This gives x y x, and the wrapper automatically spreads to form 2D slices.
         h=.     Save the above operation (not its result) to h.
    [h"1         Apply h to x and every 2D slice of the previous result.
[h"2             Apply h to x and every 1D slice of the result of that.
Zgarb
fuente
¿No podría guardar un byte conh=.,,[
Adám
4

JavaScript (ES6), 97 bytes

(a,e)=>[c=[,,...b=a[0]].fill(d=[,,...b[0]].fill(e)),...a.map(a=>[d,...a.map(a=>[e,...a,e]),d]),c]

¿Dónde aestá la matriz tridimensional y ees el contenedor? Convierte automáticamente una matriz bidimensional de cadenas en una matriz tridimensional de caracteres. Versión alternativa para cuando aes una matriz bidimensional de cadenas y ees un carácter y desea devolver una matriz bidimensional de cadenas:

(a,e)=>[c=[,,...a[0]].fill(d=e.repeat(a[0][0].length+2)),...a.map(b=>[c,...b.map(s=>e+s+e),d]),c]
Neil
fuente
Parece que esto falla en numérico e.
Adám
@ Adám Ah, lo siento, puedo haber entendido mal la pregunta.
Neil
@ Adám La nueva versión, afortunadamente el mismo número de bytes, funciona en matrices tridimensionales de elementos arbitrarios (convertirá automáticamente cadenas en matrices de caracteres).
Neil
3

Octava, 23 27 bytes

@(a,p)padarray(a,[1 1 1],p)

matriz: a
padval:p

Se puede llamar como:

(@(a,p)padarray(a,[1 1 1],p))([1 2;3 4],40)

pruébalo (pégalo) en Octave Online

nota: la respuesta anterior asumió el padval predeterminado

rahnema1
fuente
Parece que solo acepta un único argumento (la matriz). ¿De dónde obtiene el carácter / número de envoltura?
sonríe el
por defecto el pad de funciones por 0
rahnema1
@ rahnema1 ¿Y qué si el relleno es 42 o "Z"?
Adám
Oh ... respuesta actualizada incluyendo PADVAL
rahnema1
1
+1 Me sorprende que haya una función incorporada exactamente para esto.
Adám
3

Python, 106 104 126 bytes

def w(g,c):x=len(g[0][0])+2;k=[[c*x]*(len(g[0])+2)];return k+[[c*x,*[c+"".join(str(k)for k in j)+c for j in i],c*x]for i in g]+k

Llamado como w(gift, wrapping character). Puede usar la cadena y la notación de matriz. Pruébalo en línea!

TidB
fuente
No pude entender cómo ejecutar esto en repl.it. ¿Puedes crear un enlace?
Adám
@ Adám repl.it/Eu4M/1
TidB
Gracias. Parece que falla numérico.
Adám
@ Adám Gotcha, interpreté mal (jeje) la especificación. Un poco más largo ahora, pero en realidad funciona correctamente> repl.it/Eu4M/4
TidB
Wow, ahora fuiste más allá de las especificaciones, no necesitabas manejar el caso de tipos de datos mixtos.
Adám
3

Perl 6, 86 bytes

->\a,\w{my @z=[[w xx a[0;0]+2]xx a[0]+2]xx a+2;@z[1..a;1..a[0];1..a[0;0]]=a[*;*;*];@z}

Una lambda que toma la matriz 3D y el carácter envolvente como argumentos.

  • Primero crea una matriz de salida 3D del tamaño correcto, llena con el carácter de ajuste.
  • Luego, utiliza la sintaxis de corte de matriz para asignar los valores de la matriz original a las ranuras correctas de la nueva matriz, de una sola vez.
smls
fuente
3

Dyalog APL , 31 19 13 12 bytes

Casi una transliteración (31 bytes) de la solución de @ Zgarb .

Una función anónima. El argumento izquierdo es envolvente, el argumento derecho es un regalo.

h1h2(h←⍪⍪⊣)

⊣h⍤1 h aplicado, con el argumento izquierdo de la función anónima, a las columnas de

⊣h⍤2 h aplicado, con el argumento izquierdo de la función anónima, a las filas de

h← h aplicado a las celdas principales, es decir, las capas de los argumentos de la función anónima, donde h es

el argumento izquierdo antepuso al argumento derecho

antepuesto a

el argumento izquierdo

En otras palabras, h es una función que rodea su argumento derecho (el regalo) con su argumento izquierdo (el contenedor). h luego se aplica a las capas del regalo, luego a las filas de eso y finalmente a las columnas de eso.

TryAPL en línea!


Esta solución Dyalog APL versión 16.0 (19 bytes - cortesía de @ngn ) maneja cualquier cantidad de dimensiones:

{⍵@(1+⍳⍴⍵)⊢⍺⍴⍨2+⍴⍵}

el don

@( colocado en

1+ uno más

todos los índices de

⍴⍵ la forma del regalo

)⊢ en la matriz que consiste en

⍺⍴⍨ la envoltura se reformó a la forma

2+ dos añadidos a

⍴⍵ la forma del regalo

En otras palabras, creamos una matriz completamente de elementos envolventes, que en cada dimensión son dos elementos más grandes que el regalo, luego colocamos el regalo en esa matriz (reemplazando así los elementos envolventes en esas posiciones) en un desplazamiento de uno del bordes, es decir, en el centro.


Mi propio invento (-1 gracias a @ngn ):

(⌽2 3 1⍉,)⍣6

Esto aplica un tren de funciones anónimo 6 veces, cada vez con el contenedor como argumento izquierdo, y el resultado de la aplicación anterior como argumento correcto (aunque la primera vez será el regalo sin modificar):

( un tren de funciones anónimo

columnas inversas de

2 3 1⍉ la transposición de filas a capas, columnas a filas, capas a columnas de

, el envoltorio seguido del regalo

)⍣6 aplicado seis veces

En otras palabras, agregamos una capa de envoltura en la parte superior de la matriz, luego la deformamos para que el siguiente lado gire a la posición de la capa superior, listo para otra ronda de envoltura. Esto se repite seis veces, con la deformación final reposicionando todos los ejes al orden original.

TryAPL en línea!

Adán
fuente
1

Ruby, 89 bytes

->a,b{(w=[[z=b*2+a[0][0].tr('^|',b)]*(2+a[0].size)])+a.map{|x|[z]+x.map{|y|b+y+b}+[z]}+w}

¿Te he dicho alguna vez que solo estoy aquí para aprender rubí? :-)

GB
fuente