MATL , 54 51 49 ไบต์
n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>
อินพุตเป็นอาร์เรย์ถ่าน 2 มิติในรูปแบบ MATL (AB) โดยมี;
ตัวคั่นแถว อินพุตในตัวอย่างและในกรณีทดสอบตามลำดับ:
['11-011123';'111-010--';'0010---01';'111-01234']
['1']
['1-1-1-1';'-1-1-1-';'2-1-1-1';'-1-1-1-']
['12-45-';'4-65-9';'87-654';'12-487';'45----';'684764']
['111-12';'------';'21--10']
ลองออนไลน์!
คำอธิบาย
สิ่งนี้ทำงานได้โดยการสร้างเมทริกซ์ adjacency ของกราฟที่กำหนดโดยความสัมพันธ์ "กำลังเชื่อมต่อ" ยกตัวอย่างเช่นพิจารณาฟิลด์ 3 × 4
52-4
15-8
3-72
รายการในอาร์เรย์ 2D อธิบายได้ง่ายใน MATL โดยใช้การจัดทำดัชนีเชิงเส้น ในกรณี 3 × 4 ดัชนีเชิงเส้นของแต่ละรายการจะได้รับเป็น
1 4 7 10
2 5 8 11
3 6 9 12
adjacency matrix ถูกสร้างขึ้นในขั้นตอนโดยใช้การคูณเมทริกซ์ ในขั้นตอนแรกจะพิจารณาประเทศเพื่อนบ้านทันที ตัวอย่างเช่นจุดที่จัดทำดัชนี 3 คือเพื่อนบ้านของตัวเองและของที่มีดัชนี 2 มันไม่ใช่เพื่อนบ้านของ 6 เพราะจุดนั้นไม่ได้มีตัวเลขตามเขตข้อมูล ในตัวอย่างนี้เมทริกซ์ adjacency ของความสัมพันธ์ "เพื่อนบ้านทันที" คือ 12 × 12 เมทริกซ์Lให้เป็น
1 1 0 1 0 0 0 0 0 0 0 0
1 1 1 0 1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 0 0 0 0 0
0 1 0 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 1 0 1 1
(มันสามารถเห็นได้ว่าคอลัมน์ที่ 3 มีค่า1
ในแถวที่ 2 และ 3) เมทริกซ์นี้อยู่เสมอสมมาตรและเส้นทแยงมุมของมีค่าสำหรับจุดที่ไม่ได้มี1
-
ขั้นตอนต่อไปคือเมทริกซ์ adjacency ของความสัมพันธ์ "เชื่อมโยงกับจุดหนึ่งมากที่สุดระหว่าง " ที่จะได้รับมันพอเพียงที่จะคูณL1
ด้วยตัวเองและชุดภัณฑ์รายการไป โดยทั่วไปเมทริกซ์ adjacency ของความสัมพันธ์ "เชื่อมต่อโดยบางเส้นทาง", M , ได้มาจากการเพิ่มLให้เป็นเลขชี้กำลัง (ในความหมายของเมทริกซ์) ที่แสดงถึงความยาวเส้นทางที่เป็นไปได้สูงสุด ผูกพันบนของความยาวเส้นทางสูงสุดคือจำนวนของรายการภัณฑ์ในL
การคำนวณพลังงานเมทริกซ์โดยตรงอาจทำให้เกิดการล้นเนื่องจากจำนวนมากจะเกิดขึ้นอย่างรวดเร็ว ดังนั้นจึงเป็นการดีที่จะค่อยๆคูณเมทริกซ์เดียวกันโดยแปลงรายการที่ไม่ใช่ศูนย์เป็น 1 หลังจากแต่ละขั้นตอนเพื่อป้องกันไม่ให้มีจำนวนมากขึ้น
คอลัมน์ฉันของMหมายถึงจุดที่มีการเชื่อมต่อ (โดยเส้นทางใด ๆ ) ที่มีจุดฉัน ตอนนี้ข้อมูลระดับจะลดลงคอลัมน์เวกเตอร์ค-
ในการสั่งซื้อเชิงเส้นซึ่งแต่ละรายการมีตัวเลขที่สอดคล้องกันหรือไม่ได้กำหนดค่าสำหรับ ดังนั้นในกรณีนี้คจะเป็น
5
1
3
2
5
-
-
-
7
4
8
2
Mutiplying คอลัมน์ของแต่ละMโดยคองค์ประกอบที่ชาญฉลาดและการคำนวณผลรวมของแต่ละคอลัมน์จะช่วยให้สำหรับแต่ละจุดผม , คะแนนรวมของจุดพื้นที่ที่ฉันเป็น พื้นที่ถูกกำหนดโดยทุกจุดที่เชื่อมต่อกัน โปรดทราบว่าคอลัมน์จำนวนมากจะให้ผลลัพธ์เดียวกัน กล่าวคือคอลัมน์iและjจะให้ผลรวมเท่ากันถ้าคะแนน iและjเชื่อมต่อกัน (อยู่ในพื้นที่เดียวกัน) ผลสุดท้ายคือผลรวมสูงสุด
% Implicitly take input: 2D char array
n: % Range [1,...,N], where N is number of entries in the input
" % For loop. Each iteration builds a row of matrix L
G % Push input again
~ % Logical negate: transform into matrix of zeros
1 % Push 1, to be written into a matrix entry
@ % Iteration index. Ranges from 1 to N
( % Write that 1 into the N-th entry (linear order)
2Y6 % Push array [0 1 0; 1 1 1; 0 1 0]: mask of immediate neighbours
Z+ % Convolve and keep same-size result
le % Linearize into row array
G45> % Array of same size as the input that contains 1 for numbers, 0 for '-'
1e % Linearize into row array
* % Multiply element-wise
5M % Push last array again: 1 for numbers, 0 for '-'
@) % Get 0 or 1 value of that array corresponding to current iteration
* % Multiply. This is to give a row of zeros for non-numbers
] % End. We have all rows of L in the stack
v % Concatenate all rows into a matrix: L.
tz: % Duplicate. Range [1,...,K], where K is the number of nonzeros in L
" % For loop. Repear K times. This loop computes the 0/1 matrix power
o % Convert matrix entries to double
tY* % Duplicate and matrix-multiply
g % Convert to logical values, that is, nonzero values become 1
] % End. We have matrix M
G48- % Convert input chars to the corresponding numbers by subtractig 48
X: % Linearize into column array. This is vector c
* % Element-wise multiplication with broadcast (implicit repetition)
s % Sum of each column. Gives a row array
X> % Maximum of that row array
% Implicitly display