ปริศนาจิ๊กซอว์เมทริกซ์


24

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

  • จำนวนเต็ม n
  • เมทริกซ์จตุรัสขนาดเท่ากันสองค่า (ที่ความกว้าง / ความสูงเป็นพหุคูณของn)

เอาท์พุท:

หนึ่งในสองค่าที่แตกต่างกันของทางเลือกของคุณเองเป็นหนึ่งเพื่อให้ได้ผลลัพธ์ truthy และหนึ่งสำหรับผลการ falsey (ดังนั้นใช่1/0แทนtrue/falseแม้ว่าจะมีผลที่ถูกต้องสำหรับภาษาเช่น Java, พวกเขาไม่ได้รับการพิจารณาอย่างเป็นทางการ truthy / ค่า falsey )

เอาต์พุตความจริง / เท็จแสดงว่าเราสามารถจัดเรียงบล็อกขนาดใหม่n by nในเมทริกซ์เดียวเพื่อให้เท่ากับเมทริกซ์อื่น

ตัวอย่าง:

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

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

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

Integer n:
2

เอาท์พุท: truthy

ทำไม?

หากเราแยกเมทริกซ์เป็นบล็อกของ2 by 2เราจะเห็นว่าบล็อกทั้งหมดในเมทริกซ์หนึ่งสามารถพบได้ในเมทริกซ์อื่น:

Matrix 1:
1 2 | 3 4 | 5 6
7 8 | 9 0 | 1 2
---------------
3 4 | 5 6 | 7 8
9 8 | 7 6 | 5 4
---------------
3 2 | 1 0 | 9 8
1 1 | 1 1 | 1 1

Matrix 2:
3 2 | 9 8 | 7 8
1 1 | 1 1 | 5 4
---------------
3 4 | 5 6 | 1 0
9 0 | 7 6 | 1 1
---------------
5 6 | 1 2 | 3 4
1 2 | 7 8 | 9 8

กฏท้าทาย:

  • คุณสามารถสันนิษฐานได้ว่าการฝึกอบรมจะมีเฉพาะตัวเลขที่ไม่เป็นลบ (ช่วง[0,9])
  • คุณสามารถสมมติว่าความกว้าง / ความสูงของเมทริกซ์เท่ากันและหลายเท่า n
  • คุณสามารถสันนิษฐานได้ว่าnจะอยู่ในช่วง[1, 50]และความกว้าง / [1,100]ความสูงของการฝึกอบรมอยู่ในช่วง
  • บล็อกของแต่ละn by nสามารถใช้ได้เพียงครั้งเดียวเพื่อตรวจสอบว่าการฝึกอบรมที่มีการเปลี่ยนลำดับของแต่ละอื่น ๆ n by nเมื่อแยกออกเป็นกลุ่มของ
  • อาจมีหลายn by nช่วงตึกที่เหมือนกัน
  • n by nบล็อกจะยังคงอยู่ในทิศทางเดียวกันเมื่อตรวจสอบว่าทั้งสองมีการฝึกอบรมการเปลี่ยนแปลงของแต่ละอื่น ๆ n by nเมื่อแยกออกเป็นกลุ่มของ

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานใช้สำหรับคำตอบของคุณด้วยกฎ I / O เริ่มต้นดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและประเภทผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงก์พร้อมทดสอบรหัสของคุณ (เช่นTIO )
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

กรณีทดสอบ:

Input:
Matrix 1:       Matrix 2:       Integer:
1 2 3 4 5 6     3 2 9 8 7 8     2
7 8 9 0 1 2     1 1 1 1 5 4
3 4 5 6 7 8     3 4 5 6 1 0
9 8 7 6 5 4     9 0 7 6 1 1
3 2 1 0 9 8     5 6 1 2 3 4
1 1 1 1 1 1     1 2 7 8 9 8
Output:
truthy

Input:
Matrix 1:       Matrix 2:       Integer:
1 2 3 4 5 6     3 2 9 8 7 8     1
7 8 9 0 1 2     1 1 1 1 5 4
3 4 5 6 7 8     3 4 5 6 1 0
9 8 7 6 5 4     9 0 7 6 1 1
3 2 1 0 9 8     5 6 1 2 3 4
1 1 1 1 1 1     1 2 7 8 9 8
Output:
truthy

