Teka-teki Matriks Jigsaw

24

Memasukkan:

  • Bilangan bulat n
  • Dua matriks persegi berukuran sama (dengan lebar / tinggi menjadi kelipatan n)

Keluaran:

Salah satu dari dua nilai berbeda pilihan Anda sendiri, satu untuk hasil yang benar dan satu untuk hasil falsey (jadi ya, 1/0alih-alih true/falsemerupakan output yang valid untuk bahasa seperti Java, meskipun mereka tidak dianggap sebagai nilai kebenaran / falsey resmi ).

Keluaran truthy / falsey menunjukkan apakah kita dapat mengatur ulang ukuran blok n by ndalam satu matriks untuk membuatnya sama dengan matriks lainnya.

Contoh:

Memasukkan:

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

Keluaran: truthy

Mengapa?

Jika kita membagi matriks dalam blok 2 by 2, kita dapat melihat bahwa semua blok pada satu matriks juga dapat ditemukan dalam matriks lain:

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

Aturan tantangan:

  • Anda dapat mengasumsikan matriks hanya akan berisi digit non-negatif (rentang [0,9] )
  • Anda dapat mengasumsikan lebar / tinggi matriks sama, dan kelipatan n
  • Anda dapat mengasumsikan nakan berada dalam kisaran [1, 50], dan lebar / tinggi matriks berada dalam kisaran[1,100] .
  • Blok individual n by nhanya dapat digunakan sekali untuk menentukan apakah matriks adalah permutasi satu sama lain ketika dipecah menjadi blok n by n.
  • Mungkin ada beberapa n by nblok yang sama.
  • The n by nblok akan tetap dalam orientasi yang sama ketika memeriksa jika dua matriks yang permutasi dari satu sama lain ketika dibagi menjadi blok n by n.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda dengan aturan I / O default , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

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 dengan matriks dalam [[,]]format.

Kevin Cruijssen
sumber
Bisakah kita mengambil matriks sebagai daftar matriks?
Jo King
@ JoKing Maksud Anda daftar dengan kedua matriks, bukan dua input matriks yang terpisah? Jika itu yang Anda tanyakan, maka tentu saja, mengapa tidak.
Kevin Cruijssen
Subset terkait longgar .
Tn. Xcoder
Mengapa contoh [ [ 0 ] ], [ [ 25 ] ], 1ini ada? Saya mengerti dengan You can assume the matrices will only contain non-negative digits (range [0,9])bahwa nilai-nilai matriks hanya antara 0 dan 9?
Olivier Grégoire
2
@ OlivierGrégoire Maaf, menambahkan aturan tentang rentang [0,9]nanti di Sandbox. Saya telah mengubah test case menjadi [[0]],[[8]].
Kevin Cruijssen

Jawaban:

4

Jelly ,  10  9 byte

ż⁹/ẎsṢʋ€E

Cobalah online! (atau dengan pra-pemrosesan untuk lebih mudah salin & tempel dari kasus uji)

Sebuah dyadic Link menerima daftar dari dua matriks (sebagai daftar daftar) di sebelah kiri dan bilangan bulat di sebelah kanan yang menghasilkan 1atau 0untuk masing-masing kebenaran atau kesalahan.

Bagaimana?

ż⁹/Ẏ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?
Jonathan Allan
sumber
8

APL (Dyalog Extended) , 19 18 17 byte

-2 Terima kasih kepada ngn.

Fungsi infiks diam-diam anonim. Membawa nargumen kiri dan daftar dua matriks sebagai argumen benar. Membutuhkan pengindeksan nol ( ⎕IO←0). Secara kebetulan, fungsi ini bekerja pada array dari sejumlah dimensi.

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

Cobalah online!

≡.{... } hasil identik fungsi berikut diterapkan untuk setiap matriks dengan nsebagai ?

≢⍵ ukuran matriks

 indeks 0… ukuran – 1

⍺| pembagian divisi ketika dibagi dengan n

 lampirkan untuk digunakan sepanjang semua dimensi

