ห่อของขวัญตามฤดูกาล


21

งาน

ให้องค์ประกอบของ wrapper และอาเรย์แบบสามมิติที่ไม่ขรุขระให้ใส่ส่วนบนของอาเรย์ด้านล่างและรอบด้าน คุณต้องจัดการทั้งตัวละครและข้อมูลตัวเลข แต่เสื้อคลุมและปัจจุบันจะมีชนิดข้อมูลเดียวกัน


ตัวอย่างตัวละคร

สำหรับข้อมูลตัวละครคุณอาจเลือกที่จะจัดการกับอาร์เรย์ 3 มิติของตัวละครเดียวหรือสองมิติของสตริง:

รับ 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 ใช่คุณทำได้
อดัม


เอาต์พุตชนิดใดเป็นที่ยอมรับได้ ต้องการมันเป็นโครงสร้างข้อมูลของสามอาเรย์หรือเป็นข้อความที่ยอมรับได้
Rohan Jhunjhunwala

@RohanJhunjhunwala คุณสามารถเลือกการแสดงได้อย่างอิสระ แต่รูปแบบอินพุตและเอาต์พุตต้องเหมือนกัน
อดัม

คำตอบ:


8

J , 16 15 ไบต์

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

นี่คือคำกริยาที่ไม่ระบุชื่อ ลองออนไลน์!

ขอบคุณAdámสำหรับ 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.

ไม่สามารถให้คุณประหยัดไบต์ที่มี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เป็นตัวหุ้ม แปลงอาเรย์สองมิติของสตริงเป็นอาเรย์ของอักขระสามมิติโดยอัตโนมัติ เวอร์ชันทางเลือกสำหรับเมื่อ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 Ah ขอโทษฉันอาจเข้าใจผิดคำถาม
Neil

@ Adámเวอร์ชั่นใหม่โชคดีที่มีจำนวนไบต์เดียวกันทำงานในอาร์เรย์สามมิติขององค์ประกอบที่กำหนดเอง (จะแปลงสตริงให้เป็นอาร์เรย์อักขระโดยอัตโนมัติ)
Neil

3

อ็อกเทฟ23 23 ไบต์

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

หมายเหตุ: คำตอบก่อนหน้านี้ถือว่าเป็นค่าเริ่มต้น


ดูเหมือนว่าจะยอมรับเพียงอาร์กิวเมนต์เดียว (อาเรย์) มันจะได้รับการตัดตัวอักษร / หมายเลขจากที่ไหน
smls

โดยค่าเริ่มต้นแผ่นฟังก์ชันโดย 0
rahnema1

@ rahnema1 แล้วถ้า padding เป็น 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)เรียกว่าเป็น สามารถใช้สตริงและสัญกรณ์อาร์เรย์ ลองออนไลน์!


ฉันไม่สามารถหาวิธีเรียกใช้บน repl.it คุณสามารถสร้างลิงค์ได้หรือไม่?
อดัม


ขอบคุณ ดูเหมือนว่าตัวเลขจะล้มเหลว
อดัม

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

แลมบ์ดาที่ใช้อาร์เรย์ 3D และอักขระการตัดเป็นอาร์กิวเมนต์

  • ก่อนอื่นมันจะสร้างอาร์เรย์เอาต์พุต 3 มิติที่มีขนาดที่ถูกต้องเต็มไปด้วยอักขระการตัดคำ
  • จากนั้นจะใช้ไวยากรณ์ slice ของอาเรย์เพื่อกำหนดค่าของอาเรย์ดั้งเดิมลงในสล็อตที่ถูกต้องของอาเรย์ใหม่ในคราวเดียว

3

Dyalog APL , 31 19 13 12 ไบต์

เกือบทับศัพท์ (31 bytes) ของ@ วิธีการแก้ปัญหาของ

ฟังก์ชั่นที่ไม่ระบุชื่อ อาร์กิวเมนต์ซ้ายคือการตัดอาร์กิวเมนต์ที่ถูกต้องคือของขวัญ

h1h2(h←⍪⍪⊣)

