ความท้าทายของ Dijkstra


23

นำเสนอเพื่อเป็นเกียรติแก่APL ในฐานะเครื่องมือโต้ตอบอายุ 50 ปีในปีนี้

พื้นหลัง

Ken [Iverson]นำเสนอพิธีการในภาษาโปรแกรมในเดือนสิงหาคม พ.ศ. 2506 ในการประชุมเชิงปฏิบัติการเกี่ยวกับโครงสร้างภาษาเครื่องกลเมืองปรินซ์ตันรัฐนิวเจอร์ซีย์รายการสารภาพเต็มไปด้วยชื่อที่มีชื่อเสียงและจะเป็นที่โด่งดังในอนาคต (Backus, Curry, Dijkstra, Floyd, Iverson, Newell, Perlis, Wilkes) กระดาษยังบันทึกการสนทนาที่เกิดขึ้นหลังจากการนำเสนอจบลงด้วยการแลกเปลี่ยนระหว่าง Ken และ[Edsger] Dijkstraซึ่ง Ken ตอบคำถามของ Dijkstra นั้นเป็นแบบหนึ่งเดียว

ท้าทาย

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

เขียนตัวอย่างหรือการแสดงออก (ไม่จำเป็นต้องใช้โปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ) เพื่อคำนวณผลรวมของแต่ละองค์ประกอบในเมทริกซ์จำนวนเต็มที่กำหนดซึ่งเท่ากับผลรวมของดัชนี หรือเป็น FryAmTheEggman ทำให้มันได้รับเมทริกซ์Mกับองค์ประกอบIJกลับผลรวมของแต่ละIJที่IJ = i + J

คุณอาจถือว่าเมทริกซ์อยู่ในตำแหน่งตัวแปรหรือหน่วยความจำแล้วหรือคุณอาจใช้มันเป็นอาร์กิวเมนต์หรืออินพุต คุณสามารถใช้ดัชนีอ้างอิง 0 หรือ 1

กรณีทดสอบ

 

0 สำหรับเมทริกซ์ที่ว่างเปล่า

2

0สำหรับดัชนี 0 ฐานหรือ21 ฐาน

1 5 2
9 4 2
5 9 6

2for 0 based หรือ101 based

 0 3  0  4
 0 4  1  4
 4 3  1  2
-2 4 -2 -1

11

3 -1 3 3
3 -1 3 1

6for 0 based หรือ31 based

เกร็ดพงศาวดาร

คำตอบ Iverson เป็น ++ / ( M = ¹⨢ ¹) // Mซึ่งเป็นที่ถูกต้องทั้งในIverson สัญลักษณ์ที่กำหนดไว้ในภาษาการเขียนโปรแกรมหรือในที่สุดก็กลายเป็นสิ่งที่ APL ในสัญกรณ์ Iverson ก็จะได้รับ + / ( M = ¹ ( μ ( M )) ⨢ ¹ ( ν ( M ))) / M ในรุ่นแรกของ APL +/(,M=(⍳1↑⍴M)∘.+⍳1↓⍴M)/,Mมันเป็น


ซึ่งเคนตอบคำถามของ Dijkstra นั้นเป็นแบบหนึ่งบรรทัด แต่แล้วสายการบินเดียวนั้นผิด?
Luis Mendo

ฉันต้องการส่งออกหรือพิมพ์ออกมาหรือฉันสามารถเขียนนิพจน์เป็นตัวอย่างได้หรือไม่
Leun Nun

2
@ LuisMendo ไม่ Iverson กำลังออกแบบภาษาอย่างแข็งขันและในตอนนั้นการวนซ้ำของเขาถูกต้อง "APL" กลายเป็นที่มีชื่อเสียงกับการเผยแพร่ของหนังสือเล่มนี้P rogramming L anguageแต่ในเวลาของการเผยแพร่การแสดงออกที่สองเป็นสิ่งที่จำเป็น ไม่มีการใช้สัญลักษณ์เหล่านี้เพื่อให้สามารถประมวลผลได้
Adám

@LeakyNun เขียนตัวอย่างหรือนิพจน์เพื่อคำนวณ
59

@ Adámขอบคุณ มันสมเหตุสมผลมากกว่าตอนนี้
Luis Mendo

คำตอบ:


9

APL, 13 12 ไบต์

1 ไบต์ต้องขอบคุณ @ jimmy23013

