เมทริกซ์ติดตามทั่วไป


23

แรงบันดาลใจ

ให้ (โดยวิธีการใด ๆ ):

  • สองอาร์กิวเมนต์ (หรืออาร์กิวเมนต์เดียวประกอบด้วยรายการสององค์ประกอบ) ฟังก์ชั่นกล่องดำ , (input และ output คือ 1, 2, 3, ... )f: ℤ+ × ℤ+ → ℤ+
  • เมทริกซ์จำนวนเต็มบวกอย่างเคร่งครัดโดยมีอย่างน้อยสองแถวและสองคอลัมน์

กลับเมทริกซ์ของร่องรอยฟังก์ชั่น

คืออะไรร่องรอยฟังก์ชั่น ?

เมทริกซ์ติดตามปกติคือผลรวมของเส้นทแยงมุมใหญ่ (บนซ้ายไปขวาล่าง) ของเมทริกซ์:

[[1,2,3],[4,5,6],[7,8,9]]→การ[1,5,9]→การ1+5+9→การ15

แต่แทนที่จะรวมเราต้องการนำfไปใช้ตามแนวทแยง:

[[1,2,3],[4,5,6],[7,8,9]]→การ[1,5,9]→การf(f(1,5),9)หรือf(1,f(5,9))

โปรดระบุว่าคุณใช้จากซ้ายไปขวาหรือจากขวาไปซ้าย

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

ตัวอย่าง

f(x,y) = xy, [[1,2,3],[4,5,6],[7,8,9]]→การ1×5×9→การ45

f(x,y) = xy, [[1,2,3],[4,5,6],[7,8,9]]→การ →การ1591

f(x,y) = x-y, [[4,5,6],[1,2,3]]→การ4-2→การ2

f(x,y) = (x+y)⁄2, [[2,3,4],[5,6,7],[8,9,10]]5หรือ7

f(x,y) = x+2y, [[1,2,3],[4,5,6],[7,8,9]]47หรือ29

f(x,y) = max(x,y), [[1,2,3],[4,5,6],[7,8,9]]→การmax(1,5,9)→การ9

f(x,y) = 2x, [[1,2,3],[4,5,6],[7,8,9]]2หรือ4

f(x,y) = lcm(x,y), [[2,2,2],[2,2,3],[2,3,3],[4,4,4]]→การlcm(2,2,3)→การ6

การดำเนินการอ้างอิง


เส้นทแยงมุมของ[[2,2,2],[2,2,3],[2,3,3],[4,4,4]]อะไร
มนุษย์โดยสิ้นเชิง

3
@totallyhuman:[2,2,3]
Emigna

1
บ้าฉันอ่านชื่อเป็น "มึนงงเมทริกซ์มึนงง" และผิดหวังอย่างมากเมื่อโหลดหน้าเว็บ
tar

คำตอบ:


9

R , 40 30 ไบต์

function(m,F)Reduce(F,diag(m))

ลองออนไลน์!

ตรวจสอบกรณีทดสอบ

เคลื่อนที่ไปตามแนวทแยงมุมดังนั้นจากซ้ายไปขวาในกรณีนี้ สำหรับตัวดำเนินการทางคณิตศาสตร์คุณสามารถใช้"+"หรือ backticks รอบตัวดำเนินการ ( +,*,-,%/%,^,%%)

ตรงไปตรงมา: Reduceมีค่า R เท่ากับ a fold, และเส้นทแยงมุมของเมทริกซ์คือองค์ประกอบเหล่านั้นa_ijที่ซึ่งi==j, ซึ่ง, rowและcolดัชนี umn เหมือนกัน diagมีพฤติกรรมที่เหมาะสมสำหรับเมทริกซ์ที่ไม่ใช่สแควร์


8

Haskell , 39 ไบต์

ขอบคุณ @Laikoni ที่ช่วยฉันแก้ไขปัญหาที่ไม่ถูกต้องก่อนหน้านี้!

f!m=foldl1 f[h|h:_<-zipWith drop[0..]m]

