ดัชนีผลรวมและดึงเมทริกซ์ของฉัน


9

ดัชนีผลรวมและดึงเมทริกซ์ของฉัน

ให้อาร์เรย์ matrix / 2d ในภาษาที่คุณต้องการ

การป้อนข้อมูล:

  • เมทริกซ์จะมีความยาวคี่เสมอ
  • เมทริกซ์จะเป็นสี่เหลี่ยมจัตุรัสอย่างสมบูรณ์
  • ค่าเมทริกซ์สามารถเป็นจำนวนเต็มใด ๆ ในภาษาของคุณ (บวกหรือลบ)

ตัวอย่าง:

1  2  3  4  5  6  7
2  3  4  5  6  7  8
3  4  50 6  7  8  9
4  5  6 100 8  9  10
5  6  7  8 -9  10 11
6  7  8  9  10 11 12
7  8 900 10 11 12 0

คำนิยาม:

  • "หมายเลขกลาง" ถูกกำหนดให้เป็นหมายเลขที่มีตัวเลขจำนวนเดียวกันทางซ้ายขวาขึ้นและลง

ในกรณีนี้มันอยู่ตรงกลาง 100

  • "outer shell" คือชุดของตัวเลขที่ดัชนี x และ y ของพวกเขาคือหรือ 0 หรือขนาดเมทริกซ์

1  2  3  4  5  6  7
2                 8
3                 9
4                 10
5                 11
6                 12
7  8 900 10 11 12 0

งานของคุณ:

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

ตัวอย่างเช่นแถวเดียว

4  5  6  7  8

สำหรับแต่ละหมายเลข

number * index + number * index.....

4*1 + 5*2 + 6*3 + 7*4 + 8*5 => 100

ตัวอย่าง:

 2 -3 -9  4  7  1  5  => 61
-2  0 -2 -7 -7 -7 -4  => -141
 6 -3 -2 -2 -3  2  1  => -10
 8 -8  4  1 -8  2  0  => -20
-5  6  7 -1  8  4  8  => 144
 1  5  7  8  7 -9 -5  => 10
 7  7 -2  2 -7 -8  0  => -60
                         |
78 65 60 45 -15 -89 10   => 154
                     |
                     => -16
  • สำหรับแถวและคอลัมน์ทั้งหมดคุณรวมค่าเหล่านี้ ..
  • ตอนนี้คุณหาผลรวมเหล่านี้ด้วย => 154-16 = 138
  • คุณเพิ่มหมายเลขนั้นใน "หมายเลขกลาง" และลบ "เปลือกนอก" ของเมทริกซ์

 0 -2 -7 -7 -7     => -88
-3 -2 -2 -3  2     => -15
-8  4 1+138 -8  2  => 395
 6  7 -1  8  4     => 69
 5  7  8  7 -9     => 26

19 69 442 30 -26

ทำเช่นนี้จนคุณท้ายด้วยหมายเลขเดียว

-2 -2 -3     => -15
 4  1060 -8  => 2100
 7 -1  8     => 29

27 2115 5
  • เพิ่ม 2114 + 2147 ถึง 1060
  • ลบ "outer shell" ออกและรับ 5321
  • ตอนนี้เรามีหมายเลขเดียวเหลืออยู่

นี่คือผลลัพธ์!

กรณีทดสอบ:

-6

-6

-7 -1  8
-4 -6  7
-3 -6  6

2

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

-365

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

17611

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

-28473770

นี่เป็นความท้าทาย codegolf ดังนั้นโปรแกรมที่มีจำนวนไบต์ต่ำสุดจะเป็นผู้ชนะ


คุณถูกต้องพิมพ์ผิด
downrep_nation

3
เหตุใดตัวเลขติดลบจึงเป็นปัญหา ฉันไม่คิดว่าความท้าทายควรปรับเปลี่ยนสำหรับ esolangs แต่บางทีวิธีอื่น ๆ ที่เหมาะสมกว่า
downrep_nation

@ LuisMendo ฉันคิดว่ามันไม่ใช่ปัญหากฎ "ค่าเมทริกซ์สามารถเป็นจำนวนเต็มใด ๆ ในภาษาของคุณ" หมายถึงฉันว่าหากภาษาของคุณไม่มีตัวเลขติดลบก็ไม่ควรสนับสนุนพวกเขา
ทำให้เสียชีวิต

จริงแล้วมันถูกต้อง แต่กรณีทดสอบจะไม่ทำงานอย่างถูกต้อง
downrep_nation