1 การจัดทำดัชนี

mอาร์เรย์จะถูกเก็บไว้ในตัวแปร

+ / ม. × m = + / ¨⍳⍴m
+ / + εm∩¨ / ¨⍳⍴m

ลองออนไลน์!

อ้างอิงจากคำตอบใน Jซึ่งเป็นภาษาที่ใช้ APL

ใน TryAPL เพื่อป้อนใน: +/m`em`c`1+/`1`i`rm

ด้วยอาเรย์: +/m`em`c`1+/`1`i`rm `[ 2 4 `r 3 `21 3 3 3 `21 3 1

คำอธิบาย

+/∊m∩¨+/¨⍳⍴m
           m    temp ← variable
          ⍴     temp ← shape of temp
         ⍳      temp ← a 2D array where each element is
                       the corresponding index. for the
                       example, this gives:
                       ┌───┬───┬───┬───┐
                       │1 1│1 2│1 3│1 4│
                       ├───┼───┼───┼───┤
                       │2 1│2 2│2 3│2 4│
                       └───┴───┴───┴───┘
      +/¨       each element in temp ← its sum
   m∩¨          temp ← intersect each element in temp with the variable
+/              temp ← sum of temp

ในที่สุดฉันก็รอคนนี้อยู่
อดัม

ฉันไม่แน่ใจว่า "ถึงคีย์:" เป็นความคิดที่ดี ใช้ได้เฉพาะกับ TryAPL และ RIDE เท่านั้น แต่ไม่รวมถึงผลิตภัณฑ์หลัก อย่างน้อยคุณก็สามารถอธิบายได้ว่า`หมายถึง "คีย์ APL"
Adám

1
+/∊m∩¨+/¨⍳⍴m.
jimmy23013

@ jimmy23013 มันดีจริงๆ!
อดัม

9

MATL , 15 14 10 ไบต์

3#fbb+y=*s

;การป้อนข้อมูลได้แถวแยกจากกันโดย ตัวอย่างเช่น[1 5 2; 9 4 2; 5 9 6]. ใช้การจัดทำดัชนีแบบอิง 1

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

คำอธิบาย

ฉันจะใช้ตัวอย่างที่มีการป้อนข้อมูล[3 -1 3 3; 3 -1 3 1]ในคำอธิบาย

3#f    % Three-output find: for all nonzero values of implicit input matrix, pushes
       % three column vectors with row indices, column indices, and values
       %   Stack contains: [1;2;1;2;1;2;1;2], [1;1;2;2;3;3;4;4], [3;3;-1;-1;3;3;3;1]
bb     % Bubble up twice: move vectors of row and column indices to top
       %   Stack contains: [3;3;-1;-1;3;3;3;1], [1;2;1;2;1;2;1;2], [1;1;2;2;3;3;4;4]
+      % Element-wise sum of top two arrays
       %   Stack contains: [3;3;-1;-1;3;3;3;1], [2;3;3;4;4;5;5;6]
y      % Duplicate the vector of nonzero values onto the top of the stack
       %   Stack contains: [3;3;-1;-1;3;3;3;1], [2;3;3;4;4;5;5;6], [3;3;-1;-1;3;3;3;1] 
=      % Element-wise equality test of top two arrays
       %   Stack contains: [3;3;-1;-1;3;3;3;1], [0;1;0;0;0;0;0;0]
*      % Element-wise multiply of top two arrays
       %   Stack contains: [0;3;0;0;0;0;0;0]
s      % Sum of array
       %   Stack contains: 3

6

JavaScript, 49 46 ไบต์

a.map((b,i)=>b.map((c,j)=>r+=c==i+j&&c),r=0)|r

แก้ไข: บันทึกแล้ว 3 ไบต์ด้วย @MartinEnder ซึ่งชี้ให้เห็นว่าอนุญาตตัวอย่างข้อมูล


5

จอตาติน่า 46 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

\d+
$*
M!`(?<=(\S* |.*¶)*)(?<-1>1)+\b(?(1)1)
1

อินพุตใช้ตัวแยกช่องว่างและตัวป้อนบรรทัดเพื่อแสดงเมทริกซ์ ดัชนีเป็นฐาน 0

ลองออนไลน์!

คำอธิบาย

