Zawiń prezent sezonowy

21

Zadanie

Biorąc pod uwagę element otoki i nieoszarpaną macierz 3D, owiń górną, dolną i dookoła tablicę. Musisz obsługiwać zarówno dane znakowe, jak i liczbowe, ale opakowanie i teraźniejszość będą miały ten sam typ danych.


Przykład postaci

W przypadku danych o znakach możesz wybrać obsługę zarówno tablic 3D pojedynczych znaków, jak i tablic 2D ciągów znaków:

Biorąc pod uwagę tablicę znaków z 2 warstwami, 2 wierszami i 4 kolumnami

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

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

i znak ".", odpowiedz na 4-warstwową, 4-rzędową, 6-kolumnową tablicę znaków

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

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

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

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

lub biorąc pod uwagę tablicę z 2 wierszami i 2 kolumnami zawierającymi 4 znaki

[["Your",
  "gift"],

 ["goes",
  "here"]]

i znak ".", odpowiedz 4-wierszowy, 4-kolumnowy zestaw 6-znakowych ciągów znaków

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

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

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

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

Przykład liczbowy

Biorąc pod uwagę 2-warstwową, 2-rzędową, 2-kolumnową tablicę numeryczną

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

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

i liczbę 0, odpowiedz na 4-warstwową, 4-rzędową, 4-kolumnową tablicę numeryczną