เชื่อมโยงไปทางซ้ายลองออนไลน์! (แทนที่foldl1ด้วยfoldr1สำหรับการเชื่อมโยงด้านขวา)


แล้วไงfoldl1 f$zipWith(!!)m[0..]ล่ะ
ภูมิใจ haskeller

@proudhaskeller: นั่นคือสิ่งที่ผู้อื่นพยายามแล้ว แต่ที่ล้มเหลวที่ไม่ตารางการฝึกอบรม ..
ბიმო

5

Mathematicaขนาด 16 ไบต์

-1 ไบต์ขอบคุณ Martin Ender

#~Tr~Fold[g]@*0&

ลองออนไลน์!

โซลูชันสำรอง 17 ไบต์

Fold[g]@*Diagonal

ลองออนไลน์!


17 ไบต์ (ฟังก์ชั่นกล่องดำสามารถสันนิษฐานได้ภายใต้ชื่อที่กำหนด)
นาย Xcoder

นั่น@*{}ไวยากรณ์ไม่ได้ทำให้ความรู้สึกมาก (คุณอาจจะมีความหมาย@*List) แต่ความจริงที่ว่ามันทำงานอยู่แล้วสวยเย็น ในความเป็นจริงมันหมายความว่าคุณสามารถแทนที่{}ด้วย0และบันทึกไบต์
Martin Ender

@ มาร์ตินฉันจริง ๆ แล้วมีListครั้งแรก แต่ฉันพยายาม{}เพียงห่ามันและรู้สึกประหลาดใจอย่างยิ่งว่ามันทำงาน เข้าท่า แต่0ทำงานอย่างไร? o0
มนุษย์ทั้งหมด

1
@totallyhuman {}วิธีเดียวกับ ขณะนี้คุณใช้{}เป็นฟังก์ชัน (หรือจริง ๆ แล้วเป็น "หัว" โดยใช้คำศัพท์ Mathematica) หากคุณใช้ยาสามัญที่fนั่นคุณจะได้รับf[1,2,3](ถ้านั่นคือเส้นทแยงมุม) แต่ด้วยการที่คุณได้รับ{} {}[1,2,3]นั่นคือการแสดงออกที่ไร้ความหมายอย่างสมบูรณ์ แต่หัวสามารถแสดงออกโดยพลการเองและถ้า Mathematica ไม่รู้ว่าจะทำอย่างไรกับพวกเขา ฟังก์ชั่นการจัดการรายการส่วนใหญ่ของ Mathematica ใช้งานได้จริงกับการแสดงออกด้วยหัวตามอำเภอใจและในกรณีของFoldหัวจะถูกละเว้น [tbc]
Martin Ender

ดังนั้นคุณสามารถใช้0เป็นหัวแทนซึ่งให้0[1,2,3]ซึ่งยังไม่มีความหมาย แต่ทำงานเหมือนกันทั้งหมด
Martin Ender

4

คู่ , 61 57 53 ไบต์

function m=g(f,m)for i=diag(m)'(2:end)m=f(m(1),i);end

ลองออนไลน์!

กำหนดฟังก์ชั่นgซึ่งจะมีการจัดการที่ฟังก์ชั่นและเมทริกซ์f mในการคำนวณซ้ำครั้งแรกให้m(1)ส่งคืนองค์ประกอบเมทริกซ์บนซ้าย หลังจากนั้นมันเพิ่งกลับmมา



@Giuseppe นั่นคือสิ่งที่ฉันทำกับรุ่นเริ่มต้น 61 ไบต์ของฉัน แน่นอนฉันควรจะรวมคะแนนที่แข็งแกร่งของรุ่น 57- และ 61 byte ของฉันซึ่งจะให้คำตอบ 53 ไบต์ ขอบคุณที่ทำให้ฉันดูอีกครั้ง!
Sanchises


3

Haskell , 47 45 42 ไบต์

f%((h:t):r)|[]<-t*>r=h|x<-tail<$>r=f h$f%x