Input:
Matrix 1:       Matrix 2:       Integer:
1 2 3 4 5 6     3 2 9 8 7 8     3
7 8 9 0 1 2     1 1 1 1 5 4
3 4 5 6 7 8     3 4 5 6 1 0
9 8 7 6 5 4     9 0 7 6 1 1
3 2 1 0 9 8     5 6 1 2 3 4
1 1 1 1 1 1     1 2 7 8 9 8
Output:
falsey

Input:
Matrix 1:    Matrix 2:    Integer:
1 2 3 4      1 2 3 4      4
2 3 4 5      2 3 4 5
3 4 5 6      3 4 5 6
4 5 6 7      4 5 6 7
Output:
truthy

Input:
Matrix 1:    Matrix 2:    Integer:
1 2 3 4      3 4 3 4      2
2 3 4 5      4 5 4 5
3 4 5 6      1 2 5 6
4 5 6 7      2 3 6 6
Output:
falsey

Input:
Matrix 1:    Matrix 2:    Integer:
1 2          2 3          1
3 4          1 1
Output:
falsey

Input:
Matrix 1:    Matrix 2:    Integer:
0            8            1
Output:
falsey

Input:
Matrix 1:    Matrix 2:    Integer:
1 2 3 4      1 2 1 2      2
5 6 7 8      5 6 5 6
9 0 0 9      0 9 9 0
4 3 2 1      2 1 4 3
Output:
falsey

Input:
Matrix 1:    Matrix 2:    Integer:
1 2 1 2      9 5 1 2      2
3 4 3 4      7 7 3 4
8 3 9 5      1 2 8 3
6 1 7 7      3 4 6 1
Output:
truthy

Input:
Matrix 1:      Matrix 2:      Integer:
1 0 2 0 0 3    1 1 1 0 0 3    2
1 1 1 1 1 1    2 0 1 1 1 1
2 2 2 2 2 2    2 2 2 2 2 2
3 3 3 3 3 3    3 3 3 3 3 3
4 4 4 4 4 4    4 4 4 4 4 4
5 5 5 5 5 5    5 5 5 5 5 5
Output:
falsey

Pastebin พร้อมเมทริกซ์ใน[[,]]รูปแบบ


เราสามารถใช้เมทริกซ์เป็นรายการเมทริกซ์ได้หรือไม่?
Jo King

@JoKing คุณหมายถึงรายการที่มีเมทริกซ์ทั้งสองแทนที่จะแยกเมทริกซ์อินพุตสองรายการหรือไม่ ถ้านั่นคือสิ่งที่คุณกำลังถามอยู่แล้วทำไมล่ะ
Kevin Cruijssen

เซตที่เกี่ยวข้องกันอย่างหลวม
นาย Xcoder

ทำไมถึงเป็นตัวอย่าง[ [ 0 ] ], [ [ 25 ] ], 1? ฉันเข้าใจYou can assume the matrices will only contain non-negative digits (range [0,9])ว่าค่าเมทริกซ์อยู่ระหว่าง 0 ถึง 9 เท่านั้น?
Olivier Grégoire

2
@ OlivierGrégoireขออภัยเพิ่มกฎเกี่ยวกับช่วงใน[0,9]ภายหลังใน Sandbox [[0]],[[8]]ฉันได้เปลี่ยนกรณีการทดสอบเพื่อ
Kevin Cruijssen

คำตอบ:


4

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

ż⁹/ẎsṢʋ€E

ลองออนไลน์! (หรือด้วยการประมวลผลล่วงหน้าเพื่อให้คัดลอกและวางได้ง่ายขึ้นจากกรณีทดสอบ)

ลิงก์ dyadic ยอมรับรายการของเมทริกซ์สองรายการ (เป็นรายการของรายการ) ทางด้านซ้ายและจำนวนเต็มทางด้านขวาซึ่งให้1หรือหรือความ0จริงหรือเท็จตามลำดับ

อย่างไร?