[[[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ám
źródło
Czy możemy założyć, że długość każdego „elementu podarunkowego” do zawinięcia jest identyczna?
XavCo7,
@ XavCo7 Tak, możesz.
Adám
Związane z.
Martin Ender,
Jaki rodzaj produkcji jest akceptowalny. Może to być struktura danych trójwymiarowej tablicy lub dopuszczalne są wyniki tekstowe
Rohan Jhunjhunwala,
@RohanJhunjhunwala Możesz dowolnie wybierać reprezentację, ale formaty wejściowe i wyjściowe muszą być takie same.
Adám,

Odpowiedzi:

8

J , 16 15 bajtów

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

To jest anonimowy czasownik. Wypróbuj online!

Dzięki Adám za 1 bajt!

Wyjaśnienie

[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
źródło
Nie mógłbyś uratować bajtu zh=.,,[
Adám
4

JavaScript (ES6), 97 bajtów

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

Gdzie ajest trójwymiarowa tablica i ejest to opakowanie. Automatycznie konwertuje dwuwymiarową tablicę ciągów na trójwymiarową tablicę znaków. Alternatywna wersja dla when ajest dwuwymiarową tablicą ciągów i ejest znakiem, a chcesz zwrócić dwuwymiarową tablicę ciągów:

(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
źródło
Wygląda na to, że zawodzi to w liczbach e.
Adám
@ Adám Ach, przepraszam, mogłem źle zrozumieć pytanie.
Neil,
@ Adám Nowa wersja, na szczęście taka sama liczba bajtów, działa na trójwymiarowych tablicach dowolnych elementów (automatycznie przekształci ciągi w tablice znaków).
Neil
3

Oktawa, 23 27 bajtów

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

tablica: a
padval:p

Można go nazwać:

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

spróbuj (wklej!) w Octave Online

Uwaga: poprzednia odpowiedź zakładała domyślny padval

rahnema1
źródło
Wygląda na to, że akceptuje tylko jeden argument (tablicę). Skąd bierze się znak / numer opakowania?
smls,
domyślnie pad funkcyjny od 0
rahnema1
@ rahnema1 A co jeśli wypełnienie to 42 lub „Z”?
Adám
Och ... zaktualizowano odpowiedź, w tym PADVAL
rahnema1
1
+1 Jestem zaskoczony, że jest do tego wbudowana funkcja.
Adám
3

Python, 106 104 126 bajtów

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

Nazywany jako w(gift, wrapping character). Może używać ciągu i notacji tablicowej. Wypróbuj online!

TidB
źródło
Nie mogłem wymyślić, jak uruchomić to na repl.it. Czy możesz stworzyć link?
Adám
@ Adám repl.it/Eu4M/1
TidB
Dzięki. Wygląda na to, że liczba nie działa
Adám
@ Adám Gotcha, źle zinterpretowałem (hehe) specyfikację. Nieco dłużej, ale tak naprawdę działa poprawnie> repl.it/Eu4M/4
TidB
Wow, teraz przekroczyłeś specyfikacje, nie musiałeś zajmować się przypadkiem mieszanych typów danych.
Adám
3

Perl 6, 86 bajtów

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

Lambda, która jako argument przyjmuje tablicę 3D i znak zawijania.

  • Najpierw tworzy tablicę wyjściową 3D o prawidłowym rozmiarze, wypełnioną znakiem zawijania.
  • Następnie używa składni wycinka tablicy, aby za jednym zamachem przypisać wartości oryginalnej tablicy do odpowiednich gniazd nowej tablicy.
smls
źródło
3

Dyalog APL , 31 19 13 12 bajtów

Prawie transliteracja (31 bajtów) rozwiązania @ Zgarb .

Anonimowa funkcja. Lewy argument jest zawijany, prawy argument to prezent.

h1h2(h←⍪⍪⊣)

⊣h⍤1 h zastosowano, z lewym argumentem funkcji anonimowej, do kolumn

⊣h⍤2 h zastosowano z lewym argumentem funkcji anonimowej do wierszy

h← h zastosowane do głównych komórek, tj. warstw argumentów funkcji anonimowej, gdzie h jest

lewy argument był poprzedzony prawym argumentem

uprzedzony do

lewy argument

Innymi słowy, h jest funkcją, która otacza prawy argument (prezent) lewym argumentem (opakowanie). h jest następnie nakładany na warstwy prezentu, następnie na rzędy, a na końcu na kolumny.

Wypróbuj APL online!


To rozwiązanie Dyalog APL w wersji 16.0 (19 bajtów - dzięki uprzejmości @ngn ) obsługuje dowolną liczbę wymiarów:

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

prezent

@( umieszczone na

1+ jeden plus

wszystkie wskaźniki

⍴⍵ kształt prezentu

)⊢ w tablicy składającej się z

⍺⍴⍨ opakowanie zmieniło kształt

2+ dwa dodane do

⍴⍵ kształt prezentu

Innymi słowy, tworzymy tablicę złożoną całkowicie z elementów owijających, która w każdym wymiarze jest dwoma elementami większymi niż prezent, następnie umieszczamy prezent w tej tablicy (zastępując w ten sposób elementy opakowaniowe w tych pozycjach) z przesunięciem jednego z krawędzie, tj. w środku.


Mój własny wynalazek (-1 dzięki @ngn ):

(⌽2 3 1⍉,)⍣6

Odnosi to 6-krotnie anonimowy ciąg funkcji, za każdym razem z opakowaniem jako lewym argumentem, a wynik poprzedniej aplikacji jako prawym argumentem (chociaż pierwszy raz będzie to niezmodyfikowany prezent):

( anonimowy ciąg funkcji

odwrotne kolumny

2 3 1⍉ transpozycja wierszy do warstw, kolumn do rzędów, warstw do kolumn transpozycji

, opakowanie, a następnie prezent

)⍣6 zastosowano sześć razy

Innymi słowy, dodajemy warstwę owijki na górze tablicy, a następnie wypaczamy ją, aby następna strona została obrócona do pozycji górnej warstwy, gotowa do kolejnej rundy owijania. Czynność tę powtarza się sześć razy, a ostateczne wypaczenie przestawia wszystkie osie do pierwotnej kolejności.

Wypróbuj APL online!

Adám
źródło
1

Rubinowy, 89 bajtów

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

Czy kiedykolwiek mówiłem, że jestem tu tylko po to, żeby uczyć się rubinu? :-)

GB
źródło