ลองออนไลน์! กำหนดฟังก์ชั่น(%)ที่ใช้ฟังก์ชั่นและเมทริกซ์เป็นรายการของรายการเป็นอินพุต

ฟังก์ชั่นนี้พับจากขวาไปซ้าย:

f % [[1,2,3], -> f 1 ( f % [[5,6],   -> f 1 ( f 5 ( f % [[9]] ) ) -> f 1 ( f 5 ( f 9 ) ) )
     [4,5,6],               [8,9]] )
     [7,8,9]]

f % ((h:t):r)              -- (h:t) is the first row and r the remaining rows
 | [] <- t *> r = h         -- a shorter way of checking wether t==[] or r==[]
 | x<-tail<$>r = f h $ f%x -- apply f to h and the result of recursively calling (%) on
                           -- the remaining matrix with the first column removed

แก้ไข: -2 ไบต์ขอบคุณBMOและ -3 ไบต์ขอบคุณZgarb !


1
43 ไบต์โดยใช้และลดความซับซ้อนเงื่อนไขด้วย$ *>
Zgarb

@Zarb ความคิดที่ดีที่จะใช้*>!
Laikoni

3

APL (Dyalog Unicode) 7 ไบต์ ( SBCS ของAdám )

⎕/1 1⍉⎕

ลองออนไลน์!

-3 ขอบคุณข้อเสนอแนะในการแปลงนี้ไปยังโปรแกรมเต็มรูปแบบโดยอดัม

จากขวาไปซ้าย.


ไม่จำเป็นต้องใช้ SBCS ของAdámที่นี่: คุณสามารถใช้ Dyalog Classic ได้
Zacharý

@ Zacharýสิ่งที่ฉันตอบใน Dyalog Unicode นั้น Classic กำลังเลิกใช้อยู่ตลอดเวลา
Erik the Outgolfer

ไม่ใช่เพจรหัสถึงแม้ว่าเพจเพจจะมีชีวิตอยู่
Zacharý

@ Zacharýดีกว่ากัน : P
Erik the Outgolfer




2

JavaScript (ES6), 58 56 ไบต์

g=(f,a,r=a[i=0][0],e=a[++i]&&a[i][i])=>e?g(f,a,f(r,e)):r

พับจากซ้ายไปขวา แก้ไข: บันทึก 2 ไบต์โดยใช้ความจริงที่ว่าอาร์เรย์เป็นค่าบวกอย่างเคร่งครัด โซลูชันสำรองขนาด 56 ไบต์เช่นกัน:

(f,a,g=r=>(e=a[++i]&&a[i][i])?g(f(r,e)):r)=>g(a[i=0][0])

มันดูไม่เหมือนที่คุณต้องการ1/และคุณสามารถบันทึกอีก 2 f=>a=>(h=r=>(e=a[++i]&&a[i][i])?h(f(r,e)):r)(a[i=0][0])ไบต์โดยการย้ายสิ่งบางอย่างรอบ: TIO
Shaggy

@ Shaggy โอ้มันเป็นแง่บวกอย่างเคร่งครัดฉันไม่เคยเห็น
Neil

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

@Shaggy ที่จริงฉันคิดว่ามันจะประหยัด 4 ไบต์ (2x f,) จากรุ่นแรก?
Neil

คุณถูก; ขออภัยลืมนับf,เมื่อโทรgอีกครั้ง
ขนปุย

2

JavaScript ขนาด 46 ไบต์

f=>a=>a.reduce((p,l,i)=>l[i]?f(p[0]|p,l[i]):p)

ขอบคุณ @Shaggy ใช้ bitwise หรือบันทึกหนึ่งไบต์ นั่นคือเวทมนตร์


ดูเหมือนจะไม่ทำงานหากเมทริกซ์มีแถวมากกว่าคอลัมน์
Shaggy

@Shaggy เศร้า 47 ไบต์ตอนนี้ ...
TSH