⍵⊂⍨ gunakan itu untuk mempartisi * matriks ke dalam matriks pengajuan
  * memulai partisi baru ketika elemen yang sesuai kurang dari yang sebelumnya; menghapus elemen yang ditandai dengan nol

, letakkan matriks dalam daftar submatrices

 semacam naik

Adm
sumber
(≢⍵)⍴⍺↑1-> 0=⍺|⍳≢⍵(with ⎕io←0)
ngn
@ ngn Terima kasih. Selesai
Adám
≡/{}¨->≡.{}
ngn
@ ngn Selesai. Terima kasih.
Adám
6

Python 2 , 108 103 byte

lambda s,*a:len(set(`sorted(sum([zip(*[iter(zip(*l))]*s)for l in zip(*[iter(m)]*s)],[]))`for m in a))<2

Cobalah online!

TFeld
sumber
6

Perl 6 , 94 68 63 byte

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

Cobalah online!

Blok kode anonim yang mengambil input sebagai size, [matrix1, matrix2]dan mengembalikan boolean True/False. Mungkin ada cara yang lebih efisien untuk memecah matriks menjadi potongan daripada rotor.

Penjelasan:

{                                                            }  # 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 
Jo King
sumber
4

Java (JDK) , 221 byte

(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);}

Cobalah online!

Penjelasan

Idenya adalah untuk mengambil setiap sel kecil sebagai string, yang sebanding, dan kemudian untuk menyortir string itu dan membandingkannya secara berurutan.

(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.
}

Kredit

  • -12 byte terima kasih kepada Kevin Cruijssen!
Olivier Grégoire
sumber
Apakah Anda lupa bermain golf for(j=0;j<l;){c[z=i/n+j/n*x]+=a[i][j];d[z]+=b[i][j++];}? .. Anda dapat melepas tanda kurung dengan meletakkan semua yang ada di dalam loop. Juga, i=0dalam loop dapat dihapus, karena Anda isudah 0 pada deklarasi.
Kevin Cruijssen
Dan satu hal untuk benar-benar golf: var d=new String[x*x];bisa var d=c.clone();sebaliknya. 234 byte
Kevin Cruijssen
PS: Mengapa TIO Anda berisi String yang Anda konversi ke array 2D-integer? Saya telah menambahkan nampan tempel dengan kotak uji di bagian bawah, yang untuknya Anda dapat mengganti [dan ]dengan {dan }dan menambahkan pelopor new int[][], dan itu sudah cukup. ;)
Kevin Cruijssen
Sialan, aku belum melihat pasta-bin :( Dan untuk sisanya, aku masih bermain golf. Aku melakukan umpan kasar, tapi terima kasih :-)
Olivier Grégoire
Itu i=0adalah sisa ketika saya mengisi array sendiri daripada menggunakan Arrays.fill. Terima kasih :-) Dan untuk clonesaya berpikir tentang menggunakannya, tapi saya masih berpikir itu akan mengembalikan Objectdan bukan tipe yang sebenarnya. Saya harus beberapa versi terlambat pada saat itu;)
Olivier Grégoire
4

Japt , 18 byte

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

Cobalah online!

Penjelasan:

®              Ã      #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

Langkah "Mengubahnya menjadi string" diperlukan karena Japt tidak membandingkan array dengan nilai dan builtin untuk bekerja di sekitar yang tidak bekerja untuk array multidimensi .

Kamil Drakari
sumber
2
Saya akan melihat apakah saya dapat menyediakan waktu di antara pertemuan besok untuk mencoba dan mulai A.e()bekerja untuk array multi-dimensi; selalu bermaksud untuk kembali ke sana. Sementara itu ÕmòV-> yòVakan menghemat satu byte.
Shaggy
Omong-omong, batasan membandingkan array untuk kesetaraan adalah JavaScript daripada khusus untuk Japt;)
Shaggy
4

TSQL, 164 byte

Mengisi variabel tabel untuk mendapatkan input, input input dan data penyisipan ini belum dimasukkan dalam jumlah byte. Hanya kueri aktual untuk mengekstrak data.

