Заверните сезонный подарок

21

задача

С учетом элемента-обертки и трехмерного массива без зазоров, оберните массив сверху, снизу и вокруг. Вы должны обрабатывать как символьные, так и числовые данные, но оболочка и настоящее будут иметь одинаковый тип данных.


Пример персонажа

Для символьных данных вы можете выбрать обработку трехмерных массивов отдельных символов или двумерных массивов строк:

Учитывая 2 слоя, 2 строки, 4 столбца символьный массив

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

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

и символ ".", ответьте 4 слоя, 4 строки, 6 столбцов символов

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

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

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

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

или дан 2-рядный, 2-колоночный массив из 4-х символьных строк

[["Your",
  "gift"],

 ["goes",
  "here"]]

и символ ".", ответьте на 4 строки, 4 столбца массив из 6 символов

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

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

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

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

Числовой пример

Учитывая 2 слоя, 2 строки, 2 столбца числового массива

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

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

и число 0, ответь 4 слоя, 4 строки, 4 столбца числового массива

[[[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]]]
Адам
источник
Можем ли мы предположить, что длина каждого «подарочного элемента» для упаковки одинакова?
XavCo7
@ XavCo7 Да, можно.
Адам
Связанный.
Мартин Эндер
Какой вид продукции является приемлемым. Это должна быть структура данных массива из трех d или приемлем текстовый вывод
Rohan Jhunjhunwala
@RohanJhunjhunwala Вы можете свободно выбирать представление, но форматы ввода и вывода должны быть одинаковыми.
Адам

Ответы:

8

J , 16 15 байт

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

Это анонимный глагол. Попробуйте онлайн!

Спасибо Адаму за 1 байт!

объяснение

[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
источник
Не могли бы вы сохранить байт сh=.,,[
Адам
4

JavaScript (ES6), 97 байт

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

Где aнаходится трехмерный массив и eявляется оберткой. Автоматически преобразует двумерный массив строк в трехмерный массив символов. Альтернативная версия для when a- это двумерный массив строк и eсимвол, и вы хотите вернуть двумерный массив строк:

(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]
Нил
источник
Похоже, это не на числовой e.
Адам
@ Adám Ах, прости, возможно, я неправильно понял вопрос.
Нил
@ Adám Новая версия, к счастью, с таким же количеством байтов, работает с трехмерными массивами произвольных элементов (автоматически преобразует строки в символьные массивы).
Нил
3

Октава, 23 27 байт

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

массив: a
padval:p

Это можно назвать как:

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

попробуйте (вставьте!) в Octave Online

примечание: предыдущий ответ принят по умолчанию

rahnema1
источник
Похоже, что он принимает только один аргумент (массив). Откуда он получает символ / номер переноса?
Smls
по умолчанию функциональная панель на 0
rahnema1
@ rahnema1 Так что, если отступ равен 42, или "Z"?
Адам
Ох ... ответ обновлен, включая PADVAL
rahnema1
1
+1 Я удивлен, что есть встроенный именно для этого.
Адам
3

Python, 106 104 126 байтов

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

Называется как w(gift, wrapping character). Можно использовать строку и обозначение массива. Попробуйте онлайн!

TidB
источник
Я не мог понять, как запустить это на repl.it. Вы можете создать ссылку?
Адам
@ Adám repl.it/Eu4M/1
TidB
Спасибо. Похоже, числовые ошибки.
Адам
@ Adám Gotcha, я неправильно истолковал (хе-хе) спецификацию. Немного дольше, но на самом деле это работает правильно> repl.it/Eu4M/4
TidB
Вау, теперь вы вышли за рамки спецификаций, вам не нужно обрабатывать случай смешанных типов данных.
Адам
3

Perl 6, 86 байт

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

Лямбда, которая принимает трехмерный массив и символ переноса в качестве аргументов.

  • Сначала создается трехмерный выходной массив правильного размера, заполненный символом переноса.
  • Затем он использует синтаксис среза массива для назначения значений исходного массива правильным слотам нового массива одним махом.
SMLS
источник
3

Dyalog APL , 31 19 13 12 байт

Почти транслитерация (31 байт) решения @ Zgarb .

Анонимная функция. Левый аргумент оборачивается, правый аргумент - подарок.

h1h2(h←⍪⍪⊣)

⊣h⍤1 h с левым аргументом анонимной функции применяется к столбцам

⊣h⍤2 h с левым аргументом анонимной функции применяется к строкам

h← ч применительно к основным клеткам , то есть слои аргументов анонимной функции, в которой ч является

левый аргумент предшествует правому аргументу

приурочен к

левый аргумент

Другими словами, h - это функция, которая окружает свой правый аргумент (дар) своим левым аргументом (оболочкой). Затем h применяется к слоям подарка, затем к строкам этого столбца и, наконец, к его столбцам.

Попробуй APL онлайн!


Это решение Dyalog APL версии 16.0 (19 байтов - любезно предоставлено @ngn ) обрабатывает любое количество измерений:

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

подарок

@( размещены в

1+ один плюс

все показатели

⍴⍵ форма подарка

)⊢ в массиве, состоящем из

⍺⍴⍨ оболочка изменена в форме

2+ два добавлены в

⍴⍵ форма подарка

Другими словами, мы создаем массив полностью из элементов-оберток, который в каждом измерении на два элемента больше подарка, затем помещаем подарок в этот массив (таким образом, заменяя элементы-обертки в этих позициях) со смещением в один от края, т.е. в центре.


Мое собственное изобретение (-1 благодаря @ngn ):

(⌽2 3 1⍉,)⍣6

Это применяет анонимную последовательность операций 6 раз, каждый раз с оберткой в ​​качестве левого аргумента и результатом предыдущего приложения в качестве правого аргумента (хотя в первый раз это будет неизмененный подарок):

( анонимный функциональный поезд

обратные столбцы

2 3 1⍉ строки-слои, столбцы-строки, слои-столбцы транспонирования

, обертка с последующим подарком

)⍣6 применяется шесть раз

Другими словами, мы добавляем слой-обертку на вершину массива, затем деформируем его так, чтобы следующая сторона поворачивалась в положение верхнего слоя, готового к следующему раунду обертывания. Это повторяется шесть раз, при этом окончательная деформация перемещает все оси в исходный порядок.

Попробуй APL онлайн!

Адам
источник
1

Рубин, 89 байт

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

Я когда-нибудь говорил тебе, что я здесь только для того, чтобы изучать рубин? :-)

гигабайт
источник