Bungkus hadiah musiman

21

Tugas

Diberikan elemen pembungkus dan array 3D yang tidak bergerigi, bungkus array atas, bawah, dan semua-sekitar. Anda harus menangani data karakter dan numerik, tetapi pembungkus dan sekarang akan memiliki tipe data yang sama.


Contoh karakter

Untuk data karakter, Anda dapat memilih untuk menangani array 3D karakter tunggal atau array string 2D:

Diberikan array karakter 2 layer, 2 baris, 4 kolom

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

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

dan karakter ".", jawab array karakter 4 layer, 4 baris, 6 kolom

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

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

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

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

atau diberi 2 baris, 2 larik kolom string 4-karakter

[["Your",
  "gift"],

 ["goes",
  "here"]]

dan karakter ".", jawab deretan 4 baris, 4 kolom string 6-karakter

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

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

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

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

Contoh numerik

Diberikan 2 layer, 2 baris, 2 array numerik kolom

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

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

dan nomornya 0, jawab larik numerik 4 layer, 4 baris, 4 kolom

[[[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]]]
Adm
sumber
Bisakah kita menganggap panjang setiap "elemen hadiah" untuk dibungkus adalah identik?
XavCo7
@ XavCo7 Ya Anda bisa.
Adem
Terkait
Martin Ender
Output seperti apa yang dapat diterima. Membutuhkannya datastruktur dari array tiga d atau output tekstual dapat diterima
Rohan Jhunjhunwala
@RohanJhunjhunwala Anda dapat dengan bebas memilih representasi, tetapi format input dan output harus sama.
Adem

Jawaban:

8

J , 16 15 byte

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

Ini adalah kata kerja anonim. Cobalah online!

Terima kasih kepada Adám selama 1 byte!

Penjelasan

[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
sumber
Tidak bisakah Anda menyimpan byte denganh=.,,[
Adm
4

JavaScript (ES6), 97 byte

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

Di mana aarray tiga dimensi dan epembungkusnya. Secara otomatis mengkonversi array string dua dimensi ke array karakter tiga dimensi. Versi alternatif untuk kapan aadalah array string dua dimensi dan emerupakan karakter dan Anda ingin mengembalikan array string dua dimensi:

(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
sumber
Sepertinya ini gagal pada angka e.
Adem
@ Adám Ah, maaf, saya mungkin salah paham pertanyaannya.
Neil
@ Adám Versi baru, untungnya jumlah byte yang sama, berfungsi pada array tiga dimensi dari elemen arbitrer (akan secara otomatis mengubah string ke array karakter).
Neil
3

Oktaf, 23 27 byte

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

array: a
padval:p

Itu bisa disebut sebagai:

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

coba (tempel!) di Octave Online

Catatan: jawaban sebelumnya diasumsikan padval default

rahnema1
sumber
Ini sepertinya hanya menerima satu argumen (array). Dari mana ia mendapatkan karakter / nomor pembungkus?
smls
secara default pad fungsi oleh 0
rahnema1
@ rahnema1 Jadi bagaimana jika paddingnya adalah 42, atau "Z"?
Adem
Oh ... jawaban diperbarui termasuk PADVAL
rahnema1
1
+1 Saya terkejut ada built-in untuk hal ini.
Adem
3

Python, 106 104 126 byte

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

Disebut sebagai w(gift, wrapping character). Dapat menggunakan notasi string dan array. Cobalah online!

TidB
sumber
Saya tidak tahu cara menjalankan ini di repl.it. Bisakah Anda membuat tautan?
Adem
@ Adám repl.it/Eu4M/1
TidB
Terima kasih. Sepertinya angka gagal.
Adem
@ Adma Gotcha, saya salah menafsirkan (hehe) spesifikasinya. Sedikit lebih lama sekarang, tetapi itu benar-benar berfungsi dengan benar> repl.it/Eu4M/4
TidB
Wow, sekarang Anda melampaui spesifikasi, Anda tidak perlu menangani case tipe data campuran.
Adem
3

Perl 6, 86 byte

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

Sebuah lambda yang menggunakan array 3D dan karakter pembungkus sebagai argumen.

  • Pertama-tama menciptakan array output 3D dengan ukuran yang benar, diisi dengan karakter pembungkus.
  • Kemudian ia menggunakan sintaks slice array untuk menetapkan nilai-nilai array asli ke dalam slot yang benar dari array baru, dalam satu gerakan.
seseorang
sumber
3

Dyalog APL , 31 19 13 12 byte

Hampir transliterasi (31 byte) dari solusi @ Zgarb .

Fungsi anonim. Argumen kiri adalah pembungkus, argumen kanan adalah hadiah.

h1h2(h←⍪⍪⊣)

⊣h⍤1 h diterapkan, dengan argumen kiri fungsi anonim, ke kolom

⊣h⍤2 h diterapkan, dengan argumen kiri fungsi anonim, ke baris

h← h diterapkan pada sel-sel utama yaitu lapisan argumen fungsi anonim, di mana h adalah

argumen kiri dipertalikan dengan argumen kanan

ditambahkan ke

argumen kiri

Dengan kata lain, h adalah fungsi yang mengelilingi argumen kanannya (hadiah) dengan argumen kiri (pembungkusnya). h kemudian diterapkan ke lapisan hadiah, lalu baris itu, dan akhirnya kolom itu.

TryAPL online!


Solusi Dyalog APL versi 16.0 ini (19 byte - milik @ngn ) menangani sejumlah dimensi:

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

hadiah

@( ditempatkan di

1+ satu ditambah

semua indeks

⍴⍵ bentuk hadiah

)⊢ dalam array yang terdiri dari

⍺⍴⍨ bungkusnya dibentuk kembali menjadi bentuk

2+ dua ditambahkan ke

⍴⍵ bentuk hadiah

Dengan kata lain, kami membuat array yang seluruhnya terdiri dari elemen pembungkus, yang di setiap dimensi dua elemen lebih besar dari hadiah, lalu kami menempatkan hadiah ke dalam array itu (dengan demikian menggantikan elemen pembungkus di posisi-posisi itu) dengan mengimbangi satu dari tepi, yaitu di tengah.


Penemuan saya sendiri (-1 terima kasih kepada @ngn ):

(⌽2 3 1⍉,)⍣6

Ini menerapkan fungsi-kereta anonim 6 kali, setiap kali dengan pembungkus sebagai argumen kiri, dan hasil dari aplikasi sebelumnya sebagai argumen yang benar (meskipun pertama kali di sekitarnya akan menjadi hadiah yang tidak dimodifikasi):

( fungsi-kereta anonim

kolom terbalik dari

2 3 1⍉ transposisi baris-ke-lapisan, kolom-ke-baris, layer-ke-kolom

, bungkusnya diikuti oleh hadiah

)⍣6 diterapkan enam kali

Dengan kata lain, kami menambahkan lapisan pembungkus di bagian atas array, lalu melengkung sehingga sisi berikutnya diputar ke posisi lapisan atas, siap untuk putaran pembungkus berikutnya. Ini diulangi sebanyak enam kali, dengan lilitan akhir memposisikan semua sumbu ke urutan semula.

TryAPL online!

Adm
sumber
1

Ruby, 89 byte

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

Pernahkah saya memberi tahu Anda bahwa saya hanya di sini untuk belajar ruby? :-)

GB
sumber