Matrix Yapboz Oyunları


24

Giriş:

  • Bir tam sayı n
  • İki eşit büyüklükte kare matris (genişlikleri / yüksekliklerinin katları olduğu n)

Çıktı:

Kendi seçtikleri iki farklı değerlere, bir truthy sonuçları için varlık ve Falsey sonuçları için birinin bir (yani evet, 1/0yerine true/falsehalde Java gibi diller için geçerli çıkışları vardır bunlar resmi truthy / Falsey değerlerini kabul edilmezler ).

Truthy / falsey çıktısı n by n, bir matristeki boyut bloklarını diğer matrikse eşit yapmak için yeniden düzenleyip düzenleyemeyeceğimizi gösterir .

Örnek:

Giriş:

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

Çıktı: truthy

Niye ya?

Matrisleri bloklar halinde 2 by 2bölersek, bir matristeki tüm blokların diğer matriste de bulunabileceğini görebiliriz:

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

Meydan okuma kuralları:

  • Matrislerin yalnızca negatif olmayan basamaklar içereceğini varsayabilirsiniz (aralık [0,9])
  • Matrislerin genişlik / yüksekliğinin eşit olduğunu ve n
  • nAralık aralığında olacağını [1, 50]ve matrislerin genişliğinin / yüksekliğinin aralıkta olduğunu varsayabilirsiniz [1,100].
  • Bireysel bloklar n by n, bir matrisin bloklara bölündüğünde birbirinin permütasyonu olup olmadığını belirlemek için yalnızca bir kez kullanılabilir n by n.
  • Aynı olan birden fazla n by nblok olabilir .
  • n by nDenetlerken iki matris bloklarının zaman bölme birbirinden permütasyon ise blok aynı yönde kalır n by n.

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Standart G / Ç kurallarına cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT işlevlerini, uygun parametreleri içeren fonksiyonlar / yöntemleri ve dönüş tipini, tam programları kullanmanıza izin verilir. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuzu test eden bir bağlantı ekleyin (ör. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemek şiddetle tavsiye edilir.

Test durumları:

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

Formatında matrisli pastebin [[,]].


Matrisleri bir matris listesi olarak alabilir miyiz?
Jo King,

@JoKing İki ayrı matris girişi yerine her iki matrisi de içeren bir liste mi demek istiyorsunuz? Eğer sorduğun buysa, o zaman elbette, neden olmasın.
Kevin Cruijssen


Örnek neden [ [ 0 ] ], [ [ 25 ] ], 1var? You can assume the matrices will only contain non-negative digits (range [0,9])Matris değerlerinin sadece 0 ile 9 arasında olduğunu anladım.
Olivier Grégoire

2
@ OlivierGrégoire Üzgünüz, Sandbox'taki aralık hakkında bu kuralı ekledik [0,9]. Test durumunu değiştirdim [[0]],[[8]].
Kevin Cruijssen

Yanıtlar:


4

Jöle ,  10  9 bayt

ż⁹/ẎsṢʋ€E

Çevrimiçi deneyin! (veyatest senaryosundan daha kolay kopyalayıp yapıştırmak için ön işleme ile )

Bu verimler sağda solda (listelerinin listeleri) iki matrisin bir listesini kabul İKİLİ Bağlantı tam sayı 1ya da 0truthy ya Falsey, sırasıyla.

Nasıl?

ż⁹/Ẏ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 Genişletilmiş) , 19 18 17 bayt

-2 sayesinde ngn.

Anonim tam yapıştırma işlevi. Alır nsol argüman ve sağ argüman olarak iki matrisin listesi olarak. Sıfır endeksleme ( ⎕IO←0) gerektirir . Bu arada, bu işlev herhangi bir sayıda boyuttaki dizilerde çalışır.

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

Çevrimiçi deneyin!

≡.{... } , aşağıdaki fonksiyonun aynı sonuçlar her bir matris uygulanan sahip nolarak ?

≢⍵ matris boyutu

 0… büyüklük – 1

⍺| Kalan zaman bölme n

 tüm boyutlar boyunca kullanmak

⍵⊂⍨ Bunu, matrisi bir alt matris matrisine bölmek için kullanın
  . sıfır ile işaretlenmiş öğeleri kaldırır

, matrisi bir alt listeye yerleştirmek

 artan sırada


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

@ ngn Teşekkürler. Bitti.
Adám

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

@ngn Tamam. Teşekkürler.
Adám


6

Perl 6 , 94 68 63 bayt

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

Çevrimiçi deneyin!

Girişi alan adsız kod bloğu size, [matrix1, matrix2] ve bir boolean döndürenTrue/False . Matrisi ikiye ayırmanın daha etkili bir yolu olabilir rotor.

Açıklama:

{                                                            }  # 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 bayt

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

Çevrimiçi deneyin!

açıklama

Fikir, her küçük hücreyi karşılaştırılabilir bir dize olarak seçmek ve daha sonra bu dizeleri sıralamak ve sırayla karşılaştırmaktır.

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

Kredi

  • -12 byte Kevin Cruijssen sayesinde!

Golfü unuttun for(j=0;j<l;){c[z=i/n+j/n*x]+=a[i][j];d[z]+=b[i][j++];}mu? .. Her şeyi döngünün içine koyarak dirsekleri çıkarabilirsin. Ayrıca, i=0döngü içinde kaldırılabilir, çünkü ibildirimde zaten 0'dır.
Kevin Cruijssen

