ค้นหา submatrix ด้วยค่าเฉลี่ยที่น้อยที่สุด


21

คุณกำลังรับn โดยมเมทริกซ์ของจำนวนเต็มที่n, ม> 3 งานของคุณคือค้นหาเมทริกซ์ย่อย3คูณ3ที่มีค่าเฉลี่ยต่ำสุดและส่งออกค่านี้

กฎและคำชี้แจง:

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

กรณีทดสอบ:

35    1    6   26   19   24
 3   32    7   21   23   25
31    9    2   22   27   20
 8   28   33   17   10   15
30    5   34   12   14   16
 4   36   29   13   18   11 

Minimum mean: 14

100    65     2    93
  3    11    31    89
 93    15    95    65
 77    96    72    34

Minimum mean: 46.111

1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1

Minimum mean: 1

4   0   0   5   4
4   5   8   4   1
1   4   9   3   1
0   0   1   3   9
0   3   2   4   8
4   9   5   9   6
1   8   7   2   7
2   1   3   7   9

Minimum mean: 2.2222

นี่คือดังนั้นรหัสที่สั้นที่สุดในแต่ละภาษาชนะ ฉันแนะนำให้คนโพสต์คำตอบในภาษาที่ใช้ไปแล้วแม้ว่าจะไม่สั้นกว่าคำตอบแรก


นอกจากนี้ยังเป็นเรื่องที่น่าสนใจที่จะมีความท้าทายโดยไม่จำเป็นต้องติดแถวและคอลัมน์
Luis Mendo

ไม่ไปข้างหน้าตัวเอง :-)
Luis Mendo

คุณหมายถึงจำนวนเต็มในความหมายทางคณิตศาสตร์หรือประเภทข้อมูลคือเราจะทำเมทริกซ์ของอินทิกรัลลอยได้หรือไม่?
เดนนิส

ความรู้สึกทางคณิตศาสตร์ ก็เป็นอีกสิ่งหนึ่งที่ผมได้เรียนรู้ที่นี่ก็คือการที่คุณสามารถทำให้สมมติฐานเกี่ยวกับชนิดข้อมูลในภาษาต่างๆ ...
สตีวีกริฟฟิ

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

คำตอบ:



11

เยลลี่ , 11 9 ไบต์

+3\⁺€F÷9Ṃ

ที่บันทึกไว้ 2 ไบต์ขอบคุณที่ @ เดนนิส

ลองออนไลน์!

คำอธิบาย

+3\⁺€F÷9Ṃ  Main link. Input: 2d matrix
+3\        Reduce overlapping sublists of size 3 by addition
   ⁺€      Repeat previous except over each row
     F     Flatten
      ÷9   Divide by 9
        Ṃ  Minimum

1
โอ้แน่นอน _ _: D
Jonathan Allan

ฉันจะสนใจวุ้นรุ่นที่ไม่ได้ปรุงเพราะมันมีฟังก์ชั่นที่มีประโยชน์มากมาย
J Atkin

1
+3\⁺€F÷9Ṃบันทึกสองไบต์
เดนนิส

@Dennis Wow, นั่นคือการประมวลผล+3\ครั้งแรกและซ้ำกันเป็น+3\€? ไม่ได้คาดหวังว่าจะเกิดขึ้น
ไมล์

1
ตัวแยกวิเคราะห์เป็นพื้นฐานสแต็ก; \ปรากฏ3และ+และผลักดัน QuickLink +3\, ปรากฏ QuickLink และผลักดันสองฉบับแล้วปรากฏสำเนาสูงสุดและผลักดันรุ่นทำแผนที่
เดนนิส


8

MATL , 13 9 ไบต์

3thYCYmX<

ท่าเรือคำตอบของ @ rahnema1

ลองออนไลน์!

มันทำงานอย่างไร

พิจารณาการป้อนข้อมูล

[100 65  2 93;
   3 11 31 89;
  93 15 95 65;
  77 96 72 34]

ตัวอย่างเช่น.

3th   % Push [3 3]
      % STACK: [3 3]
YC    % Input matrix implicitly. Convert 3x3 sliding blocks into columns
      % STACK: [100   3  65  11;
                  3  93  11  15;
                 93  77  15  96;
                 65  11   2  31;
                 11  15  31  95;
                 15  96  95  72;
                  2  31  93  89;
                 31  95  89  65;
                 95  72  65  34]
Ym    % Mean of each column
      % STACK: [46.1111 54.7778 51.7778 56.4444]
X<    % Minimum of vector. Display implicitly
      % STACK: [46.1111]

7

Mathematica, 37 35 ไบต์

ขอบคุณ @MartinEnder สำหรับ 2 ไบต์!