ż⁹/ẎsṢʋ€E - Link: [M1, M2]; N
       €  - for each of [M1, M2]:
      ʋ   -   last four links as a dyad (i.e. f(M, N)):
 ⁹        -     (chain's right argument, N)
 ⁹/       -     N-wise-reduce with:
ż         -       zip together
   Ẏ      -     tighten
    s     -     split into chunks of length N
     Ṣ    -     sort
        E - equal?

8

APL (Dyalog Extended) , 19 18 17 ไบต์

-2 ขอบคุณ ngn

ฟังก์ชั่นเงียบสงบไม่ระบุชื่อ รับnอาร์กิวเมนต์ด้านซ้ายและรายการเมทริกซ์สองตัวเป็นอาร์กิวเมนต์ที่ถูกต้อง ต้องใช้การจัดทำดัชนีเป็นศูนย์ ( ⎕IO←0) บังเอิญฟังก์ชั่นนี้ทำงานบนอาร์เรย์ของจำนวนมิติใด ๆ

≡.{∧,⍵⊂⍨⊂0=⍺|⍳≢⍵}

ลองออนไลน์!

≡.{} ผลลัพธ์ที่เหมือนกันของฟังก์ชันต่อไปนี้ที่ใช้กับเมทริกซ์แต่ละตัวด้วยnas ?

≢⍵ ขนาดของเมทริกซ์

 ดัชนี 0 … size – 1

⍺| ส่วนที่เหลือเมื่อหารด้วย n

 ล้อมรอบเพื่อใช้ตามมิติทั้งหมด

⍵⊂⍨ ใช้มันเพื่อแบ่ง * เมทริกซ์เป็นเมทริกซ์ย่อย
  * เริ่มพาร์ติชันใหม่เมื่อองค์ประกอบที่สอดคล้องกันน้อยกว่าก่อนหน้า; ลบองค์ประกอบที่ทำเครื่องหมายด้วยศูนย์

, ravel เมทริกซ์ลงในรายการเมทริกซ์ย่อย

 เรียงจากน้อยไปมาก


(≢⍵)⍴⍺↑1-> 0=⍺|⍳≢⍵(พร้อม⎕io←0)
ngn

@ngn ขอบคุณ เสร็จสิ้น
อดัม

≡/{}¨->≡.{}
ngn

@ngn เรียบร้อยแล้ว ขอบคุณ
อดัม


6

Perl 6 , 94 68 63 ไบต์

{[eqv] map *.rotor($^a).map({[Z] $_}).flat.rotor($a²).sort,@_}

ลองออนไลน์!

รหัสที่ไม่ระบุชื่อบล็อกที่จะเข้าเป็นและส่งกลับแบบบูลsize, [matrix1, matrix2] True/Falseอาจมีวิธีที่มีประสิทธิภาพมากกว่าในการแยกเมทริกซ์ออกเป็นชิ้นrotor

คำอธิบาย:

{                                                            }  # Anonymous code block
       map                                                ,@_   # For both matrices 
           *.rotor($^a)   # Split the matrix into N sized chunks
                       .map({[Z] $_})  # Then zip each of those chunks together
                                     .flat  # Flatten the resulting list
                                          .rotor($a²)  # Then split into the NxN lists
                                                     .sort   # And sort them
 [eqv]    # And then check if the lists are equivalent 


4

Java (JDK) , 221 ไบต์

(n,a,b)->{java.util.Arrays A=null;int l=a.length,x=l/n,i=0,j,z;var c=new String[x*x];A.fill(c,"");var d=c.clone();for(;i<l;i++)for(j=0;j<l;d[z]+=b[i][j++])c[z=i/n+j/n*x]+=a[i][j];A.sort(c);A.sort(d);return A.equals(c,d);}

ลองออนไลน์!

คำอธิบาย

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

(n,a,b)->{
 java.util.Arrays A=null;             // Shortcut A for the several java.util.Arrays that'll come
 int l=a.length,x=l/n,i=0,j,z;        // Variable declarations
 var c=new String[x*x];               // Declare the small squares list
 A.fill(c,"");                        // Fill the lists of small squares with the empty string.
 var d=c.clone();                     // Make a copy of the list, for the second matrix
 for(;i<l;i++)
  for(j=0;j<l;d[z]+=b[i][j++])        // For each matrix cell
   c[z=i/n+j/n*x]+=a[i][j];           // Fill the small square with the value, string-wise
 A.sort(c);A.sort(d);                 // Sort both small squares list
 return A.equals(c,d);                // Return true if they're equal, false otherwise.
}

เครดิต

  • -12 ไบต์ขอบคุณ Kevin Cruijssen!

คุณลืมตีกอล์ฟfor(j=0;j<l;){c[z=i/n+j/n*x]+=a[i][j];d[z]+=b[i][j++];}หรือไม่ .. คุณสามารถลบวงเล็บโดยใส่ทุกอย่างไว้ในลูป นอกจากนี้i=0สามารถลบอินวงได้เนื่องจากคุณiอยู่ที่ 0 แล้วเมื่อมีการประกาศ
Kevin Cruijssen

และสิ่งหนึ่งที่จริง ๆ แล้วกอล์ฟ: var d=new String[x*x];สามารถvar d=c.clone();แทนได้ 234 ไบต์
Kevin Cruijssen

PS: เหตุใด TIO ของคุณมีสตริงที่คุณแปลงเป็นอาร์เรย์จำนวนเต็ม 2 มิติ ฉันได้เพิ่ม paste-bin พร้อมเคสทดสอบที่ด้านล่างซึ่งคุณสามารถแทนที่[และ]ด้วย{และ}และเพิ่มผู้นำnew int[][]และมันก็เพียงพอแล้ว ;)
Kevin Cruijssen

