แปลงเมทริกซ์


16

เขียนโปรแกรมหรือฟังก์ชั่นที่เมทริกซ์ A (ค่าสูงสุดของมิติของเมทริกซ์คือ 100) จะถูกเปลี่ยนเป็นเมทริกซ์ใหม่ B แต่ละองค์ประกอบของเมทริกซ์ใหม่ B คือผลรวมของเพื่อนบ้านเชิงบวกขององค์ประกอบที่เกี่ยวข้องของเมทริกซ์ A .

มีการพิจารณาเฉพาะเพื่อนบ้านในทิศทางสี่มุมฉากและขอบไม่พันกัน

อินพุตตัวอย่าง:

 1  2  3
 4 -1 -2
-3 -4 10
 1  2 10

เอาท์พุท:

 6  4  2
 1  6 13
 5 12 10
 2 11 12

กฎ:

  • ในฐานะที่เป็นอินพุตใช้จำนวนเต็ม
  • นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ

3
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! ความท้าทายทั้งหมดที่นี่จำเป็นต้องมีเกณฑ์การชนะอย่างมีวัตถุประสงค์เพื่อระบุว่าโซลูชั่นใดควรชนะ โดยทั่วไปนี่คือโค้ดกอล์ฟซึ่งหมายความว่าโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ นอกจากนี้จะเป็นประโยชน์ในการระบุรูปแบบอินพุต / เอาต์พุตที่ถูกต้อง (อาร์เรย์ 2d - สตริงเดี่ยว? ฯลฯ ) ในที่สุดก็มีบางกรณีที่คุณยังไม่ได้ครอบคลุม ตัวอย่างเช่นตัวเลขจะถูกล้อมรอบด้วยตัวเลขลบเท่านั้นหรือไม่
Doorknob

ขอขอบคุณ. ฉันเดาได้ถึง [100] [100] และใช่ตัวเลขจะถูกล้อมรอบด้วยจำนวนลบ
MT

เราจะป้อนข้อมูลในวิธีใด
Maltysen

1
@Doorknob ผลรวมของชุดตัวเลขที่ว่างเปล่าคือ 0
orlp

@ Maltysen STDIN ฉันเดา
MT

คำตอบ:


10

MATL , 9 ไบต์

t0>*1Y6Z+

ลองออนไลน์!

คำอธิบาย

อินพุทเมทริกซ์นั้นมีหลายรูปแบบโดยมาสก์ที่เหมาะสมเพื่อสร้างค่าลบเท่ากับ 0 จากนั้นจึงใช้การบิดแบบ 2 มิติเพื่อคำนวณผลรวมของเพื่อนบ้านของแต่ละรายการ

t     % Take input implicitly: 2D array. Duplicate
0>    % Is each entry positive? This gives a mask of positive values
*     % Multiply: set negative values of input array to zero
1Y6   % Predefined literal: [0 1 0; 1 0 1; 0 1 0]
Z+    % 2D convolution preserving size. Implicitly display

4
โทรศัพท์ได้รับอนุญาตเป็น I / O หรือไม่
orlp

ถ้าอย่างนั้นฉันก็สงสัยว่ามันจะสามารถเอาชนะได้: p
Adnan

@Adnan ใน Python ไม่ใช่
R. Kap

4
ผู้ชายคนนี้ทำในขณะนี้บนโทรศัพท์และที่นี่ฉันต้องอุทิศบางส่วนของเวลาที่ฉันจะพยายามที่จะแก้บางส่วนของปัญหาเหล่านี้ ...
อาร์ Kap

@ R.Kap ฉันหมายถึง "พิมพ์จากโทรศัพท์" (ไม่ใช่ "พิมพ์ขณะพูดคุยทางโทรศัพท์") ขออภัยเกี่ยวกับภาษาอังกฤษของฉัน :-)
Luis Mendo

7

อ็อกเทฟ, 46 44 40 ไบต์

ที่บันทึกไว้ 2 ไบต์ขอบคุณที่@flawr
@ LuisMendo ของเคอร์เนล 4 ไบต์สั้นกว่า @ flawr ของ