Golf (tidak termasuk tabel tes - dapat ditemukan dalam versi yang tidak disunat):

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)

Tidak Disatukan:

-- 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)

Cobalah

t-clausen.dk
sumber
4

JavaScript (ES6), 88 byte

(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)

Cobalah online!

Bagaimana?

Kode ini adalah:

  • mengekstraksi semua sub-matriks dalam setiap matriks input sebagai gabungan sel
  • mengurutkan sub-matriks dalam urutan leksikografis
  • menguji apakah hasilnya sama untuk kedua matriks input

Itu mengambil keuntungan dari batasan yang dijelaskan dalam tantangan:

  • Matriks terdiri dari digit tunggal, jadi kita bisa menggabungkan semua sel sub-matriks tanpa pemisah apa pun dan masih mendapatkan representasi uniknya (misalnya [[1,2],[3,4]]dapat disimpan sebagai "1234").

  • 100(x,y)I

    I=yn×128+xn

    atau sebagai kode JS: y / n << 7 | x << n

Berkomentar

(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)
Arnauld
sumber
3

Arang , 54 49 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input sebagai array array dua dimensi berukuran sama. Output 1 pada kesuksesan, tidak ada pada kegagalan. Penjelasan:

1

Asumsikan sukses.

Fθ

Loop di atas array.

F⪪ιη

Membagi array menjadi npotongan baris terukuran.

F÷L§κ⁰η

Ulangi setiap potongan kolom.

⊞υEκ§⪪μηλ

Ekstrak potongan kolom untuk setiap baris dari potongan baris dan simpan submatrix yang dihasilkan dalam daftar.

W∧υ⊟υ

Sementara daftar adalah kosong, hapus potongan terakhir dari daftar, yang dalam keadaan normal berasal dari array kedua.

¿№✂υ⁰⊘⊕Lυ¹ι

Hitung jumlah kemunculan potongan itu di paruh pertama daftar, yang dalam keadaan normal berisi potongan yang tersisa dari array pertama.

≔Φυ⁻⌕υιλυ

Jika bukan nol maka hapus kejadian pertama dari potongan itu dari daftar.

Jika nol maka hapus output, membuatnya palsu.

Neil
sumber
2

J , 55 byte

[:-:/[([:/:~([*-@[)]\,@])"3(((;])@(#@]$1{.~[),;.1])&>])

Cobalah online!

Solusi yang mengerikan, baru saja membuatnya bekerja - saya tidak punya kekuatan untuk bermain golf ...

Galen Ivanov
sumber
2

Haskell, 74 73 byte

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

Catatan: TIO belum diinstal Data.Lists, jadi saya menggunakan Data.Listfungsi add yang hilang chunksOf: Coba online!

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  
nimi
sumber
2

C # (Visual C # Interactive Compiler) , 186 byte

(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));}

Cobalah online!

-1 terima kasih kepada @KevinCruijssen!

Lebih sedikit kode golf:

// 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));
}
dana
sumber
Satu hal kecil untuk golf, j++dapat dihapus dan dapat ditempatkan di +=c[i][j++]+" ";untuk menyimpan byte.
Kevin Cruijssen
Terima kasih atas tipnya :) Cukup menarik, saya datang dengan solusi yang hampir sama persis dengan Java.
dana
1

PHP ,186 163 162 byte

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);}

Cobalah online!

Seperti semua tantangan yang baik, saya mulai berpikir ini cukup mudah dan itu memberi saya beberapa kurva. @Kevin Cruijssen sudah selesai!

Memotong matriks menjadi string yang berisi nilai untuk setiap blok. Array kemudian disortir dan dibandingkan untuk kesetaraan.

Tidak Disatukan:

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 ) );

Keluaran

bool(false)
640KB
sumber
1

Merah , 148 147 142 byte

func[a b n][g: func[m][
sort collect[loop k:(length? m)/ n[i: 0
loop k[keep/only
collect[loop n[keep
take/part m/(i: i + 1) n]]]]]](g a)= g b]

Cobalah online!

Galen Ivanov
sumber