Dammit ฉันไม่เห็น paste-bin :( และสำหรับส่วนที่เหลือฉันยังเล่นกอล์ฟอยู่ฉันทำแบบคร่าวๆ แต่ขอขอบคุณ :-)
Olivier Grégoire

เป็นเศษเล็กเศษน้อยเมื่อฉันเต็มไปด้วยอาร์เรย์ด้วยตัวเองมากกว่าที่จะใช้i=0 Arrays.fillขอบคุณ :-) และสำหรับcloneฉันคิดเกี่ยวกับการใช้ แต่ฉันยังคงคิดว่ามันจะได้กลับมาObjectและไม่ใช่ประเภทที่แท้จริง ฉันจะต้องมีหลายเวอร์ชั่นในตอนนี้;)
Olivier Grégoire

4

Japt , 18 ไบต์

®mòV yòV rc n qÃr¥

ลองออนไลน์!

คำอธิบาย:

®              Ã      #Apply this to each of the input matrices:
 mòV                  # Split each row into groups of n
     yòV              # Split each column into groups of n
         rc           # Flatten into a list of nxn submatrices
            n         # Sort that list
              q       # Turn it into a string
                r¥    #Return true if both matrices had identical results

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


2
ฉันจะดูว่าฉันสามารถใช้เวลาระหว่างการประชุมในวันพรุ่งนี้เพื่อลองและA.e()ทำงานกับอาร์เรย์หลายมิติได้หรือไม่ ตั้งใจจะกลับมาหามันเสมอ ในระหว่างนี้ÕmòV-> yòVจะช่วยให้คุณประหยัดไบต์
Shaggy

โดยวิธีการที่มีข้อ จำกัด เกี่ยวกับการเปรียบเทียบอาร์เรย์เพื่อความเท่าเทียมกันคือ JavaScript ของแทนที่จะเป็นเฉพาะ Japt;)
ปุย

4

TSQL, 164 ไบต์

การเติมข้อมูลตัวแปรตารางเพื่อให้มีการป้อนข้อมูลการสร้างอินพุตและการแทรกข้อมูลนี้ไม่รวมอยู่ในจำนวนไบต์ เฉพาะแบบสอบถามจริงเพื่อดึงข้อมูล

Golfed (ไม่รวมตารางทดสอบ - สามารถพบได้ในเวอร์ชันที่ไม่ได้รับการตี):

SELECT iif(exists(SELECT*FROM(SELECT string_agg(v,'')within
group(order by x,y)s,m FROM @t GROUP BY x/@,y/@,m)x
GROUP BY s HAVING max(m)=min(m)or sum(m-.5)<>0),0,1)

Ungolfed:

-- test data
DECLARE @ INT = 2
-- x = x-position of the input
-- y = y-position of the input
-- v = value
-- m = matrix(0 or 1)
DECLARE @t table(x int, y int, v int, m int)
--insert first matrix values
INSERT @t values
(0,0,1,0),(0,1,2,0),(0,2,1,0),(0,3,2,0),
(1,0,3,0),(1,1,4,0),(1,2,3,0),(1,3,4,0),
(2,0,8,0),(2,1,3,0),(2,2,9,0),(2,3,5,0),
(3,0,6,0),(3,1,1,0),(3,2,7,0),(3,3,7,0)
INSERT @t values
(0,0,9,1),(0,1,5,1),(0,2,1,1),(0,3,2,1),
(1,0,7,1),(1,1,7,1),(1,2,3,1),(1,3,4,1),
(2,0,1,1),(2,1,2,1),(2,2,8,1),(2,3,3,1),
(3,0,3,1),(3,1,4,1),(3,2,6,1),(3,3,1,1)