Min@BlockMap[Mean@*Mean,#,{3,3},1]&

คำอธิบาย

Min@BlockMap[Mean@*Mean,#,{3,3},1]&
    BlockMap[                    ]&  (* BlockMap function *)
                        #            (* Divide the input *)
                          {3,3}      (* Into 3x3 matrices *)
                                1    (* With offset 1 *)
             Mean@*Mean              (* And apply the Mean function twice to
                                        each submatrix *)
Min                                  (* Find the minimum value *)

ลื่นมาก!
เกร็กมาร์ติน

5

Python 2 , 93 81 80 79 ไบต์

f=lambda M:M[2:]and min(sum(sum(zip(*M[:3])[:3],()))/9,f(M[1:]),f(zip(*M)[1:]))

ลองออนไลน์!

มันทำงานอย่างไร

Fเป็นฟังก์ชันเวียนที่จะนำรายชื่อของ tuples (หรืออื่น ๆ ที่จัดทำดัชนี 2D ใด ๆ iterable ที่แสดงถึงเมทริกซ์M ) และซ้ำคำนวณต่ำสุดของค่าเฉลี่ยของ3 × 3 submatrix ในมุมซ้ายบนและนำมาใช้ซ้ำเพื่อMโดยไม่ต้อง แถวแรกและMโดยไม่มีคอลัมน์แรก

f(M) ทำดังต่อไปนี้

  • ถ้าMมีน้อยกว่าสามแถวM[2:]เป็นรายการว่างเปล่าซึ่งfส่งคืน

    โปรดทราบว่าเนื่องจากn> 3ในการเรียกใช้ครั้งแรกการเริ่มต้นไม่สามารถส่งคืนรายการว่างได้

  • หากMมีสามแถวขึ้นไปM[2:]จะไม่ว่างเปล่าและเป็นจริงดังนั้นรหัสทางด้านขวาของandจะถูกเรียกใช้งานจะส่งกลับค่าขั้นต่ำสามค่าต่อไปนี้

    min(sum(sum(zip(*M[:3])[:3],()))/9

    M[:3]ผลตอบแทนถัวเฉลี่ยสามแถวแรกของM , zip(*...)transposes แถวและคอลัมน์ (ผลผลิตรายการ tuples ก), sum(...,())เชื่อม tuples ทั้งหมด (งานนี้เพราะ+เป็นเรียงต่อกัน) และsum(...)/9คำนวณค่าเฉลี่ยของรายการที่เกิดจากเก้าจำนวนเต็ม

    f(M[1:])

    ใช้fกับMแบบเรียกซ้ำโดยลบแถวแรกออก

    f(zip(*M)[1:])

    สลับแถวและคอลัมน์ลบแถวแรกของผลลัพธ์ (ดังนั้นคอลัมน์แรกของMและใช้fซ้ำกับผลลัพธ์ซ้ำ

โปรดทราบว่าเลเยอร์ที่ลบไปก่อนหน้านี้ในการเรียกซ้ำจะเป็นแถวเสมอดังนั้นการทดสอบว่าMมีแถวเพียงพอหรือไม่ก็จะเพียงพอเสมอ ..

ในที่สุดเราอาจคาดหวังว่าการโทรซ้ำแบบเรียกคืนบางครั้งอาจ[]เป็นปัญหา อย่างไรก็ตามใน Python 2เมื่อใดก็ตามที่nเป็นตัวเลขและAคือ iterable การเปรียบเทียบn < Aจะส่งกลับค่าTrueดังนั้นการคำนวณอย่างน้อยหนึ่งหมายเลขขึ้นไปและ iterables หนึ่งหรือมากกว่านั้นจะส่งกลับตัวเลขที่ต่ำที่สุดเสมอ


3

J , 21 ไบต์

[:<./@,9%~3+/\3+/\"1]

ลองออนไลน์!

วิธีการที่เหมาะสมในการดำเนินงานใน subarrays ใน J คือการใช้สาม ( _3รูปแบบ) ของการตัด;.ที่x (u;._3) yหมายถึงการใช้คำกริยาuในแต่ละ subarray เต็มรูปแบบของขนาดของอาร์เรย์x yโซลูชันที่ใช้ที่ต้องการเพียง 1 ไบต์ แต่จะมีประสิทธิภาพมากกว่าในอาร์เรย์ขนาดใหญ่กว่า

[:<./@,9%~3 3+/@,;._3]

ลองออนไลน์!

คำอธิบาย

[:<./@,9%~3+/\3+/\"1]  Input: 2d array M
                    ]  Identity. Get M
                  "1   For each row
              3  \       For each overlapping sublist of size 3
               +/          Reduce by addition
          3  \         For each overlapping 2d array of height 3
           +/            Reduce by addition
       9%~             Divide by 9
[:    ,                Flatten it
  <./@                 Reduce by minimum

1
ฉันชอบ[]รูปลักษณ์ที่เข้ากัน แต่ไม่จริง
ลินน์

1
@ ลินน์รอสักครู่นั่นไม่ถูกต้อง J ควรเบี่ยงเบนความสนใจของผู้ชมด้วยวงเล็บหลายอันที่ไม่สมดุล ควรใช้ a [หรือ|:)
ไมล์

2

เยลลี่ขนาด 18 ไบต์

พลาดกลลวงที่ใช้ไมล์เป็นคำตอบในการใช้การลด n-wise แบบสะสมนอกจากนี้บรรทัดแรกทั้งหมดสามารถถูกแทนที่ด้วย+3\11

ẆµL=3µÐfS€
ÇÇ€FṂ÷9

ลองออนไลน์!

สำรวจรายการย่อยที่อยู่ติดกันทั้งหมดตัวกรองเพื่อเก็บเฉพาะความยาว 3 และผลรวม (เวกเตอร์ที่) จากนั้นทำซ้ำสำหรับแต่ละรายการผลลัพธ์เพื่อให้ได้ผลรวมของเมทริกซ์ย่อย 3 ทั้งหมด 3 และในที่สุดจะทำให้แบนเหล่านั้นเป็นรายการเดียว หารด้วย 9 (จำนวนองค์ประกอบที่สร้างผลรวมขั้นต่ำนี้)


ฉันชอบแนวคิดการกรองรายการย่อย มีประโยชน์ถ้าขนาดรายการย่อยนั้นขึ้นอยู่กับค่าที่คำนวณ
ไมล์

2

Pyth, 19 ไบต์

chSsMsMs.:R3C.:R3Q9

โปรแกรมที่รับอินพุตของรายการรายการและพิมพ์ผลลัพธ์

ชุดทดสอบ

มันทำงานอย่างไร

[คำอธิบายมาในภายหลัง]



1

Python 2, 96 ไบต์

h=lambda a:[map(sum,zip(*s))for s in zip(a,a[1:],a[2:])]
lambda a:min(map(min,h(zip(*h(a)))))/9.

กรณีทดสอบที่Repl.it

ฟังก์ชั่นที่ไม่มีชื่อการรับรายการa- แถวของเมทริกซ์

ฟังก์ชั่นตัวช่วยhซิปผ่านชิ้นส่วนที่อยู่ติดกันสามชิ้นและแมปฟังก์ชันผลรวมข้ามzip(*s)แต่ละส่วน ซึ่งจะส่งผลในการสรุปความสูงทั้งหมดสามชิ้นของคอลัมน์เดี่ยว

ฟังก์ชันที่ไม่มีชื่อเรียกฟังก์ชันผู้ช่วยสลับและเรียกฟังก์ชันผู้ช่วยอีกครั้งในผลลัพธ์จากนั้นค้นหาค่าต่ำสุดของแต่ละค่าและค่าต่ำสุดของผลลัพธ์จากนั้นหารด้วย9.เพื่อให้ได้ค่าเฉลี่ย


1

JavaScript (ES6), 107 98 96 ไบต์

Mฟังก์ชั่นที่คำนวณผลรวมของแฝดมากกว่าแถวแล้วเรียกตัวเองที่จะทำในสิ่งเดียวกันซ้ำคอลัมน์การติดตามค่าต่ำสุด

f=m=>m.map((r,y)=>r.map((v,x)=>M=(z[x<<9|y]=v+=r[x+1]+r[x+2])<M?v:M),z=[M=1/0])&&m[1]?f([z]):M/9

JS นั้นค่อนข้างละเอียดสำหรับสิ่งของประเภทนั้นและขาดzip()วิธีการเนทีฟ ฉันใช้เวลาค่อนข้างนานในการบันทึกเพียงโหลจำนวนมากกว่าวิธีการที่ไร้เดียงสามากขึ้น (แต่วิธีที่สั้นกว่าอาจมีอยู่)

รุ่นที่ไม่ใช่แบบเรียกซ้ำ 103 ไบต์

บันทึก 2 ไบต์ด้วยความช่วยเหลือของ Neil

m=>m.map((r,y)=>y>1?r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)):M=1/0)&&M/9

กรณีทดสอบ


ฉันค่อนข้างสนใจวิธีที่เรียกว่า na yourve ของคุณเนื่องจากสิ่งที่ดีที่สุดที่ฉันสามารถทำได้ด้วยวิธีการที่บริสุทธิ์พอสมควรคือ 113 ไบท์:(a,b=a.map(g=a=>a.slice(2).map((e,i)=>a[i]+a[i+1]+e)))=>eval(`Math.min(${b[0].map((_,i)=>g(b.map(a=>a[i])))})`)/9
นีล

@ Neil ฉันคิดว่ามันเป็นสิ่งที่ใกล้เคียงm=>m.map((r,y)=>r.map((v,x)=>[..."12345678"].map(i=>v+=(m[y+i/3|0]||[])[x+i%3])&&(M=v<M?v:M)),M=1/0)&&M/9แม้ว่าฉันจะคิดว่าความพยายามครั้งแรกของฉันยิ่งใหญ่กว่านั้น
Arnauld

ที่ดี m=>m.map((r,y)=>y>1&&r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)),M=1/0)&&M/9แต่ผมก็สามารถที่จะโกนไบต์:
Neil

@ นีลเย็น วิธีนี้ช่วยให้สามารถบันทึกได้อีกหนึ่งไบต์ด้วยm=>m.map((r,y)=>y>1?r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)):M=1/0)&&M/9
Arnauld


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