Enrole um presente sazonal

21

Tarefa

Dado um elemento de invólucro e uma matriz 3D não irregular, envolva a matriz na parte superior, inferior e geral. Você deve manipular dados de caracteres e numéricos, mas o wrapper e o presente terão o mesmo tipo de dados.


Exemplo de personagem

Para dados de caracteres, você pode optar por manipular matrizes 3D de caracteres únicos ou matrizes 2D de cadeias de caracteres:

Dada a matriz de caracteres de 2 camadas, 2 linhas e 4 colunas

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

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

e o caractere ".", responda à matriz de caracteres de 4 camadas, 4 linhas e 6 colunas

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

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

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

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

ou com a matriz de 2 linhas e 2 colunas de cadeias de caracteres de 4 caracteres

[["Your",
  "gift"],

 ["goes",
  "here"]]

e o caractere ".", responda a matriz de 4 linhas e 4 colunas de sequências de 6 caracteres

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

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

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

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

Exemplo numérico

Dada a matriz numérica de 2 camadas, 2 linhas e 2 colunas

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

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

e o número 0, responda à matriz numérica de 4 camadas, 4 linhas e 4 colunas

[[[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ão
fonte
Podemos assumir que o comprimento de cada "elemento de presente" a ser embrulhado é idêntico?
XavCo7
@ XavCo7 Sim, você pode.
Adám
Relacionado.
Martin Ender
Que tipo de saída é aceitável. Necessita de ser ele uma estrutura de dados de uma matriz de três ou d é a saída textuais aceitável
Rohan Jhunjhunwala
@RohanJhunjhunwala Você pode escolher livremente a representação, mas os formatos de entrada e saída devem ser os mesmos.
Adám

Respostas:

8

J , 16 15 bytes

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

Este é um verbo anônimo. Experimente online!

Obrigado a Adám por 1 byte!

Explicação

[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
fonte
Você não poderia salvar um byte com #h=.,,[
Adám 20/12
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]

Onde aestá a matriz tridimensional e eo invólucro. Converte automaticamente uma matriz bidimensional de seqüências de caracteres em uma matriz tridimensional de caracteres. Versão alternativa para quando aé uma matriz bidimensional de cadeias e eé um caractere e você deseja retornar uma matriz bidimensional de cadeias:

(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
fonte
Parece que isso falhará numérico e.
Adám
@ Adám Ah, desculpe, eu posso ter entendido mal a pergunta.
Neil
@ Adám A nova versão, felizmente com o mesmo número de bytes, funciona em matrizes tridimensionais de elementos arbitrários (irá converter automaticamente cadeias de caracteres em matrizes de caracteres).
Neil
3

Oitava, 23 27 bytes

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

matriz: a
padval:p

Pode ser chamado como:

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

tente (cole!) no Octave Online

nota: resposta anterior assumida padval padrão

rahnema1
fonte
Parece que ele aceita apenas um único argumento (a matriz). De onde ele obtém o caractere / número do invólucro?
SMLS
por padrão o painel de funções por 0
rahnema1
@ rahnema1 Então, e se o preenchimento for 42 ou "Z"?
Adám
Ah ... resposta atualizada incluindo PADVAL
rahnema1
11
+1 Estou surpreso que exista um built-in para exatamente isso.
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

Chamado como w(gift, wrapping character). Pode usar a string e a notação da matriz. Experimente online!

TidB
fonte
Eu não conseguia descobrir como executar isso no repl.it. Você pode criar um link?
Adám
@ Adám repl.it/Eu4M/1
TidB
Obrigado. Parece que falha numérica.
Adám
@ Adám Gotcha, eu interpretei mal (hehe) a especificação. Agora um pouco mais, mas na verdade funciona corretamente> repl.it/Eu4M/4
TidB 20/12/16
Uau, agora que você foi além das especificações, não precisou lidar com o caso de tipos de dados mistos.
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}

Um lambda que usa a matriz 3D e o caractere de quebra automática como argumentos.

  • Primeiro, ele cria uma matriz de saída 3D do tamanho correto, preenchida com o caractere de empacotamento.
  • Em seguida, ele usa a sintaxe da fatia da matriz para atribuir os valores da matriz original aos slots corretos da nova matriz, de uma só vez.
smls
fonte
3

Dyalog APL , 31 19 13 12 bytes

Quase uma transliteração (31 bytes) da solução do @ Zgarb .

Uma função anônima. O argumento da esquerda está encerrando, o argumento da direita é presente.

h1h2(h←⍪⍪⊣)

⊣h⍤1 h aplicado, com o argumento esquerdo da função anônima, às colunas de

⊣h⍤2 h aplicado, com o argumento esquerdo da função anônima, às linhas de

h← h aplicado às células principais, isto é, as camadas dos argumentos da função anônima, onde h é

o argumento da esquerda precedido pelo argumento da direita

anexado a

o argumento da esquerda

Em outras palavras, h é uma função que envolve o argumento correto (o presente) com o argumento esquerdo (o invólucro). h é então aplicado às camadas do presente, depois às linhas e, finalmente, às colunas.

TryAPL online!


Esta solução Dyalog APL versão 16.0 (19 bytes - cortesia de @ngn ) lida com qualquer número de dimensões:

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

o presente

@( colocado em

1+ um mais

todos os índices de

⍴⍵ a forma do presente

)⊢ na matriz que consiste em

⍺⍴⍨ o invólucro reformulado para a forma

2+ dois adicionados a

⍴⍵ a forma do presente

Em outras palavras, criamos uma matriz inteiramente de elementos de invólucro, que em todas as dimensões são dois elementos maiores que o presente, em seguida, colocamos o presente nessa matriz (substituindo assim os elementos de invólucro nessas posições) em um deslocamento de um do bordas, ou seja, no centro.


Minha própria invenção (-1 graças a @ngn ):

(⌽2 3 1⍉,)⍣6

Isso aplica um trem de função anônimo 6 vezes, sempre com o wrapper como argumento à esquerda e o resultado do aplicativo anterior como argumento à direita (embora a primeira vez seja o presente não modificado):

( um trem de função anônimo

colunas reversas de

2 3 1⍉ a transposição de linhas para camadas, colunas para linhas, camadas para colunas de

, o invólucro seguido pelo presente

)⍣6 aplicado seis vezes

Em outras palavras, adicionamos uma camada de invólucro na parte superior da matriz e, em seguida, deformamos para que o próximo lado seja girado na posição da camada superior, pronto para outra rodada de embrulho. Isso é repetido seis vezes, com a deformação final reposicionando todos os eixos na ordem original.

TryAPL online!

Adão
fonte
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}

Já te disse que só estou aqui para aprender rubi? :-)

GB
fonte