-- query
SELECT iif(exists
  (
    SELECT *
    FROM
    (
      SELECT string_agg(v,'')within group(order by x,y)s,m
      FROM @t
      GROUP BY x/@,y/@,m
    ) x
    GROUP BY s
    HAVING max(m)=min(m)or sum(m-.5)<>0
  ),0,1)

ลองดู


4

JavaScript (ES6), 88 ไบต์

(n,a,b)=>(g=a=>a.map((r,y)=>r.map((v,x)=>o[y/n<<7|x/n]+=[v]),o=[])&&o.sort()+o)(a)==g(b)

ลองออนไลน์!

อย่างไร?

รหัสนี้คือ:

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

เป็นการใช้ประโยชน์จากขีด จำกัด ที่อธิบายไว้ในการท้าทาย:

  • เมทริกซ์ประกอบด้วยตัวเลขหลักเดียวดังนั้นเราก็สามารถเชื่อมเซลล์ทั้งหมดของย่อยเมทริกซ์โดยไม่ต้องแยกใด ๆ และยังคงได้รับการแสดงที่เป็นเอกลักษณ์ของมัน (เช่น[[1,2],[3,4]]สามารถเก็บไว้เป็น"1234")

  • ความกว้างของเมทริกซ์การป้อนข้อมูลน้อยกว่าหรือเท่ากับ 100. ในการแปลงพิกัด(x,Y) ในอินพุตเมทริกซ์เป็นดัชนีสล็อตเฉพาะ ผม ในพื้นที่จัดเก็บของเราเราสามารถทำ:

    ผม=Yn×128+xn

    หรือเป็นรหัส JS: y / n << 7 | x << n

แสดงความคิดเห็น

(n, a, b) =>           // n, a, b = input variables (integer, matrix 1, matrix 2)
  (g = a =>            // g = helper function taking one of the two matrices
    a.map((r, y) =>    // for each row r[] at position y in a[]:
      r.map((v, x) =>  //   for each value v at position x in r[]:
        o[             //     update o[]:
          y / n << 7 | //       the position of the slot is computed by taking advantage
          x / n        //       of the limit on the matrix width (see above)
        ] += [v]       //     coerce v to a string and append it to o[slot]
                       //     all slots are initially undefined, so all resulting strings
                       //     are going to start with "undefined", which is harmless
      ),               //   end of inner map()
      o = []           //   start with o = empty array
    ) &&               // end of outer map()
    o.sort() + o       // sort o[] and coerce it to a string by concatenating it with itself
  )(a) == g(b)         // test whether g(a) is equal to g(b)

3

ถ่าน , 54 49 ไบต์

1FθF⪪ιηF÷L§κ⁰η⊞υEκ§⪪μηλW∧υ⊟υ¿№✂υ⁰⊘⊕Lυ¹ι≔Φυ⁻⌕υιλυ⎚

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

1

ถือว่าประสบความสำเร็จ

Fθ

วนรอบอาร์เรย์

F⪪ιη

แบ่งอาร์เรย์ออกเป็นnแถวขนาดที่มีขนาด

F÷L§κ⁰η

วนซ้ำแต่ละคอลัมน์

⊞υEκ§⪪μηλ

แตกอันคอลัมน์สำหรับแต่ละแถวของแถวอันและบันทึก submatrix ผลลัพธ์ในรายการ

W∧υ⊟υ

ในขณะที่รายการไม่ว่างให้ลบอันสุดท้ายของรายการซึ่งภายใต้สถานการณ์ปกติมาจากอาร์เรย์ที่สอง

¿№✂υ⁰⊘⊕Lυ¹ι

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

≔Φυ⁻⌕υιλυ

หากไม่ใช่ศูนย์ให้ลบอันแรกของรายการนั้นออกจากรายการ