ใช่นั่นคือสิ่งที่ฉันมีเช่นกัน เป็นเพียงเกี่ยวกับการแก้ไขการแก้ไขในการแก้ปัญหาของฉัน แต่คุณชนะฉันเกินไป :( ผมคิดว่าคุณจะได้รับหนึ่งไบต์กลับ แต่โดยใช้ค่าที่เหมาะสมหรือแม้.
ปุย

@Shaggy ดังนั้นมายากล
TSH

ลืมพูดถึง: เห็นได้ชัดว่าเราสามารถสันนิษฐานได้ว่าฟังก์ชั่นกล่องดำถูกกำหนดให้กับตัวแปรที่กำหนดไว้ล่วงหน้าเพื่อให้คุณสามารถบันทึก 3 ไบต์หากคุณต้องการใช้ประโยชน์จากมัน
ขนปุย

2

Java 8, 88 81 70 ไบต์

m->{int r=m[0][0],i=1;try{for(;;)r=f(r,m[i][i++]);}finally{return r;}}

พับไป[[1,2,3],[4,5,6],[7,8,9]]f(f(1,5),9)

-7 ไบต์อ้อมขอบคุณที่@KamilDrakariโดยใช้เคล็ดลับที่คล้ายกันในขณะที่เขาทำในC # คำตอบของเขา : แทนที่จะมีขอบเขตสูงสุดสำหรับวงตามแถว / ArrayIndexOutOfBoundsExceptionคอลัมน์เพียงแค่ลองจับ
-11 ไบต์แทนที่ด้วยcatch(Exception e)finally

ลองออนไลน์

คำตอบเก่า 88 ไบต์:

m->{int r=m[0][0],i=1;for(;i<Math.min(m.length,m[0].length);)r=f(r,m[i][i++]);return r;}

ลองออนไลน์

คำอธิบาย:

m->{                   // Method with integer-matrix parameter and integer return-type
  int r=m[0][0],       //  Start the result at the integer of position 0,0 (0-indexed)
      i=1;             //  Start the index at 1 (0-indexed)
  try{for(;;)          //  Loop indefinitely
    r=f(r,m[i][i++]);} //   Call f with the result + next diagonal cell as arguments
                       //   (and increase `i` by 1 with `i++` afterwards)
  finally{             //  If an ArrayIndexOutOfBoundsException occurred we're done,
   return r;}}         //   in which case we return the result-integer

รูปแบบอินพุตของกล่องดำ:

ถือว่าฟังก์ชั่นที่มีชื่อint f(int x,int y)อยู่ซึ่งได้รับอนุญาตตามคำตอบเมตานี้

ฉันมีระดับนามธรรมTestที่มีฟังก์ชั่นเริ่มต้นf(x,y)เช่นเดียวกับแลมบ์ดาข้างต้น:

abstract class Test{
  int f(int x,int y){
    return x+y;
  }

  public java.util.function.Function<int[][],Integer>c=
    m->{int r=m[0][0],i=1;for(;i<Math.min(m.length,m[0].length);)r=f(r,m[i][i++]);return r;}
  ;
}

สำหรับกรณีทดสอบฉันเขียนทับฟังก์ชันfนี้ ตัวอย่างเช่นกรณีทดสอบแรกเรียกว่าดังนี้:

System.out.println(new Test(){
  @Override
  int f(int x,int y){
    return x*y;
  }
}.c.apply(new int[][]{
  new int[]{1,2,3},
  new int[]{4,5,6},
  new int[]{7,8,9}
}));

2

ทูตขนาด 14 ไบต์

Fold#/Diagonal

ลองออนไลน์! ชุดที่จะโทรเป็นff[function, array]

คำอธิบาย

นี้เป็นทางแยกของทั้งสองฟังก์ชั่น: และFold /Diagonalสิ่งนี้สำหรับข้อโต้แย้งfและaเทียบเท่ากับ:

Fold[f, (/Diagonal)[f, a]]

/เมื่อใช้แบบ monadically กับฟังก์ชันจะส่งคืนฟังก์ชันที่ใช้กับอาร์กิวเมนต์สุดท้าย ดังนั้นนี่เท่ากับ:

Fold[f, Diagonal[a]]

นี้พับฟังก์ชั่นมากกว่าเส้นทแยงมุมหลักของfa


ภาษาที่ใช้ในบ้านซึ่งสามารถอ่านได้
Adám

@ Adám; D ใช่แน่นอน!
Conor O'Brien

2

AWK , 77 ไบต์

func z(F,M,r){for(e=1;e<M[1]&&e<M[2];)r=@F(r==""?M[1,1]:r,M[++e,e])
return r}

ลองออนไลน์!

ฉันอยากรู้อยากเห็นถ้าAWKสามารถเขียนโปรแกรมการทำงานได้เลย ฉันคิดว่าสิ่งนี้สำคัญ

"การเมทริกซ์" ถูกกำหนดให้เป็นอาเรย์มาตรฐานกับเขตพิเศษและM[1]=#rows M[2]=#columnsชื่อฟังก์ชั่นจะถูกส่งผ่านเป็นสตริงซึ่งมีการประเมินผ่านทาง@F(...)ไวยากรณ์ ทำการประเมินผลจากซ้ายไปขวา rพารามิเตอร์เป็นตัวยึดเพื่อป้องกันการเขียนทับที่มีอยู่rตัวแปรและเพื่อหลีกเลี่ยงความจำเป็นในการเตรียมใช้งานใหม่สำหรับการโทรแต่ละ โดยทั่วไปจะมีการเพิ่มพื้นที่พิเศษเพื่อกำหนดตัวยึดตำแหน่งดังกล่าวAWKแต่นี่คือรหัสกอล์ฟดังนั้นทุกไบต์จึงนับ :)

ลิงก์ TIO ใช้เคสทดสอบทั้งหมด


2

05AB1E , 15 10 ไบต์

พับจากขวาไปซ้าย
5 ไบต์ที่บันทึกไว้โดยใช้ตัวใหม่ตามที่Kevin Cruijssen แนะนำ

Å\`[.g#I.V

คำอธิบาย

ทำงานเหมือนกับรุ่นเก่ายกเว้นว่าÅ\เป็นรุ่นใหม่ในตัวสำหรับการกดเส้นทแยงมุมหลัก

ลองออนไลน์! หรือเป็นชุดทดสอบ

เวอร์ชั่นเก่า

¬g£vyNè}[.g#I.V

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

¬                 # get the head of the input (first row)
 g                # get its length (number of columns)
  £               # take that many rows from input
   v              # for each row_index, row (N,y) do:
    y             # push the row
     Nè           # get the nth element of the row
       }          # end loop
        [.g#      # loop until one value remain on the stack
            I.V   # run the input function

1
¬g£vyNè}[สามารถเป็นÅ\`[ตอนนี้ประหยัดได้ 5 ไบต์
Kevin Cruijssen

1

แกลบ , 7 ไบต์

ขอบคุณ @Zgarb สำหรับการแก้ไขการส่งของฉัน!

Ḟ₁§z!Tŀ

เชื่อมโยงไปทางซ้ายลองออนไลน์! (สำหรับรุ่นที่เชื่อมโยงทางขวาเพียงแทนที่ด้วยF )

คำอธิบาย

น่าเสียดายที่ไม่มีวิธีง่าย ๆ ที่จะได้เส้นทแยงมุมของเมทริกซ์ดังนั้นไบต์ส่วนใหญ่จึงเป็น:

Ḟ₁§z!Tŀ  -- function ₁ is the function and matrix A implicit, example: 
  §      -- fork A
     T   -- | transpose A: [[1,4,7],[2,5,8],[3,6,9]]
      ŀ  -- | enumerate A: [1,2,3]
   z!    -- and zipWith index: [1,5,9]
Ḟ₁       -- right fold function

Huh, built-in สำหรับต่อต้าน diagonals แต่ไม่ใช่ diagonals
Adám

2
@ Adam ฉันคิดว่านั่นเป็นเพราะคุณสามารถคำนวณ antidiagonals ของเมทริกซ์อนันต์ แต่ไม่ใช่ diagonals
Martin Ender

1

SNOBOL4 (CSNOBOL4) , 86 ไบต์

T	I =1
	T =M<1,1>
I	I =I + 1
	T =EVAL(F '(T,M<I,I>)')	:S(I)F(RETURN)
	DEFINE('T(M,F)')

ลองออนไลน์!

กำหนดฟังก์ชั่นT(สำหรับTRACE) ที่ใช้ARRAYและสตริงFที่เป็นชื่อของฟังก์ชั่น พับจากซ้ายไปขวา

การใช้การอ้างอิงทางอ้อม ( $) ไม่ทำงานกับฟังก์ชั่น ดังนั้นการใช้EVALและส่งผ่านสตริงไปยังชื่อน่าจะเป็นวิธีเดียวที่จะได้ฟังก์ชั่นกล่องดำใน SNOBOL

นอกจากนี้มันค่อนข้างเจ็บปวดในการกำหนดอาร์เรย์ แต่เนื่องจากการอ้างอิงอาร์เรย์ที่ไม่ถูกต้องทำให้เกิดFAILUREงานนี้ไม่ใช่สแควร์อาร์เรย์ - ถ้าIจะออกนอกสนามในมิติทั้งที่ F(RETURN)ฟังก์ชันจะบังคับให้ส่งคืน

แก้ไข:

อาจขึ้นอยู่กับmeta postนี้ฉันอาจคิดว่าฟังก์ชั่นกล่องดำFถูกกำหนดภายใต้ชื่อFซึ่งจะลดลงถึง 75 ไบต์ (ลบการใช้งานEVALและ,Fในการกำหนดฟังก์ชั่น) อย่างไรก็ตามฉันชอบเวอร์ชั่นนี้มากกว่าเพราะผ่านการอ้างอิงไปยังฟังก์ชั่น



1

tinylisp , 79 ไบต์

(load library
(d D(q((M)(i(h M)(c(h(h M))(D(map t(t M))))(
(q((F M)(foldl F(D M

บรรทัดสุดท้ายคือฟังก์ชันแลมบ์ดาที่ไม่มีชื่อที่ใช้ฟังก์ชันและเมทริกซ์และส่งคืนเมทริกซ์ติดตาม การติดตามมีความสัมพันธ์ด้านซ้าย (เช่นf(f(1,5),9)) ลองออนไลน์!

Ungolfed

เรากำหนดฟังก์ชันผู้ช่วยเพื่อคำนวณเส้นทแยงมุม แล้วเป็นเพียงเสื้อคลุมขนาดเล็กทั่วฟังก์ชันห้องสมุดgeneralized-tracefoldl

(load library)

(def diagonal
 (lambda (matrix)
  (if (head matrix)
   (cons
    (head (head matrix))
    (diagonal (map tail (tail matrix))))
   nil)))

(def generalized-trace
 (lambda (func matrix)
  (foldl func (diagonal matrix))))

เมื่อคำนวณเส้นทแยงมุมซ้ำเราตรวจสอบว่า(head matrix)เป็นความจริงหรือไม่ หากเมทริกซ์อยู่นอกแถวมันจะเป็นรายการว่างเปล่า (ไม่มี) และheadไม่มีเป็นหรือถ้าเมทริกซ์อยู่นอกคอลัมน์แถวแรก (ส่วนหัว) จะเป็นรายการว่างเปล่า (ไม่มี) - เท็จ มิฉะนั้นจะมีแถวแรกที่ไม่มีความว่างเปล่าซึ่งเป็นความจริง

ดังนั้นหากแถวแรกไม่มีอยู่หรือว่างเปล่าเราจะคืนค่าศูนย์ มิฉะนั้นหากไม่มีแถวแรกที่ไม่มีข้อมูลเราจะใช้(head (head matrix))- องค์ประกอบแรกของแถวแรก - และcons(เพิ่มหน้า) ไปยังผลลัพธ์ของการเรียกแบบเรียกซ้ำ อาร์กิวเมนต์ของการเรียกแบบเรียกซ้ำ(map tail (tail matrix))คือ - รับแถวทั้งหมดยกเว้นแถวแรกและรับทั้งหมดยกเว้นองค์ประกอบแรกของแต่ละแถว



1

C # (คอมไพเลอร์ Visual C #) , 72 69 60 ไบต์

m=>{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch{}}

ลองออนไลน์!

try/catch ช่วยให้สามารถเข้าถึงเส้นทแยงมุมได้อย่างถูกต้องเพียงแค่เดินไปตามทางนั้น

บันทึกไว้ 3 ไบต์เนื่องจาก Kevin Cruijssen ชี้ให้เห็นว่าฟังก์ชั่นกล่องดำสามารถสันนิษฐานได้ว่ามีชื่ออยู่

9 ไบต์ที่บันทึกไว้โดยกลับผ่านการปรับเปลี่ยนการโต้แย้ง

ดังนั้นฟังก์ชั่นที่เรียกว่าโดยการจัดเก็บฟังก์ชั่นที่ต้องการภายใต้ชื่อfเรียกและผลที่ได้จะถูกเก็บไว้ในtrace(matrix)matrix[0][0]

หรือถ้าคุณชอบการใช้คำฟุ่มเฟื่อย

C # (คอมไพเลอร์ Visual C #) , 97 + 13 = 110 78 69 ไบต์

(int[][]m)=>{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch{}}

ลองออนไลน์!

32 ไบต์บันทึกโดยใช้ฟังก์ชันที่กำหนดไว้ล่วงหน้าเนื่องจากไม่ใช้ฟังก์ชันเป็นพารามิเตอร์ที่อนุญาตให้ลบSystemการนำเข้าและFuncชนิดทั่วไปแบบยาว


เคล็ดลับดีกับการลองจับ ฉันสามารถเล่นกอล์ฟได้ 7 ไบต์ในคำตอบ Java 8 ของฉัน (แม้ว่าฉันจะต้องใช้catch(Exception e)แทนcatch:) แก้ไข: โอ้ฉันสามารถแทนที่catch(Exception e)ด้วยfinallyเพื่อประหยัดไบต์ได้มากขึ้น ขอบคุณอีกครั้ง. +1 จากฉัน
Kevin Cruijssen

@KevinCruijssen คุณยังอาจจะสามารถที่จะได้รับประโยชน์จากการปรับปรุงใหม่ล่าสุดของฉัน ( แต่ผมจำไม่ได้แน่นอนว่า Java เป็นคล้อยตามการปรับเปลี่ยนข้อโต้แย้ง)
Kamil Drakari

ขอบคุณสำหรับการให้ฉันรู้ว่า. แม้ว่ามันจะเป็นไปได้ใน Java แต่ก็หมายความว่าฉันจะต้องเปลี่ยนfinallyเป็นcatch(Exception e)เพราะฉันไม่ได้กลับมาในอีกต่อไปในที่สุด ดังนั้นm->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}(73 ไบต์) น่าเสียดายที่ฉันอีกต่อไปเมื่อเทียบกับคำตอบปัจจุบันของฉันm->{int r=m[0][0],i=1;try{for(;;)r=f(r,m[i][i++]);}finally{return r;}}(70 ไบต์) แต่แน่นอนวิธีที่ดีในการบันทึกไบต์ในคำตอบของคุณ! :) น่าเสียดายที่ฉันสามารถ +1 คำตอบของคุณเพียงครั้งเดียว
Kevin Cruijssen

1

JavaScript, 61 57 56 52 50 44 42 ไบต์

ลดจากซ้ายไปขวา สมมติว่าฟังก์ชั่นนั้นถูกกำหนดให้กับตัวแปรfตามที่เมตาโพสต์นี้นำเสนอโดย Mr. Xcoder & มนุษย์โดยสิ้นเชิง ไม่สามารถพูดตามที่เห็นด้วยเนื่องจากขัดแย้งกับฉันทามติที่มีอยู่โดยตรงของเราว่าเราอาจไม่สมมติว่าอินพุตถูกกำหนดให้กับตัวแปรที่กำหนดไว้ล่วงหน้า แต่ฉันจะใช้เวลาไม่กี่ไบต์ในการบันทึก

a=>a.map((y,z)=>x=(n=y[z])?z?f(x,n):n:x)|x

กรณีทดสอบ

g=
a=>a.map((y,z)=>x=(n=y[z])?z?f(x,n):n:x)|x
o.innerHTML=[[`f(x,y) = xy`,[[1,2,3],[4,5,6],[7,8,9]],(x,y)=>x*y,45],[`f(x,y) = x<sup>y</sup>`,[[1,2,3],[4,5,6],[7,8,9]],(x,y)=>x**y,1],[`f(x,y) = x-y`,[[4,5,6],[1,2,3]],(x,y)=>x-y,2],[`f(x,y) = <sup>(x+y)</sup>⁄<sub>2</sub>`,[[2,3,4],[5,6,7],[8,9,10]],(x,y)=>(x+y)/2,7],[`f(x,y) = x+2y`,[[1,2,3],[4,5,6],[7,8,9]],(x,y)=>x+2*y,29],[`f(x,y) = max(x,y)`,[[1,2,3],[4,5,6],[7,8,9]],(x,y)=>Math.max(x,y),9],[`f(x,y) = 2x`,[[1,2,3],[4,5,6],[7,8,9]],(x,y)=>2*x,4],[`f(x,y) = lcm(x,y)`,[[2,2,2],[2,2,3],[2,3,3],[4,4,4]],(x,y)=>-~[...Array(x*y).keys()].find(z=>!(++z%x|z%y)),6]].map(([a,b,c,d],e)=>`Test #${++e}:  ${a}\nMatrix:   ${JSON.stringify(b)}\nFunction: ${f=c}\nResult:   ${g(b)}\nExpected: ${d}`).join`\n\n`
<pre id=o></pre>


1

APL NARS, 20 ไบต์, 10 ตัวอักษร

{⍺⍺/1 1⍉⍵}

ทดสอบ:

  f←{⍺⍺/1 1⍉⍵}
  ⎕←q←3 3⍴⍳10    
1 2 3
4 5 6
7 8 9
  ×f q
45
  *f q
1
  {⍺+2×⍵}f q
47
  ⌈f q
9
  {2×⍺+0×⍵}f q
2
  -f ⊃(4 5 6)(1 2 3)
2
  {(⍺+⍵)÷2}f ⊃(2 3 4)(5 6 7)(8 9 10)
5
  ∧f ⊃(2 2 2)(2 2 3)(2 3 3)(4 4 4)
6

ทำได้ดีมาก ในขณะที่ฉันคิดว่าคุณมาถึงนี้คุณเองก็จะเกิดขึ้นเหมือนกันกับเอริก Outgolfer วิธีการแก้ปัญหาเดิม
อดัม

0

เยลลี่ 5 ไบต์

จากซ้ายไปขวา

ŒDḢç/

ลองออนไลน์!

คำเตือน:ฉันไม่รู้ว่านี่เป็นวิธีการป้อนข้อมูลที่ยอมรับได้สำหรับฟังก์ชั่นกล่องดำหรือไม่ นี้อนุมานว่าฟังก์ชั่นการใช้งานในการเชื่อมโยงดังกล่าวข้างต้นและทำให้ "ชื่อ" (นั่นคือมันเป็น callable ด้วย) แต่อย่างอื่นผมมีวิธีที่จะกำหนดให้ไม่มีç çหากใครมีประสบการณ์มากขึ้นกับฟังก์ชั่นกล่องดำ + Jelly ฉันจะขอบคุณความคิด หลังจากใช้เวลาในการแชทที่เราคิดว่าการใช้çอาจจะจริงที่ถูกต้อง



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