矩阵拼图


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 。


我们可以将矩阵作为矩阵列表吗?
乔·金

@JoKing您的意思是包含两个矩阵的列表,而不是两个分开的矩阵输入?如果这是您要的内容,那么请确定为什么。
凯文·克鲁伊森


为什么出现示例[ [ 0 ] ], [ [ 25 ] ], 1?我了解You can assume the matrices will only contain non-negative digits (range [0,9])矩阵值仅在0到9之间?
OlivierGrégoire

2
@OlivierGrégoire抱歉,[0,9]稍后在沙盒中添加了有关范围的规则。我已将测试用例更改为[[0]],[[8]]
凯文·克鲁伊森

Answers:


4

果冻 10  9 字节

ż⁹/ẎsṢʋ€E

在线尝试!(或具有预处理功能,以便更轻松地从测试用例中复制和粘贴)

双向链接在左边接受两个矩阵的列表(作为列表的列表),在右边接受整数,分别产生10为真或假。

怎么样?

ż⁹/Ẏ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扩展)19 18 17字节

-2感谢ngn。

匿名默认隐式函数。需要n作为左参数,并将两个矩阵的列表作为右参数。需要零索引(⎕IO←0)。顺便说一句,此函数可用于任意数量维的数组。

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

在线尝试!

≡.{... } 相同下面的函数的结果施加到每个矩阵n作为

≢⍵ 矩阵大小

 索引0…大小–1

⍺| 除以除数 n

 封闭使用于所有尺寸

⍵⊂⍨ 用它来将矩阵划分为子矩阵矩阵,
  当对应的元素小于前一个元素时开始新的划分;删除以零标记的元素

, 将矩阵放入子矩阵列表中

 升序


(≢⍵)⍴⍺↑1-> 0=⍺|⍳≢⍵(with ⎕io←0
ngn

@ngn谢谢。做完了
阿达姆,

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

@ngn完成。谢谢。
阿达姆(Adám)


6

Perl 6的94个68 63字节

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

在线尝试!

匿名代码块,将input作为输入size, [matrix1, matrix2]并返回boolean 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可以删除循环中的in,因为您的i声明时已经为0。
凯文·克鲁伊森

高尔夫的一件事是:var d=new String[x*x];可以var d=c.clone();代替。234个字节
Kevin Cruijssen

PS:为什么您的TIO包含要转换为2D整数数组的String?我添加了一个贴斌与测试用例底部,以便您可以更换[,并]{},并添加一个领先的new int[][],而且就足够了。;)
Kevin Cruijssen

该死的,我没看过粘贴桶:(其余的,我还在打高尔夫球。我打了一个粗糙的传球,但谢谢你:-)
OlivierGrégoire

i=0当我自己而不是使用填充数组时,这是一个残余Arrays.fill。谢谢:-)并且clone我考虑过要使用它,但我仍然认为它会返回an Object而不是实际类型。到那时我必须是几个版本了;)
OlivierGré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将为您节省一个字节。
毛茸茸的

顺便说一句,比较数组是否相等的限制是JavaScript的,而不是Japt特有的;)
Shaggy

4

TSQL,164字节

为了具有输入而填充表变量,此创建输入和插入数据未包括在字节数中。只有实际查询才能提取数据。

打高尔夫球(不包括测试台-可以在非高尔夫版本中找到):

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)

取消高尔夫:

-- 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ÿ 在输入矩阵中插入唯一的槽索引 一世 在我们的存储区域中,我们可以执行以下操作:

    一世=ÿñ×128+Xñ

    或作为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κ§⪪μηλ

为行块的每一行提取列块,并将结果子矩阵保存在列表中。

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#交互式编译器),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!

减少打高尔夫球的代码:

// 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++]+" ";节省一个字节的位置。
凯文·克鲁伊森

感谢您的技巧:)有趣的是,我想出了几乎与Java完全相同的解决方案。
dana

1

PHP186 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做得好!

将矩阵分成包含每个块值的字符串。然后对数组进行排序并比较相等性。

取消高尔夫:

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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.