หากศูนย์แล้วล้างผลลัพธ์ทำให้เป็นเท็จ



2

Haskell, 74 73 ไบต์

import Data.Lists
i#m|c<-chunksOf i=c.transpose=<<c m
(m!n)i=i#m\\i#n==[]

หมายเหตุ: TIO ยังไม่ได้ติดตั้งData.Listsดังนั้นฉันจึงใช้Data.Listฟังก์ชั่นที่ขาดหายไปแทนchunksOf: ลองออนไลน์!

i#m=           -- function '#' makes a list of all transposed jigsaw blocks of matrix 'm'
               -- of size 'i'
 c<-chunksOf i -- define helper function 'c' that splits it's argument into
               -- chunks of site 'i'
         c m   -- split the matrix into chunks of size 'i'
      =<<      -- for each chunk
   transpose   --   transpose
 c.            --   and split into chunks of size 'i', again
               -- flatten one level of nesting ('=<<' is concatMap)

(m!n)i=        -- main function
    i#m\\i#n   -- remove every element of i#n from i#m
      ==[]     -- and check if it results in an empty list  

2

C # (Visual C # Interactive Compiler) , 186 ไบต์

(a,b,n)=>{string[]s(int[][]c){int i=0,j,l=a.Length,m=l/n;var r=new string[m*m];for(;i<l;i++)for(j=0;j<l;)r[i/n*m+j/n]+=c[i][j++];Array.Sort(r);return r;}return s(a).SequenceEqual(s(b));}

ลองออนไลน์!

-1 ขอบคุณ @KevinCruijssen!

รหัส golfed น้อยกว่า:

// anonymous function
// a and b are 2d jagged arrays
// n is the size of the sub matrix
(a,b,n)=>{
  // helper function that translates
  // the sub matrices into strings
  // of digits.
  string[]s(int[][]c){
    // i and j are loop counters
    int i=0,j,
      // l is the size of a side of a matrix
      l=a.Length,
      // m is the number of sub matrices
      // per side of a matrix
      m=l/n;
    // the concatenated digits are
    // stored in a single dimension
    // array
    var r=new string[m*m];
    // nested loops build up
    // the digit strings
    for(;i<l;i++)
      for(j=0;j<l;)
        r[i/n*m+j/n]+=c[i][j++];
    // The resulting array is
    // sorted before it is returned for
    // ease of comparison.
    Array.Sort(r);
    return r;
  }
  return s(a).SequenceEqual(s(b));
}

สิ่งเล็ก ๆ น้อย ๆ อย่างหนึ่งในการตีกอล์ฟj++สามารถถอดออก+=c[i][j++]+" ";ได้
Kevin Cruijssen

ขอบคุณสำหรับเคล็ดลับ :) ที่น่าสนใจพอฉันมากับวิธีการแก้ปัญหาที่แน่นอนเช่นเดียวกับ Java หนึ่ง
dana

1

PHP ,186 163 162 ไบต์

function($a,$b,$n){$f=function($j,$n){foreach($j as$x=>$r)foreach($r as$y=>$v)$o[count($j)*($x/$n|0)+$y/$n|0].=$v;sort($o);return$o;};return$f($a,$n)==$f($b,$n);}

ลองออนไลน์!

เช่นเดียวกับความท้าทายที่ดีทั้งหมดฉันเริ่มคิดว่ามันค่อนข้างง่ายและมันทำให้ฉันรู้สึกโค้ง ทำได้ดีมาก @Kevin Cruijssen!

สับเมทริกซ์เป็นสตริงที่มีค่าสำหรับแต่ละบล็อก อาร์เรย์จะถูกจัดเรียงและเปรียบเทียบเพื่อความเท่าเทียมกัน

Ungolfed:

function jigsaw_chunk( $j, $n ) {
    foreach( $j as $x => $r ) {
        foreach( $r as $y => $v ) {
            $o[ count( $j ) * floor( $x/$n ) + floor( $y/$n )] .= $v;
        }
    }
    sort( $o );
    return $o;
}

function jigsaw_test( $a, $b, $n ) {
    return jigsaw_chunk( $a, $n ) == jigsaw_chunk( $b, $n );
}

// Test 6
var_dump( jigsaw_test( [[1,2],[3,4]], [[2,3],[1,1]], 1 ) );

เอาท์พุต

bool(false)

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