季節のプレゼントを包む


21

仕事

ラッパー要素とギザギザのない3D配列を指定して、配列の上部、下部、および全周をラップします。文字データと数値データの両方を処理する必要がありますが、ラッパーと現在のデータ型は同じです。


キャラクターの例

文字データの場合、単一文字の3D配列または文字列の2D配列を処理することを選択できます。

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","."],
  [".",".",".",".",".","."]],

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

または、4文字の文字列の2行2列の配列を指定します

[["Your",
  "gift"],

 ["goes",
  "here"]]

そして、文字"."、6文字の文字列の4行4列の配列に答えます

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

 ["......",
  ".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 16

@ XavCo7はい、できます。
アダム16


どのような出力が許容されますか。3次元配列のデータ構造であることまたはテキスト出力許容されることを必要
ロアンJhunjhunwala

@RohanJhunjhunwala表現は自由に選択できますが、入力形式と出力形式は同じでなければなりません。
アダム16

回答:


8

J16 15バイト

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

これは匿名の動詞です。オンラインでお試しください!

1バイトのAdámに感謝します!

説明

[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.

あなたがバイトを保存できませんでした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]

where aは3次元配列でe、ラッパーです。文字列の2次元配列を文字の3次元配列に自動的に変換します。whenの代替バージョンaは文字列の2次元配列であり、文字でeあり、文字列の2次元配列を返します。

(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]

これはnumericで失敗するようeです。
アダム16

@アダムああ、ごめんなさい、私は質問を誤解したかもしれません。
ニール

@Adám新しいバージョンは、幸いにも同じバイトカウントで、任意の要素の3次元配列で機能します(文字列を文字配列に自動変換します)。
ニール

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で(貼り付けて!)

注:前の回答はデフォルトのpadvalを想定


これは、単一の引数(配列)のみを受け入れるように見えます。折り返し文字/番号はどこから取得しますか?
smls 16

デフォルトでは、0による関数パッド
rahnema1

@ rahnema1では、パディングが42、つまり「Z」の場合はどうでしょうか。
アダム16

ああ...答えはPADVAL含む更新
rahnema1

1
+1まさにこれのためのビルトインがあることに驚いています。
アダム16

3

パイソン、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)ます。文字列と配列表記を使用できます。オンラインでお試しください!


repl.itでこれを実行する方法がわかりませんでした。リンクを作成できますか?
アダム16

@Adámrepl.it/Eu4M /1
TidB

ありがとう。数値が失敗したように見えます。
アダム16

@AdámGotcha、私は仕様を誤って解釈しました。少し長くなりましたが、実際には正しく動作します> repl.it/Eu4M/4
TidB

うわー、仕様を超えて、混合データ型のケースを処理する必要がなくなりました。
アダム16

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}

3D配列とラッピング文字を引数として取るラムダ。

  • 最初に、ラッピング文字で満たされた正しいサイズの3D出力配列を作成します。
  • 次に、配列スライス構文を使用して、元の配列の値を新しい配列の正しいスロットに一気に割り当てます。

3

Dyalog APL31 19 13 12 バイト

@Zgarbのソリューションのほぼ音訳(31バイト)。

匿名関数。左の引数はラッピング、右の引数はギフトです。

h1h2(h←⍪⍪⊣)

⊣h⍤1 hは、匿名関数の左引数で、の列に適用されます

⊣h⍤2 hは、匿名関数の左引数で、の行に適用されます

h← hは、主要なセル、つまり無名関数の引数の層に適用されます。ここで、h

右引数の前に追加された左引数

の前に

左引数

言い換えると、hは、右の引数(ギフト)を左の引数(ラッパー)で囲む関数です。次に、hがギフトのレイヤーに適用され、次にその行、最後にその列に適用されます。

TryAPLオンライン!


このDyalog APLバージョン16.0ソリューション(19バイト– @ngnの厚意による)は、任意の数の次元を処理します。

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

贈り物

@( に配置

1+ ワンプラス

のすべてのインデックス

⍴⍵ 贈り物の形

)⊢ で構成される配列内

⍺⍴⍨ 形状に形状変更されたラッパー

2+ に2つ追加

⍴⍵ 贈り物の形

つまり、すべての次元でギフトよりも2要素大きいラッパー要素のみの配列を作成し、その配列にギフトを配置します(したがって、これらの位置のラッピング要素を置き換えます)。エッジ、つまり中央。


私自身の発明(-1 @ngnに感謝):

(⌽2 3 1⍉,)⍣6

これは、匿名関数関数を6回適用します。そのたびに、ラッパーを左引数として使用し、前のアプリケーションの結果を右引数として使用します(ただし、最初の回は変更されません)。

( 匿名の関数トレイン

逆列

2 3 1⍉ 行からレイヤー、列から行、レイヤーから列への転置

, ラッパーに続いてギフト

)⍣6 6回適用

言い換えると、配列の最上部にラッパーのレイヤーを追加し、それを次の面が最上層の位置に回転するようにワープして、次のラウンドのラップの準備をします。これは6回繰り返され、最後のワープによりすべての軸が元の順序に再配置されます。

TryAPLオンライン!



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}

ルビーを学ぶためにここにいるだけだと言ったことがありますか?:-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.