Ve aslında golf oynamak için bir şey: bunun yerine var d=new String[x*x];olabilir var d=c.clone();. 234 bayt
Kevin Cruijssen

Not: TIO'nız neden 2D-integer dizilerine dönüştürdüğünüz String içeriyor? Sana değiştirebilirsiniz hangi altındaki test durumlarda, bir macun-bin ekledik [ve ]ile {ve }bir lider eklemek new int[][]ve bu yeterli olurdu. ;)
Kevin Cruijssen

Kahretsin, yapıştırma kutusunu görmemiştim :( Ve geri kalanı için hala golf oynuyorum. Zorlu bir pas atmıştım, ama teşekkür ederim :-)
Olivier Grégoire

i=0Doğrusu kullanmaktan daha başıma dizileri dolu olduğunda kalmaydı Arrays.fill. Teşekkürler :-) Ve cloneben onu kullanmayı düşündüm, ama yine Objectde gerçek tipte değil iade ettiğini düşündüm . Bu noktada geç birkaç sürüm olmalı;)
Olivier Grégoire

4

Japt , 18 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

"Dizgiye dönüştür" adımı gereklidir, çünkü Japt dizileri değere göre karşılaştırmaz ve etrafta çalışacak yapı çok boyutlu diziler için işe yaramaz .


2
A.e()Çok boyutlu diziler için çalışmak ve çalışmak için yarın toplantılar arasında biraz zaman ayırabilir miyim, göreceğim . her zaman geri dönmek istemiştim. Bu arada ÕmòV-> yòVsize bir bayt kazandırır.
Shaggy,

Bu arada, eşitlik için dizileri karşılaştırmanın sınırlaması, Japt'a özgü olmaktan ziyade JavaScript'in JavaScript'idir;)
Shaggy,

4

TSQL, 164 bayt

Girdi elde etmek için bir tablo değişkenini doldurmak, bu girdi oluşturma ve veri ekleme bayt sayısına dahil edilmemiştir. Verileri ayıklamak için yalnızca gerçek sorgu.

Golf (test tablosu dahil değil) - eski sürümde bulunabilir):

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)

Denemek


4

JavaScript (ES6), 88 bayt

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

Çevrimiçi deneyin!

Nasıl?

Bu kod:

  • Her giriş matrisindeki tüm alt matrislerin hücrelerin bir birleşimi olarak çıkarılması
  • alt matrisleri sözlükbilim sırasına göre sıralama
  • sonucun her iki giriş matrisi için de aynı olup olmadığını test etme

Mücadelede açıklanan limitlerden faydalanıyor:

  • Bir matris, tek basamaklardan oluşur, böylece bir alt matrisin tüm hücrelerini herhangi bir ayırıcı olmadan birleştirebilir ve yine de benzersiz bir sunumunu elde [[1,2],[3,4]]edebiliriz (örn "1234". Olarak saklanabilir ).

  • Giriş matrislerinin genişliği şuna küçük veya eşittir. 100. Koordinatları dönüştürmek için(x,y) giriş matrisinde benzersiz bir slot indeksine ben depolama alanımızda şunları yapabiliriz:

    ben=ynx128+xn

    veya JS kodu olarak: y / n << 7 | x << n

Yorumlananlar

(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

Kömür , 54 49 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Girdiyi eşit boyutlu iki boyutlu bir dizi dizisi olarak alır. Başarıda 1, başarısızlıkta hiçbir şey çıkmaz. Açıklama:

1

Başarıya varmak.

Fθ

Diziler üzerinde döngü.

F⪪ιη

Diziyi nboyutlandırılmış satır parçalarına bölün .

F÷L§κ⁰η

Her sütun öbek üzerinde döngü.

⊞υEκ§⪪μηλ

Satır yığınının her satırı için sütun yığınını çıkarın ve elde edilen alt matrisi bir listeye kaydedin.

W∧υ⊟υ

Liste boş olmasa da, normal koşullar altında ikinci diziden gelen listenin son parçasını kaldırın.

¿№✂υ⁰⊘⊕Lυ¹ι

Normal koşullar altında ilk diziden kalan parçaları içeren listenin ilk yarısında bu öbeklerin oluşum sayısını sayın.

≔Φυ⁻⌕υιλυ

Sıfır değilse, bu öbek ilk oluşumunu listeden kaldırın.

Sıfırsa, çıktıyı temizleyin, yanlış hale getirin.



2

Haskell, 74 73 bayt

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

Not: TIO yüklü değil Data.Lists, bu yüzden Data.Listeksik bir fonksiyon eklemek için kullanıyorum chunksOf: Çevrimiçi deneyin!

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 # Etkileşimli Derleyici) , 186 bayt

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

Çevrimiçi deneyin!

-1 @KevinCruijssen!

Daha az golf kodu:

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

Golf için küçük bir şey, j++kaldırılabilir ve +=c[i][j++]+" ";bir bayt kurtarmak için de yerleştirilebilir .
Kevin Cruijssen

Tavsiyen için teşekkürler :) İlginçtir, Java ile neredeyse aynı çözümü buldum.
Dana

1

PHP ,186 163 162 bayt

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

Çevrimiçi deneyin!

Tüm iyi zorluklar gibi, bunun oldukça kolay olduğunu düşünmeye başladım ve bana biraz eğri attı. Güzelce @Kevin Cruijssen!

Matrisi, her blok için değerleri içeren dizgilere bölün. Diziler daha sonra sıralanır ve eşitlik için karşılaştırılır.

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

Çıktı

bool(false)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.