@(M)conv2(M.*(M>0),(x='aba')~=x','same')

เช่นเดียวกับคำตอบของ @ LuisMendo ! น้อยเท่านั้น ...

คุณสามารถดูได้ที่นี่ในideone


COMON ฉันเพิ่งจะโพสต์คำตอบที่แน่นอนนี้
ข้อบกพร่อง

1
คุณสามารถใช้บันทึก 6 ไบต์(x='aba')~=x'แทนการใช้[0 1 0;1 0 1;0 1 0]
Luis Mendo

2
@LuisMendo คาถานี้คืออะไร?
บีกเกอร์

1
@cat .*คือการคูณเมทริกซ์ที่ชาญฉลาด บูลีนเมทริกซ์คือ MATLAB ส่วนใหญ่ไม่มีการพิมพ์ถือว่าเป็นตัวเลข ดังนั้นM>0เพียงแค่ทำหน้าที่เป็นหน้ากาก
บีกเกอร์

1
(x='aba')~=x'. มันยอดเยี่ยม @Luis!
Stewie Griffin

2

JavaScript (ES6), 99 94 ไบต์

a=>a.map((b,i)=>b.map((_,j)=>(g=(c=j,k=j)=>c[k]>0&&c[k])(a[i-1])+g(a[i+1])+g(b,j-1)+g(b,j+1)))

ยอมรับและส่งกลับอาร์เรย์แบบสองมิติ

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


ที่เกี่ยวข้อง: codegolf.stackexchange.com/a/78671/44704
ascx

รุ่น @Socialz Neils เก่ากว่า
ข้อบกพร่อง

@flawr บางคนอาจดูข้อความนี้ในลำดับโหวตไม่ใช่ลำดับวันที่โพสต์ดังนั้นฉันจึงให้ความเห็นคำตอบที่เกี่ยวข้อง อันนี้ยาวกว่าไบต์ของผู้ใช้ 4 ไบต์
ascx

ดังนั้นโดยทั่วไปคุณต้องการโฆษณาโพสต์อื่น ๆ ??
ข้อบกพร่อง

@Socialz ยาวอีก 4 ไบต์ใช่ ;-)
Neil



0

Mathcad, ไบต์

ใช้ 2D convolution แบบมาตรฐานของอาเรย์ที่ถูกกรองด้วยเคอร์เนล 3x3 ตัวแปรที่มีผลรวมองค์ประกอบเชิงลบและเคอร์เนลในแนวทแยงก็ถูกเพิ่มเข้ามาเป็นส่วนชดเชยสำหรับโปรแกรมที่ไม่ได้ทำงานอย่างน้อยไบต์

ป้อนคำอธิบายรูปภาพที่นี่


ยังไม่มีการนับจำนวนไบต์เนื่องจากการให้คะแนน Mathcad ยังไม่ได้ถูกกำหนด อย่างไรก็ตามการใช้แป้นพิมพ์ที่เทียบเท่ากันนั้นเป็นพื้นที่ 28 ไบต์โดยสมมติว่าอินพุตเมทริกซ์ไม่นับรวมทั้งหมด

โปรดทราบว่าสิ่งที่คุณเห็นในภาพด้านบนนั้นเป็นวิธีการป้อนและแสดงผลโซลูชันใน Mathcad


0

เยลลี่, 23 20 18 ไบต์

0;+ḊṖ
ZÇ€Z+Ç€
+AHÇ

ลองออนไลน์!

ขั้นตอนวิธี

สมมติว่ามีเพียงหนึ่งแถว: [1,2,3,4]

สมมุติว่า A คือผลลัพธ์ของการเติมศูนย์เช่น [0,1,2,3,4]

B คือผลลัพธ์ของการลบรายการแรกเช่น [2,3,4]

จากนั้นผลลัพธ์สุดท้ายคือ A + B เวกเตอร์จากนั้นลบรายการสุดท้าย

ตอนนี้อัลกอริทึมจะใช้สิ่งนี้กับทุกแถวเช่นเดียวกับทุกคอลัมน์จากนั้นหาผลรวมแบบเวกเตอร์ของพวกเขา

ไปที่แต่ละคอลัมน์! ฉันคิดว่า Jelly ไม่สนับสนุนสิ่งนี้ ...

คุณถูก. ดังนั้นฉันจึงเปลี่ยนมันใช้กับแต่ละแถวจากนั้นเปลี่ยนมันอีกครั้ง

อัลกอริทึมสำหรับการลบจำนวนลบ

ที่นี่คุณเพียงแค่เพิ่มหมายเลขของพวกเขาให้กับแต่ละหมายเลข มันจะกำจัดตัวเลขลบได้อย่างมีประสิทธิภาพในขณะที่เพิ่มจำนวนบวก จากนั้นก็ลดเมทริกซ์ทั้งหมดลงครึ่งหนึ่ง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.