ไม่ได้เป็นเรื่องที่ท้าทายสำหรับ Retina แต่มันก็ทำได้ดีอย่างน่าประหลาดใจ ... :)

ด่าน 1: การเปลี่ยนตัว

\d+
$*

สิ่งนี้จะขยายจำนวนเต็มทั้งหมดในสตริงเป็นตัวเลขแบบยูนารีโดยใช้1เป็นตัวเลขแบบเอกนารี ตัวเลขติดลบเช่นก็จะกลายเป็นสิ่งที่ชอบ-3-111

ด่าน 2: การแข่งขัน

M!`(?<=(\S* |.*¶)*)(?<-1>1)+\b(?(1)1)

เนื่องจาก!ตัวเลือกนี้จะพิมพ์การแข่งขันทั้งหมดของ regex ที่กำหนด Said regex ใช้กลุ่มที่สมดุลเพื่อตรวจสอบว่าหมายเลขปัจจุบันเหมือนกับผลรวมของดัชนีหรือไม่

ต้องการทำเช่นนั้นครั้งแรกที่เราตรวจสอบผลรวมของดัชนีที่มี (?<=(\S* |.*¶)*)lookbehind สิ่งนี้จะเพิ่มการจับหนึ่งครั้งสำหรับแต่ละหมายเลขที่อยู่ด้านหน้าของหมายเลขปัจจุบันในบรรทัดเดียวกัน (ผ่าน\S* ) และอีกหนึ่งการจับภาพสำหรับแต่ละบรรทัดที่อยู่ด้านหน้าของหมายเลขปัจจุบัน (ผ่านทาง).*¶ ) ไปยังกลุ่ม1ไปยังกลุ่ม ดังนั้นเราจะได้รับผลรวมของดัชนีที่เป็นศูนย์

(?<-1>1)+\bจากนั้นเราก็พยายามที่จะตรงกับหมายเลขถัดไปทั้งหมดในขณะที่ถอดจับจากสแต็คนี้กับ และจากนั้นเราทำให้การแข่งขันล้มเหลวหากมีการจับภาพใด ๆ ในกลุ่ม1ด้วย(?(1)1)เพื่อให้เกิดความเท่าเทียมกัน

โปรดทราบว่าจำนวนลบจะไม่ตรงกันเนื่องจาก lookbehind ไม่สามารถผ่าน-หน้ารายการ1s และ(?<-1>1)+ไม่สามารถจับคู่ได้

สิ่งนี้ทำให้เรามีรายชื่อหมายเลขทั้งหมดพร้อมกันซึ่งเท่ากับผลรวมของดัชนีของพวกเขา

ด่าน 3: การแข่งขัน

1

เราลงท้ายด้วยสเตจการแข่งขันอื่น แต่ไม่มี!ตัวเลือกนี่แค่นับจำนวนแมตช์ซึ่งทั้งคู่จะรวมตัวเลขทั้งหมดจากคะแนนก่อนหน้าและยังแปลงผลรวมกลับเป็นทศนิยม


คุณสามารถใช้เอกภาพเป็นอินพุตได้หรือไม่?
Leun Nun

@LeakyNun ไม่รู้ฉันได้พยายามหลีกเลี่ยงมันแล้ว ดูเหมือนว่าแฮ็คเกินไปโดยเฉพาะอย่างยิ่งตั้งแต่ Retina ไม่มีปัญหากับการแปลงอีกต่อไป
Martin Ender

4

เยลลี่, 15 14 10 ไบต์

4 ไบต์ขอบคุณ Adnan

1 การจัดทำดัชนี

L € R € + "LR $ = ³×³FS 
L € R € +" LR $ = ׳FS
J € + "J = ×⁸FS

ลองออนไลน์!

ตรวจสอบการทดสอบทั้งหมดในครั้งเดียว (แก้ไขเล็กน้อย)


ฉันไม่แน่ใจว่ามันใช้งานได้ แต่คุณสามารถทำJ€แทนได้L€R€หรือไม่?
Adnan

1
โอ้พระเจ้าคุณเป็นอัจฉริยะ
Leun Nun

4

Python 2 - 60 57 ไบต์

มันเป็นข้อมูลโค้ดดังนั้นมันน่าจะเป็นจำนวนไบต์ที่น้อยกว่าถ้าฉันคืนค่าจริง ๆ ฉันเดา e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))

ขอบคุณสำหรับความช่วยเหลือ Leaky Num :-)

คำอธิบายด่วน aเป็นตัวเลขการถือครองอาร์เรย์ เพียงแค่วนซ้ำดัชนีและสรุปค่าทั้งหมดที่ค่าเท่ากับผลรวมของดัชนี



โอ้มันไม่ทำงาน ดังนั้นตอนนี้ 57 ไบต์: (ฉันเพิ่มคำอธิบายสั้น ๆ
Jeremy

คุณอาจต้องการที่จะรวมลิงค์ที่ฉันเพิ่งให้คุณ
Leun Nun

4

R, 24 ไบต์

sum(M[M==row(M)+col(M)])

1-based
กรณีทดสอบ:

> M<-matrix(nrow=0,ncol=0)
> M
<0 x 0 matrix>
> sum(M[M==row(M)+col(M)])
[1] 0
> M<-matrix(2,nrow=1,ncol=1)
> M
     [,1]
[1,]    2
> sum(M[M==row(M)+col(M)])
[1] 2
> M<-matrix(c(1,9,5,5,4,9,2,2,6),nrow=3)
> M
     [,1] [,2] [,3]
[1,]    1    5    2
[2,]    9    4    2
[3,]    5    9    6
> sum(M[M==row(M)+col(M)])
[1] 10
> M<-matrix(c(0,0,4,-2,3,4,3,4,0,1,1,-2,4,4,2,-1),nrow=4)
> M
     [,1] [,2] [,3] [,4]
[1,]    0    3    0    4
[2,]    0    4    1    4
[3,]    4    3    1    2
[4,]   -2    4   -2   -1
> sum(M[M==row(M)+col(M)])
[1] 11
> M<-matrix(c(3,3,-1,-1,3,3,3,1),nrow=2)
> M
     [,1] [,2] [,3] [,4]
[1,]    3   -1    3    3
[2,]    3   -1    3    1
> sum(M[M==row(M)+col(M)])
[1] 3

3

J, 15 ไบต์

+/,M*M=+/&i./$M

ใช้การทำดัชนีแบบ zero-based และสมมติว่าเมทริกซ์นั้นถูกเก็บไว้ในตัวแปรMแล้ว

คำอธิบาย

+/,M*M=+/&i./$M
             $a  Get the shape of M
            /    Insert between the shape
         &i.     Create a range from 0 to each end exclusive
       +/        Forms a table which is the sum of each row and column index
     M=          1 if the element is equal to its index sum else 0
   M*            Multiply by their values
  ,              Flatten
+/               Reduce using addition to get the sum

3
ไม่เพียงสั้นที่สุดจนถึงปัจจุบัน +1 สำหรับการทำในภาษา Iverson
59

3

CJam, 23 21 20 bytes

ขอบคุณ Peter Taylor สำหรับการบันทึก 3 ไบต์

ee{~_@f-_,,.=.*~}%1b

คาดว่าเมทริกซ์จะอยู่ในสแต็กและปล่อยให้ผลรวมแทน ดัชนีเป็นศูนย์ในกรณีใดกรณีหนึ่ง

ทดสอบที่นี่


คุณสามารถช่วยชีวิตคู่ด้วย_,,แทนด้านในeeและ.สำหรับวงใน:ee{~_,,@f+1$.=.*~}%1b
Peter Taylor

@PeterTaylor อ่าเรียบร้อยขอบคุณ :)
Martin Ender

ในความเป็นจริงมีอีกหนึ่งโดยทำพบปะในกลาง:ee{~_@f-_,,.=.*~}%1b
Peter Taylor

3

k4, 24 ไบต์

mถือว่าเมทริกซ์ถูกเก็บไว้ใน

+//7h$m*m=(!#m)+/:\:!#*m

นี่คือหนึ่งในปริศนาที่ความเรียบง่ายที่เกี่ยวข้องกับการออกแบบ k จาก APL (และ J) เจ็บจริง ๆ - k !นั้นเทียบเท่ากับ APL แต่ใช้ได้เฉพาะกับเวกเตอร์เท่านั้นดังนั้นฉันต้องรวบรวมเมทริกซ์ของดัชนีด้วยตัวเอง ผลิตภัณฑ์ภายในเป็นตัวละครตัวหนึ่งใน APL แต่ห้าตัวใน k และฉันสูญเสียอักขระสามตัวในการจัดการเมทริกซ์ที่ว่างเปล่าอย่างถูกต้องเพราะ k ไม่มีเมทริกซ์ที่มีการพิมพ์อย่างรุนแรง


2
ในอีกทางหนึ่งคุณมีภาษาที่ทรงพลังซึ่งมีความสอดคล้องกันมากกว่าและมีการเรียนรู้น้อยลง
Adám


2

PowerShell v2 +, 43 ไบต์

%{$j=0;$_|%{$o+=$_*($_-eq$i+$j++)};$i++};$o

เป็นตัวอย่าง การใช้งานคือการไพพ์เมทริกซ์ไปยังสิ่งนี้อย่างชัดเจน (ดูตัวอย่างด้านล่าง) สมมติว่า$iและ$oเป็นโมฆะหรือเป็นศูนย์ในตอนเริ่มต้น (ฉันได้ตั้งค่าไว้อย่างชัดเจนในตัวอย่างด้านล่าง) และใช้ดัชนี 0

ทำการวนรอบ foreach ในแต่ละแถวของเมทริกซ์ เราตั้ง$jไปแล้วไปผ่านองค์ประกอบของแถวในวงอีกแต่ละ0 $_|%{...}ภายในวงแต่ละคนเราเพิ่มขึ้น$oโดยองค์ประกอบปัจจุบันคูณด้วยบูลีน($_-eq$i+$j++)ความหมายว่าแบบบูลคือ$TRUEมันจะเป็นอย่างอื่น1 0จากนั้นเราออกจากวงในเพิ่มขึ้น$iและเริ่มแถวถัดไป ในที่สุดเราก็จากไป$oไปทางท่อในตอนท้าย

ตัวอย่าง

PS C:\Tools\Scripts\golfing> $o=0;$i=0;$j=0;@(@(3,-1,3,3),@(3,-1,3,1))|%{$j=0;$_|%{$o+=$_*($_-eq$i+$j++)};$i++};$o
6

PS C:\Tools\Scripts\golfing> $o=0;$i=0;$j=0;@(@(0,3,0,4),@(0,4,1,4),@(4,3,1,2),@(-2,4,-2,-1))|%{$j=0;$_|%{$o+=$_*($_-eq$i+$j++)};$i++};$o
11

2

ทับทิม, 63 ไบต์

ด้วย z เป็นอาร์เรย์สองมิติของตัวเลข:

s=0;z.each_index{|i|z[i].each_index{|j|s+=i+j if z[i][j]==i+j}}

ไม่น่าตื่นเต้นอย่างมากเลย

ถ้า z เป็นอาร์เรย์ที่แบนซึ่งมี x และ y ที่มีขนาดของอาร์เรย์เช่น:

x=z.size
y=z[0].size
z=z.flatten

จากนั้นเราก็มีความชั่วร้ายนี้ - บางทีอาจจะเป็นทับทิม - อิชมากกว่าด้วยผลิตภัณฑ์แฟนซีและรหัสไปรษณีย์ แต่จริง ๆ แล้วมีขนาดใหญ่กว่า:

(1..x).to_a.product((1..y).to_a).zip(z).inject(0){|s,n|s+(n[0][0]+n[0][1]==n[1]+2?n[1]:0)}

อาจจะมีวิธีการเรียงลำดับหรือนักแจงนับที่สั้นลงฉันยังไม่พบ แต่ฉันชอบที่จะเห็น
David Ljung Madison Stellar

2

จริงแล้ว 21 ไบต์

ñ`i╗ñ"i╜+@;(=*"£Mi`MΣ

ลองออนไลน์!

ขอบคุณ Leaky Nun ที่ทำให้ฉันหยุดขี้เกียจและในที่สุดก็เขียนสิ่งนี้

สิ่งนี้ใช้เมทริกซ์ 0 ที่จัดทำดัชนีและรับอินพุตเป็นรายการซ้อน

คำอธิบาย:

ñ`i╗ñ"i╜+@;(=*"£Mi`MΣ
ñ                      enumerate input
 `i╗ñ"i╜+@;(=*"£Mi`M   for each (i, row) pair:
  i╗                     flatten, store i in register 0
    ñ                    enumerate the row
     "i╜+@;(=*"£M        for each (j, val) pair:
      i╜+                  flatten, add i to j
         @;(               make an extra copy of val, bring i+j back to top
            =              compare equality of i+j and val
             *             multiply (0 if not equal, val if they are)
                 i       flatten the resulting list
                    Σ  sum the values


2

Matlab / Octave ขนาด 48 ไบต์

1 การจัดทำดัชนี

จะไม่จัดการกับกรณีทดสอบครั้งแรกเนื่องจาก[1:0]มีขนาด 1x0 ด้วยเหตุผลบางอย่าง

sum(sum(M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0)))

ทดสอบในระดับ 3 คู่

โปรแกรมเต็มรูปแบบ:

M = [2]
sum(sum(M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0)))
M = [1 5 2; 9 4 2; 5 9 6]
sum(sum(M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0)))
M = [ 0 3  0  4; 0 4  1  4; 4 3  1  2;-2 4 -2 -1]
sum(sum(M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0)))
M = [ 3 -1 3 3; 3 -1 3 1]
sum(sum(M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0)))

ยินดีต้อนรับสู่ PPCG! sum((M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0))(:))ในคู่ที่คุณสามารถทำได้ นอกจากนี้ฉันคิดว่าคุณสามารถเปลี่ยนเป็น==0เริ่มต้น~เพื่อลดจำนวนไบต์เพิ่มเติม ในที่สุดโปรดทราบว่าคุณต้องจัดการกับกรณีทดสอบทั้งหมดมิฉะนั้นคำถามควรถูกลบ
Luis Mendo

1

Lua, 70 ไบต์

1 การจัดทำดัชนี

s=0 for i=1,#a do for j=1,#a[i]do s=i+j==a[i][j]and s+i+j or s end end

โบนัส: มันใช้งานได้กับอาร์เรย์ที่มอมแมม!

อินพุตถูกเก็บในa, เอาต์พุตถูกเก็บในsการส่งออกเก็บไว้ใน

โปรแกรมเต็มรูปแบบ:

function Dijkstras_Challenge(a)
    s=0 for i=1,#a do for j=1,#a[i]do s=i+j==a[i][j]and s+i+j or s end end
    print(s)
end

Dijkstras_Challenge({})
Dijkstras_Challenge({{2}})
Dijkstras_Challenge({{1,5,2},{9,4,2},{5,9,6}})
Dijkstras_Challenge({{0,3,0,4},{0,4,1,4},{4,3,1,2},{-2,4,-2,-1}})
Dijkstras_Challenge({{3,-1,3,3},{3,-1,3,1}})

1

PHP, 59 ไบต์

foreach($a as$y=>$r)foreach($r as$x=>$v)$s+=($v==$x+$y)*$v;

คาดว่าอาร์เรย์ $ a ที่กำหนดไว้; จะต้องว่างเปล่าหรือ 2 มิติเป็นดัชนี 0
คำนวณผลรวมถึง $ s (ก่อนหน้านี้ 0 หรือไม่ได้กำหนด - 0 เท่ากับ NULL)
แทรก+2ก่อนสุดท้าย)สำหรับพฤติกรรมที่มีการจัดทำดัชนี 1

สุขสันต์วันเกิด APL!

ฟังก์ชั่นและชุดทดสอบ

function f0($a) { foreach($a as$y=>$r)foreach($r as$x=>$v)$s+=($v==$x+$y)*$v;return $s|0; }
function f1($a) { foreach($a as$y=>$r)foreach($r as$x=>$v)$s+=($v==$x+$y+2)*$v;return $s|0;}
$samples = [
    [], 0, 0,
    [[2]], 0, 2,
    [[1,5,2],[9,4,2],[5,9,6]], 2, 10,
    [[0,3,0,4],[0,4,1,4],[4,3,1,2],[-2,4,-2,-1]],11,11,
    [[3,-1,3,3],[3,-1,3,1]],6,3
];
function test($x,$e,$y){static $h='<table border=1><tr><th>input</th><th>output</th><th>expected</th><th>ok?</th></tr>';echo"$h<tr><td>",out($x),'</td><td>',out($y),'</td><td>',out($e),'</td><td>',cmp($e,$y)?'N':'Y',"</td></tr>";$h='';}
while($samples)
{
    $a=array_shift($samples);
    test($a,'B0:'.array_shift($samples),'B0:'.f0($a));
    test($a,'B1:'.array_shift($samples),'B1:'.f1($a));
}


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