⊣h⍤1 hใช้กับอาร์กิวเมนต์ซ้ายของฟังก์ชันที่ไม่ระบุชื่อกับคอลัมน์ของ

⊣h⍤2 ชั่วโมงใช้กับอาร์กิวเมนต์ซ้ายของฟังก์ชันที่ไม่ระบุชื่อกับแถวของ

h← hนำไปใช้กับเซลล์หลักเช่นเลเยอร์ของอาร์กิวเมนต์ที่ไม่ระบุชื่อของฟังก์ชันซึ่ง hคือ

อาร์กิวเมนต์ซ้ายเสริมไว้ที่อาร์กิวเมนต์ที่ถูกต้อง

ผนวกกับ

อาร์กิวเมนต์ซ้าย

กล่าวอีกนัยหนึ่งhคือฟังก์ชั่นที่ล้อมรอบอาร์กิวเมนต์ที่ถูกต้อง (ของขวัญ) กับอาร์กิวเมนต์ซ้ายของมัน (เสื้อคลุม) hถูกนำไปใช้กับเลเยอร์ของที่ระลึกจากนั้นแถวของมันและในที่สุดก็คอลัมน์ของมัน

ลองใช้ออนไลน์!


โซลูชัน Dyalog APL เวอร์ชัน 16.0 นี้ (19 ไบต์ - ความอนุเคราะห์ของ@ngn ) จัดการมิติต่างๆจำนวนเท่าใด:

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

ของที่ระลึก

@( วางไว้ที่

1+ หนึ่งบวก

ดัชนีทั้งหมดของ

⍴⍵ รูปร่างของของขวัญ

)⊢ ในอาร์เรย์ประกอบด้วย

⍺⍴⍨ เสื้อคลุมเปลี่ยนรูปร่างให้เป็นรูปร่าง

2+ สองเพิ่มไปยัง

⍴⍵ รูปร่างของของขวัญ

กล่าวอีกนัยหนึ่งเราสร้างอาร์เรย์ทั้งหมดขององค์ประกอบ wrapper ซึ่งในทุกมิติมีสององค์ประกอบที่ใหญ่กว่าของขวัญจากนั้นเราวางของขวัญลงในอาร์เรย์นั้น (ดังนั้นแทนที่องค์ประกอบห่อในตำแหน่งเหล่านั้น) ที่ชดเชยหนึ่งจาก ขอบคือตรงกลาง


การประดิษฐ์ของฉันเอง (-1 ต้องขอบคุณ@ngn ):

(⌽2 3 1⍉,)⍣6

สิ่งนี้ใช้กับฟังก์ชั่นฝึกอบรมแบบไม่ระบุชื่อ 6 ครั้งในแต่ละครั้งที่มี wrapper เป็นอาร์กิวเมนต์ซ้ายและผลลัพธ์ของแอปพลิเคชันก่อนหน้าเป็นอาร์กิวเมนต์ที่ถูกต้อง (แม้ว่าครั้งแรกรอบ ๆ มันจะเป็นของขวัญที่ไม่ได้แก้ไข):

( ฟังก์ชั่นรถไฟที่ไม่ระบุชื่อ

คอลัมน์ย้อนกลับของ

2 3 1⍉ การเปลี่ยนแถวแบบแถวต่อชั้น, แบบเรียงซ้อนกันแบบเรียงต่อกัน,

, เสื้อคลุมตามด้วยของที่ระลึก

)⍣6 ใช้หกครั้ง

กล่าวอีกนัยหนึ่งเราเพิ่มเลเยอร์ของ wrapper ที่ด้านบนสุดของอาเรย์แล้วบิดงอเพื่อให้ด้านถัดไปหมุนไปที่ตำแหน่งเลเยอร์ด้านบนพร้อมสำหรับการตัดอีกรอบ สิ่งนี้ซ้ำแล้วซ้ำอีกหกครั้งด้วยการแปรปรวนครั้งสุดท้ายเพื่อปรับตำแหน่งแกนทั้งหมดตามลำดับเดิม

ลองใช้ออนไลน์!



1

Ruby, 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.