2
"ฉันไม่คิดว่าความท้าทายควรปรับเปลี่ยนสำหรับ esolangs แต่อาจเป็นวิธีอื่นที่เหมาะสมกว่า" ซึ่งควรจะแกะสลักด้วยหิน
edc65

คำตอบ:


4

MATL , 36 34 ไบต์

tnq?`t&+stn:*sytn2/)+ 7M(6Lt3$)tnq

อินพุตเป็นอาร์เรย์ 2D ที่มี;ตัวคั่นแถว

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

tnq       % Take input. Duplicate, get number of elements, subtract 1
?         % If greater than 0
  `       %   Do...while
    t     %     Duplicate
    &+    %     Sum matrix with its transpose
    s     %     Sum each column. Gives a row vector
    tn:   %     Vector [1 2 ...] with the same size
    *     %     Multiply element-wise
    s     %     Sum of vector. This will be added to center entry of the matrix
    y     %     Duplicate matrix
    tn2/  %     Duplicate, get half its number of elements. Gives non-integer value
    )     %     Get center entry of the matrix, using linear index with implicit rounding
    +     %     Add center entry to sum of previous vector
    7M    %     Push index of center entry again
    (     %     Assgined new value to center of the matrix
    6Lt   %     Array [2 j1-1], twice. This will be used to remove shell
    3$)   %     Apply row and col indices to remove outer shell of the matrix
    tnq   %     Duplicate, number of elements, subtract 1. Falsy if matrix has 1 entry
          %   End do...while implicitly. The loop is exited when matrix has 1 entry
          % End if implicitly
          % Display stack implicitly

4

Python 2.7, 229 ไบต์

นี่เป็นความพยายามครั้งแรกของฉันในบางสิ่งเช่นนี้ดังนั้นหวังว่าฉันจะปฏิบัติตามกฎทั้งหมดด้วยการส่งนี้ นี่เป็นเพียงฟังก์ชันที่ใช้ในรายการของรายการเป็นพารามิเตอร์ ฉันรู้สึกว่าผลรวมและรายการความเข้าใจอาจสั้นลงเล็กน้อย แต่มันยากเกินไปสำหรับฉัน : D

def r(M):
  t=len(M)
  if t==1:return M[0][0]
  M[t/2][t/2]+=sum(a*b for k in [[l[x] for l in M]for x in range(0,t)]for a,b in enumerate(k,1))+sum([i*j for l in M for i,j in enumerate(l,1)])
  return r([p[+1:-1]for p in M[1:-1]])

ขอบคุณสำหรับ Easterly Irk ที่ช่วยให้ฉันโกนหนวดออกไปไม่กี่ไบต์


