Enveloppez un cadeau saisonnier

21

Tâche

Étant donné un élément wrapper et un tableau 3D non dentelé, enveloppez le tableau en haut, en bas et tout autour. Vous devez gérer à la fois les données de caractères et les données numériques, mais l'encapsuleur et le présent auront le même type de données.


Exemple de personnage

Pour les données de caractères, vous pouvez choisir de gérer des tableaux 3D de caractères uniques ou des tableaux 2D de chaînes:

Étant donné le tableau de caractères à 2 couches, 2 lignes et 4 colonnes

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

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

et le caractère ".", répondez au tableau de caractères à 4 couches, 4 lignes et 6 colonnes

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

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

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

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

ou étant donné le tableau de 2 lignes et 2 colonnes de chaînes de 4 caractères

[["Your",
  "gift"],

 ["goes",
  "here"]]

et le caractère ".", répondez au tableau de 4 lignes et 4 colonnes de chaînes de 6 caractères

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

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

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

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

Exemple numérique

Étant donné le tableau numérique à 2 couches, 2 lignes et 2 colonnes

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

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

et le nombre 0, répondez au tableau numérique à 4 couches, 4 lignes et 4 colonnes

[[[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]]]
Adam
la source
Pouvons-nous supposer que la longueur de chaque "élément cadeau" à emballer est identique?
XavCo7
@ XavCo7 Oui, vous le pouvez.
2016
En relation.
Martin Ender
Quel type de sortie est acceptable. Besoin que ce soit une structure de données d'un tableau à trois dimensions ou une sortie textuelle acceptable
Rohan Jhunjhunwala
@RohanJhunjhunwala Vous pouvez choisir librement la représentation, mais les formats d'entrée et de sortie doivent être les mêmes.
2016

Réponses:

8

J , 16 15 octets

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

Ceci est un verbe anonyme. Essayez-le en ligne!

Merci à Adám pour 1 octet!

Explication

[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
la source
Impossible d'enregistrer un octet avech=.,,[
Adám
4

JavaScript (ES6), 97 octets

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

aest le tableau tridimensionnel et ele wrapper. Convertit automatiquement un tableau de chaînes bidimensionnel en un tableau de caractères tridimensionnel. Version alternative pour quand aest un tableau de chaînes à deux dimensions et eest un caractère et que vous souhaitez renvoyer un tableau de chaînes à deux dimensions:

(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
la source
On dirait que cela échoue en numérique e.
2016
@ Adám Ah, désolé, j'ai peut-être mal compris la question.
Neil
@ Adám La nouvelle version, heureusement le même nombre d'octets, fonctionne sur des tableaux tridimensionnels d'éléments arbitraires (convertira automatiquement les chaînes en tableaux de caractères).
Neil
3

Octave, 23 27 octets

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

tableau: a
padval:p

Il peut être appelé comme:

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

essayez (collez!) sur Octave Online

note: réponse précédente supposée padval par défaut

rahnema1
la source
Il semble qu'il n'accepte qu'un seul argument (le tableau). D'où obtient-il le caractère / numéro d'habillage?
smls
par défaut, le pad de fonction par 0
rahnema1
@ rahnema1 Et si le rembourrage est de 42 ou "Z"?
2016
Oh ... réponse mise à jour, y compris PADVAL
rahnema1
1
+1 Je suis surpris qu'il y ait une fonction intégrée pour cela exactement.
2016
3

Python, 106 104 126 octets

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

Appelé comme w(gift, wrapping character). Peut utiliser la chaîne et la notation du tableau. Essayez-le en ligne!

TidB
la source
Je ne pouvais pas comprendre comment exécuter cela sur repl.it. Pouvez-vous créer un lien?
2016
@ Adám repl.it/Eu4M/1
TidB
Merci. On dirait que le numérique échoue.
2016
@ Adám Gotcha, j'ai mal interprété (hehe) la spécification. Un peu plus longtemps maintenant, mais cela fonctionne en fait correctement> repl.it/Eu4M/4
TidB
Wow, maintenant vous êtes allé au-delà des spécifications, vous n'avez plus besoin de gérer le cas des types de données mixtes.
2016
3

Perl 6, 86 octets

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

Un lambda qui prend le tableau 3D et le caractère d'habillage comme arguments.

  • Il crée d'abord un tableau de sortie 3D de la bonne taille, rempli du caractère d'habillage.
  • Ensuite, il utilise la syntaxe de tranche de tableau pour affecter les valeurs du tableau d'origine dans les emplacements corrects du nouveau tableau, d'un seul coup.
smls
la source
3

Dyalog APL , 31 19 13 12 octets

Presque une translittération (31 octets) de la solution de @ Zgarb .

Une fonction anonyme. L'argument de gauche est enveloppant, l'argument de droite est cadeau.

h1h2(h←⍪⍪⊣)

⊣h⍤1 h appliqué, avec l'argument gauche de la fonction anonyme, aux colonnes de

⊣h⍤2 h appliqué, avec l'argument gauche de la fonction anonyme, aux lignes de

h← h appliqué aux cellules principales, c'est-à-dire aux couches des arguments de la fonction anonyme, où h est

l'argument de gauche ajouté à l'argument de droite

ajouté à

l'argument de gauche

En d'autres termes, h est une fonction qui entoure son argument droit (le cadeau) avec son argument gauche (le wrapper). h est ensuite appliqué aux couches du cadeau, puis aux lignes de cela et enfin aux colonnes de cela.

TryAPL en ligne!


Cette solution Dyalog APL version 16.0 (19 octets - gracieuseté de @ngn ) gère un nombre illimité de dimensions:

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

le cadeau

@( placé à

1+ un plus

tous les indices de

⍴⍵ la forme du cadeau

)⊢ dans le tableau composé de

⍺⍴⍨ le wrapper remodelé à la forme

2+ deux ajoutés à

⍴⍵ la forme du cadeau

En d'autres termes, nous créons un tableau entièrement composé d'éléments d'emballage, qui dans chaque dimension est deux éléments plus grands que le cadeau, puis nous plaçons le cadeau dans ce tableau (remplaçant ainsi les éléments d'emballage dans ces positions) à un décalage de un par rapport au bords, c'est à dire au centre.


Ma propre invention (-1 grâce à @ngn ):

(⌽2 3 1⍉,)⍣6

Cela applique un train de fonctions anonyme 6 fois, chaque fois avec le wrapper comme argument de gauche, et le résultat de l'application précédente comme argument de droite (bien que la première fois, ce sera le cadeau non modifié):

( un train de fonctions anonyme

colonnes inversées de

2 3 1⍉ la transposition lignes à couches, colonnes à lignes, couches à colonnes de

, l'emballage suivi du cadeau

)⍣6 appliqué six fois

En d'autres termes, nous ajoutons une couche d'enveloppe sur le haut de la matrice, puis la déformons de sorte que le côté suivant soit tourné dans la position de couche supérieure, prêt pour un autre cycle d'emballage. Cette opération est répétée six fois, la déformation finale repositionnant tous les axes dans l'ordre d'origine.

TryAPL en ligne!

Adam
la source
1

Rubis, 89 octets

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

Vous ai-je déjà dit que je ne suis ici que pour apprendre le rubis? :-)

GB
la source