1
คุณสามารถลบช่องว่างสองสามอันระหว่างโอเปอเรเตอร์ ( ...) + sum([i*j...-> ...)+sum([i*j...) แต่โดยรวมแล้วโพสต์แรกที่ยอดเยี่ยม !!!!
Rɪᴋᴇʀ

oooh คิดถึงสิ่งนั้น ขอบคุณ!
Jeremy

1
นอกจากนี้ยังใช้...]for ...งานได้ คุณสามารถลบที่ว่างอย่างน้อย 2 อัน (จุดสิ้นสุดของรายการที่นิยมสำหรับวง)
Rɪᴋᴇʀ

3

C #, 257 ไบต์

นี่คือคำตอบที่ไม่ใช่ esolang

void f(int[][]p){while(p.Length>1){int a=p.Length;int r=0;for(int i=0;i<a;i++)for(int j=0;j<a;j++)r+=(i+j+2)*p[i][j];p[a/2][a/2]+=r;p=p.Where((i,n)=>n>0&&n<p.Length-1).Select(k=>k.Where((i,n)=>n>0&&n<p.Length-1).ToArray()).ToArray();}Console.Write(p[0][0]);

ungolfed:

void f(int[][]p)
    {
        while (p.Length>1)
        {
            int a=p.Length;
            int r=0; //integer for number to add to middle
            for (int i = 0; i < a; i++)
                for (int j = 0; j < a; j++)
                    r +=(i+j+2)*p[i][j]; //add each element to counter according to their 1 based index
            p[a / 2][a / 2] += r; //add counter to middle
            p = p.Where((i, n) => n > 0 && n < p.Length - 1).Select(k => k.Where((i, n) => n > 0 && n < p.Length - 1).ToArray()).ToArray(); //strip outer shell from array
        }
        Console.Write(p[0][0]); //print last and only value in array
    }

2
เฮ้ตอนนี้ J ไม่ใช่ esolang
ไมล์

นี้ไม่ได้รวบรวมถ้าคุณไม่ได้รวมและusing System.Linq using Systemฉันไม่แน่ใจว่ามันเป็นไปตามกฎ
Yytsi

มันไม่ได้เป็นโปรแกรมเต็มรูปแบบมีเพียงฟังก์ชั่นเท่านั้นดังนั้นมันก็โอเคเท่าที่ฉันรู้ ฉันหมายความว่าฉันจะต้องรวม App.config และไบต์ทั้งหมดในคุณสมบัติและ makefile หรือไม่ ไม่
downrep_nation

@downrep_nation มันแปลกเพราะฉันเห็นบางคนรวมพวกมันไว้ในแหล่งเมื่อมันเป็นแค่ฟังก์ชั่นและพวกเขาได้รวมไบต์ไว้ในคะแนน
Yytsi

System.Linqตอนนี้เมื่อฉันคิดเกี่ยวกับมันฉันในบรรทัดที่คุณควรนำเข้าน้อย ภาษาอื่นที่ต้องนำเข้าเพื่อใช้คุณสมบัติบางอย่างจะต้องผ่านกระบวนการเดียวกันดังนั้นฉันคิดว่ามันไม่ยุติธรรมที่จะถือว่าทุกโมดูลถูกโหลดไปยังหน่วยความจำใน C #
Yytsi

2

J, 66 ไบต์

([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)

วิธีการตรงไปตรงมาตามกระบวนการที่อธิบายไว้ในความท้าทาย

[:+/^:2#\*]+|:ได้รับผลรวม ]+(i.@,~=](]+*)<.@-:)@#*เป็นวิธีที่น่าเกลียดโดยเฉพาะอย่างยิ่งการเพิ่มศูนย์ด้วยผลรวม [:}:@}."1@}:@}.ลบเปลือกนอก อาจมีวิธีที่ดีกว่าในการทำเช่นนี้

การใช้

   f =: ([:}:@}."1@}:@}.]+(i.@,~=](]+*)<.@-:)@#*[:+/^:2#\*]+|:)^:(<.@-:@#)
   f _6
_6
   f _7 _1 8 , _4 _6 7 ,: _3 _6 6
2
   f 6 7 _2 5 1 , _2 6 _4 _2 3 , _1 _4 0 _2 _7 , 0 1 4 _4 8 ,: _8 _6 _5 0 2 
_365
   f 8 3 5 6 6 _7 5 , 6 2 4 _2 _1 8 3 , 2 1 _5 3 8 2 _3 , 3 _1 0 7 _6 7 _5 , 0 _8 _4 _9 _4 2 _8 ,8 _9 _3 5 7 8 5 ,: 8 _1 4 5 1 _4 8
17611
   f (13 13 $ _9 _7 2 1 1 _2 3 _7 _3 6 7 1 0 _7 _8 _9 _2 7 _2 5 4 7 _7 8 _9 8 _4 4 _1 0 1 5 _3 7 1 _2 _9 4 8 4 8 1 _1 0 7 4 6 _9 3 _9 3 _9 _6 _8 _4 _8 _9 2 1 1 _8 8 2 6 _4 _8 _5 1 1 2 _9 3 7 2 5 _6 _1 2 _8 _5 _7 _4 _9 _2 5 0 2 _4 2 0 _2 _3 _6 _3 2 _9 8 1 _5 5 0 _4 _1 _9 _9 _9 _8 0 _5 _7 1 _2 1 _4 _1 5 7 _6 _9 4 _2 8 7 _9 _5 3 _1 1 8 4 _6 6 _3 _4 3 5 6 8 _2 5 _1 _7 _9 _1 7 _9 4 6 7 6 _8 5 1 0 _3 0 _3 _2 5 _4 0 0 0 _1 7 4 _9 _4 2)
_28473770

2

Brachylogขนาด 114 ไบต์

{l1,?hh.|:{:Im:I:?:{[L:I:M]h:JmN,Ll:2/D(IJ,M{$\:?c:{:{:ImN,I:1+:N*.}f+.}a+.}:N+.;'(DIJ),N.)}f.}f:7a$\:7a&.}.
brbr.

ฉันประหลาดใจที่สิ่งนี้สามารถใช้งานได้ด้วยความซื่อสัตย์ อย่างน้อยฉันก็รู้ว่า Brachylog จำเป็นต้องมี "การเปลี่ยนแปลงค่าขององค์ประกอบนั้น" ในตัวแม้ว่า ...

ตัวอย่างการใช้งาน:

?- run_from_file('code.brachylog', '[[0:_2:_7:_7:_7]:[_3:_2:_2:_3:2]:[_8:4:139:_8:2]:[6:7:_1:8:4]:[5:7:8:7:_9]]', Z).
Z = 5321 .

คำอธิบาย

เวอร์ชันที่อ่านได้มากขึ้น (และอีกต่อไป):

{l1,?hh.|:2f:7a$\:7a&.}.
:Im:I:?:3f.
[L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.)
$\:?c:5a+.
:6f+.
:ImN,I:1+:N*.
brbr.

ฉันแค่จะอธิบายคร่าวๆว่าแต่ละเพรดิเคต (เช่นแต่ละบรรทัดยกเว้นอันแรกซึ่งเป็นเพรดิเคตหลัก + ภาคที่ 1) ทำ:

  • เพรดิเคตหลัก + เพรดิเคต 1 {l1,?hh.|:2f:7a$\:7a&.}.: หากอินพุตมีเพียงหนึ่งแถวให้สิ้นสุดอัลกอริทึมและส่งกลับค่าเดียว หาแถวทั้งหมดที่ตรงกับเพรดิเคต 2 จากนั้นใช้เพรดิเคต 7 บนเมทริกซ์ที่ได้จากนั้นเลือกเพรดิเคต 7 ในการเคลื่อนย้ายแล้วเรียกซ้ำ

  • เพรดิเคต 2 :Im:I:?:3f.: ใช้Iแถวที่ของเมทริกซ์ค้นหาค่าทั้งหมดของแถวนั้นซึ่งตรงกับเพรดิเคต 3 ด้วยIและเมทริกซ์เป็นอินพุตเพิ่มเติม

  • ภาคแสดงที่ 3 [L:I:M]h:JmN,Ll:2/D(IJ,M:4&:N+.;'(DIJ),N.): LคือแถวIเป็นดัชนีของแถวMคือเมทริกซ์ Nเป็นองค์ประกอบของJ TH LหากความยาวของLหารด้วย 2 เท่ากับทั้งสองIและJจากนั้นเอาท์พุทคือผลรวมของNกับผลของการทำนาย 4 ในเมทริกซ์ Nมิฉะนั้นการส่งออกเป็นเพียง เพรดิเคตที่จำเป็นนี้จะสร้างเมทริกซ์ใหม่โดยมีข้อยกเว้นที่องค์ประกอบกลางได้รับการเพิ่มเข้าไปในผลรวม

  • เพรดิเคต 4 $\:?c:5a+.: ใช้เพรดิเคต 5 ในแต่ละแถวและคอลัมน์ของเมทริกซ์รวมผลลัพธ์ด้วยผลรวมของผลลัพธ์

  • ภาคที่ 5 :6f+.: ค้นหาผลลัพธ์ที่ถูกต้องทั้งหมดของภาคที่ 6 บนแถวรวมเอาท์พุทรวมกับผลรวมของรายการผลลัพธ์

  • กริยา 6 :ImN,I:1+:N*.Nเป็นIค่า TH N * (I+1)ของแถวรวมกันกับการส่งออก

  • ภาคที่ 7 brbr.: ลบแถวแรกและแถวสุดท้ายของเมทริกซ์


2

APL, 56 ตัวอักษร

{{1 1↓¯1 ¯1↓⍵+(-⍴⍵)↑(⌈.5×⍴⍵)↑+/(⍵⍪⍉⍵)+.×⍳≢⍵}⍣(⌊.5×≢⍵)⊣⍵}

เป็นภาษาอังกฤษ:

  • ⍣(⌊.5×≢⍵) ทำซ้ำ "ครึ่งขนาดของมิติที่ถูกปัดเศษ" - เวลา
  • (⍵⍪⍉⍵)+.×⍳≢⍵ ผลคูณภายในของเมทริกซ์และทรานสโพสของมันด้วยเวกเตอร์ดัชนี
  • (-⍴⍵)↑(⌈.5×⍴⍵)↑ ผลการแปลงในเมทริกซ์เบาะด้วย 0s
  • 1 1↓¯1 ¯1↓ ลบเปลือกนอก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.