Alternatif işaret matrisi doğrulaması


16

Bir alternatif işaret matrisi olan bir nile nsayı oluşan matris -1, 0, 1, öyle ki:

  • Her satır ve sütunun toplamı 1'dir.
  • Her satır ve sütundaki sıfırdan farklı girişler işaret içinde değişir

Bu matrisler permütasyon matrislerini genelleştirir ve belirli bir nsüre için bu matrislerin sayısı bir süredir ilgi çekicidir. Matris determinantlarının hesaplanması için Dodgson yoğuşma yöntemi sırasında doğal olarak ortaya çıkarlar (daha önce Lewis Carroll olarak bilinen Charles Dodgson'un adını almıştır).

İşte 4'e 4 alternatif işaret matrislerine bazı örnekler:

 0  1  0  0          1  0  0  0          0  0  1  0          0  0  1  0    
 0  0  1  0          0  0  1  0          0  1 -1  1          1  0 -1  1
 1  0  0  0          0  1 -1  1          1 -1  1  0          0  1  0  0
 0  0  0  1          0  0  1  0          0  1  0  0          0  0  1  0

Ve burada dönüşüm işareti matrisleri olmayan 4 x 4 matrislerinden bazı örnekler:

 0  1  0  0
 0  0  0  1
 1  0  0  0
 0  0  1 -1    (last row and last column don't add to 1)

 0  0  0  1
 1  0  0  0
-1  1  1  0
 1  0  0  0    (third row does not alternate correctly)

İşletme programı ve fonksiyon olarak verilecektir ngöre nmatris ( n >= 1çıkışı olarak bir - -1S, 0 ve 1 arasında) truthy değeri Aksi taktirde çıkış verilen matris alternatif bir işaret matrisi ise bir falsy değer.

Bu , bu yüzden amaç kullanılan bayt sayısını en aza indirmektir.

Test senaryoları

Aşağıdaki test senaryoları Python benzeri 2D liste formatında verilmiştir.

Doğru:

[[1]]
[[1,0],[0,1]]
[[0,1],[1,0]]
[[0,1,0],[0,0,1],[1,0,0]]
[[0,1,0],[1,-1,1],[0,1,0]]
[[0,1,0,0],[0,0,1,0],[1,0,0,0],[0,0,0,1]]
[[1,0,0,0],[0,0,1,0],[0,1,-1,1],[0,0,1,0]]
[[0,0,1,0],[0,1,-1,1],[1,-1,1,0],[0,1,0,0]]
[[0,0,1,0],[1,0,-1,1],[0,1,0,0],[0,0,1,0]]
[[0,0,1,0,0],[0,1,-1,1,0],[1,-1,1,0,0],[0,1,0,-1,1],[0,0,0,1,0]]
[[0,0,1,0,0,0,0,0],[1,0,-1,0,1,0,0,0],[0,0,0,1,-1,0,0,1],[0,0,1,-1,1,0,0,0],[0,0,0,0,0,0,1,0],[0,0,0,0,0,1,0,0],[0,1,-1,1,0,0,0,0],[0,0,1,0,0,0,0,0]]
[[0,0,0,0,1,0,0,0],[0,0,1,0,-1,1,0,0],[0,0,0,1,0,0,0,0],[1,0,0,-1,1,-1,1,0],[0,1,-1,1,-1,1,0,0],[0,0,0,0,1,0,0,0],[0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1]]

Falsy:

[[0]]
[[-1]]
[[1,0],[0,0]]
[[0,0],[0,1]]
[[-1,1],[1,0]]
[[0,1],[1,-1]]
[[0,0,0],[0,0,0],[0,0,0]]
[[0,1,0],[1,0,1],[0,1,0]]
[[-1,1,1],[1,-1,1],[1,1,-1]]
[[0,0,1],[1,0,0],[0,1,-1]]
[[0,1,0,0],[0,0,0,1],[1,0,0,0],[0,0,1,-1]]
[[0,0,1,0],[0,0,1,0],[1,0,-1,1],[0,1,0,0]]
[[0,0,0,1],[1,0,0,0],[-1,1,1,0],[1,0,0,0]]
[[1,0,1,0,-1],[0,1,0,0,0],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,0,1]]
[[0,0,1,0,0],[0,1,-1,1,0],[1,-1,1,0,0],[0,1,1,-1,0],[0,0,-1,1,1]]
[[0,-1,0,1,1],[1,-1,1,-1,1],[0,1,1,0,-1],[1,1,-1,1,-1],[-1,1,0,0,1]]
[[0,0,1,0,0,0,0,0],[1,0,1,0,1,0,0,0],[0,0,0,1,-1,0,0,1],[0,0,1,-1,1,0,0,0],[0,0,0,0,0,0,1,0],[0,0,0,0,0,1,0,0],[0,1,-1,1,0,0,0,0],[0,0,1,0,0,0,0,0]]

Yanıtlar:


3

Retina , 62 58 56 53 bayt

Bayt sayısı ISO 8859-1 kodlamasını varsayar ve \tbunların yerine gerçek sekmeler (aksi takdirde SE tarafından boşluklara dönüştürülecek 0x09) kullanılmalıdır.

$
\t$`¶
O$#`...(?<=^[^\t]*(.+))
$.1
T` 0
^(1(-11)*\s)+$

Giriş biçimi, her sütunun sağa hizalı üç karakter kullandığı bir matristir, örneğin:

  0  0  1  0
  1  0 -1  1
  0  1  0  0
  0  0  1  0

Çıktı ya 0(yanlış) ya da 1(doğrudur).

Test odası. (İlk birkaç satır giriş formatını dönüştürür ve Retina'nın aynı anda birkaç test senaryosu çalıştırmasına izin verir.)

açıklama

Neyse ki, girdi kare bir matristir: transpozisyon kareleri Retina'da hemen hemen yapılabilirken, transpozisyonların dikilmesi büyük bir acıdır.

$
\t$`¶

Bir sekme, tüm girdiyi tekrar (önek kullanarak $`) ve ardından sonuna satır besleme (Retina takma adı kullanarak) ekleyerek başlarız . İki kopyayı ayırmak için bir sekme kullanıyoruz, böylece bunlardan birini aktarırken aralarında ayrım yapabiliyoruz ve bir boşluk karakteri kullanarak daha sonra birkaç bayt kaydedebiliriz.

O$#`...(?<=^[^\t]*(.+))
$.1

Bu en zor bit: matrisin ilk kopyasını aktarma. Fikir, ilk kopyadaki hücreleri eşleştirmek ve sonra onları yatay konuma göre (stabil olarak) sıralamaktır. Hücreleri ...(her zaman üç karakter genişliğinde olduklarından) ile eşleştiriyoruz ve sonra (.+)gözbebekünün içindeki yatay konumu ölçüyoruz . Ardından, yalnızca ilk kopyayı aktardığımızdan emin olmak için, bir sekmeyi geçmeden dizenin başlangıcına ulaşabileceğimizi kontrol ederiz.

Bunun .+sekmenin içinden geçebileceğinden , ikinci kopyanın ilk satırında bazı üç baytlık dizelerle (hücrelerle bile hizalanmayan) eşleşeceğini fark edebilirsiniz. Ancak, bu bir sorun değildir, çünkü bu eşleşmelerin yatay konumu ilk kopyanın içindeki konumlardan kesinlikle daha büyüktür, bu nedenle bu eşleşmeler konumlarında kalır.

Gerisi oldukça basit:

T` 0

Girişteki boşlukları ve sıfırları kaldırıyoruz.

^(1(-11)*\s)+$

Ve son olarak, tüm giriş formunun boşluk ile sonlanan sırası içeren kontrol 1(-11)*, yani dönüşümlü bir dizisi 1ve -1bu başlar ile uçları 1(aksi takdirde toplamı değildir, çünkü 1).


3

Jöle, 15 bayt

;Zḟ€0;€-;@€-IFP

Çevrimiçi deneyin!

;Zḟ€0;€-;@€-IFP   Main monadic chain. Argument: z

;Z                Concatenate with its transpose.
  ḟ€0             Remove zeros from each sub-list. At this point,
                  one expects lists of the form [1, -1, 1, -1, ..., 1] for truthy,
                  and any other arrays containing purely 1 and -1 for falsey.
     ;€-          Append -1 to each sub-list.
        ;€@-      Prepend -1 to each sub-list.
            I     Compute the difference between each term. At this point,
                  for truthy, one expects arrays filled with 2, and arrays
                  containing 0 otherwise.
             FP   Product of every item. This checks if any item is equal to zero.

3

Pyth, 16 bayt

!sm-sM._+d_1U2+C

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

!sm-sM._+d_1U2+CQQ   two implicit Qs (=input matrix) at the end
              +CQQ   zip Q and connect it with Q (=list of columns and rows)
  m                  map each column/row d to:
        +d_1            append -1 to d
      ._                compute all prefixes of ^
    sM                  compute the sums of the prefixes
   -        U2          remove zeros and ones
                        a column/row is correct, if this gives an empty list 
 s                   connect up all resulting lists
!                    check, if this result is empty

3

Jöle , 11 bayt

;Zj-+\ṚQḄ=2

Alternatif işaret matrisleri için 1 , aksi takdirde 0 değerini döndürür . Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Arka fon

Sıfır göz ardı edilerek, her satır ve sütun desen ibaret olan (1, -1) * 1 arasında, örneğin, alternatif oluşumları 1 ve -1 , başlangıç ve bitiş ile 1 (çok toplamı olan 1 ).

Bu durumda doğrulamak için, hepimiz satır ve sütun dizisi almak ve kullanma onlara katılmak -1 ayırıcı olarak. Tüm uç noktalar 1 'olduğu için, sonuçta elde edilen düz dizi (1, -1) * 1 desenini yalnızca ve satırlar yaparsa karşılar .

Gerçek test için dizinin kümülatif toplamını hesaplıyoruz. Alternatif bir işaret matris, sonuç bir dizi olacaktır 0 'ın ve 1 ', bir o uçların s , 1 .

Kümülatif toplamı tersine çevirir ve tekilleştirerek tüm benzersiz öğelerin ilk oluşum sırasını koruyoruz. Doğru bir girdi için sonuç liste [1, 0] olacaktır .

Karşılık gelen Boolean çıktısını almak için, çoğaltılan toplamları ikili sayıdan tam sayıya dönüştürüyoruz ve sonucun 2 olup olmadığını test ediyoruz .

Nasıl çalışır

;Zj-+\ṚQḄ=2  Main link. Argument: M (matrix / 2D array)

 Z           Zip; transpose M's rows and columns.
;            Concatenate M and zipped M.
  j-         Join, separating by -1.
    +\       Take the cumulative sum of the result.
      Ṛ      Reverse the array of partial sums.
       Q     Unique; deduplicate the partial sums.
        Ḅ    Unbinary; convert from base 2 to integer.
         =2  Test for equality with 2.

2

MATL, 18 16 15 13 bayt

@Luis sayesinde 3 byte tasarruf edildi

t!h"@s1=@Xzdv

Bu çözüm, bir 2D diziyi giriş olarak kabul eder ve bir doğruluk veya falsey dizisi çıkarır . MATL'de gerçek olmayan bir dizinin sıfır olmayan tüm elemanlardan oluştuğunu, bir falsey sonucunun en az bir sıfır elemanına sahip olduğunu belirtmek önemlidir. İşte doğruluk / falsey dizilerinin bir başka gösterimi .

Çevrimiçi Deneyin

Tüm test senaryolarını göstermek için değiştirilmiş sürüm

açıklama

        % Implicitly grab input matrix
t!      % Duplicate and transpose input
h       % Horizontally concatenate input with transpose. This allows us to 
        % process only columns since now the columns *also* contain the rows.
"       % For each column (of our column/row combined matrix)
  @s1=  % Compute the sum and ensure it is equal to 1
  @Xz   % Get the non-zeros
  d     % Compute the element-to-element difference. The 1 and -1 alternate only if
        % all these differences are non-zero
  v     % Vertically concatenate everything on the stack
        % Implicit end of loop and implicitly display truthy/falsey value


1

JavaScript (ES6), 112 , 100 bayt

a=>!/(^|,)(?!0*10*(-10*10*)*(,|$))/.test(a.map(b=>b.join``)+','+a.map((_,i)=>a.map(b=>b[i]).join``))

Diziyi ve sırasını dizelere düzleştirir, ardından (yoksayılıyor 0) 1-11...1-11her dizedeki deseni kontrol eder .

Düzenleme: @PeterTaylor sayesinde 12 bayt kaydedildi.


1
Sen desen kontrol etmek gerekmez -11-1...-11-1olumlu toplamı çünkü girişleri alternatif beri ve daha bir tane olmalı 1daha -1desen olmalıdır, böylece 1-11...1-11.
Peter Taylor

@PeterTaylor Ugh, bu soruyu ikinci kez yanlış okudum. (İlk kez ilgili yorumlar silinmişti.)
Neil

Başlık 110 bayt diyor, ancak sadece 100
Peter Taylor

1
@PeterTaylor En azından "@PeterTaylor sayesinde kaydedilen 12 bayt" doğruydu.
Neil

1

Python 2, 63 60 bayt

s=0;x=input()
for r in x+zip(*x):
 for n in(-1,)+r:s+=[n][s]

Girdi tuples bir listesidir.

Bu , alternatif işaret matrisleri için çıkış kodu 0 ve aksi takdirde çıkış kodu 1 ile sona erer . Bu ne doğrudur ve yanlış -yap, - doğrulama bölümünde gösterildiği gibi - bu gerçekten örneğin bir koşul, bir Bash komut dosyası olarak kullanılabilir.

Doğrulama

Test-cases.txt

[(1,)]
[(1, 0), (0, 1)]
[(0, 1), (1, 0)]
[(0, 1, 0), (0, 0, 1), (1, 0, 0)]
[(0, 1, 0), (1, -1, 1), (0, 1, 0)]
[(0, 1, 0, 0), (0, 0, 1, 0), (1, 0, 0, 0), (0, 0, 0, 1)]
[(1, 0, 0, 0), (0, 0, 1, 0), (0, 1, -1, 1), (0, 0, 1, 0)]
[(0, 0, 1, 0), (0, 1, -1, 1), (1, -1, 1, 0), (0, 1, 0, 0)]
[(0, 0, 1, 0), (1, 0, -1, 1), (0, 1, 0, 0), (0, 0, 1, 0)]
[(0, 0, 1, 0, 0), (0, 1, -1, 1, 0), (1, -1, 1, 0, 0), (0, 1, 0, -1, 1), (0, 0, 0, 1, 0)]
[(0, 0, 1, 0, 0, 0, 0, 0), (1, 0, -1, 0, 1, 0, 0, 0), (0, 0, 0, 1, -1, 0, 0, 1), (0, 0, 1, -1, 1, 0, 0, 0), (0, 0, 0, 0, 0, 0, 1, 0), (0, 0, 0, 0, 0, 1, 0, 0), (0, 1, -1, 1, 0, 0, 0, 0), (0, 0, 1, 0, 0, 0, 0, 0)]
[(0, 0, 0, 0, 1, 0, 0, 0), (0, 0, 1, 0, -1, 1, 0, 0), (0, 0, 0, 1, 0, 0, 0, 0), (1, 0, 0, -1, 1, -1, 1, 0), (0, 1, -1, 1, -1, 1, 0, 0), (0, 0, 0, 0, 1, 0, 0, 0), (0, 0, 1, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 1)]
[(0,)]
[(-1,)]
[(1, 0), (0, 0)]
[(0, 0), (0, 1)]
[(-1, 1), (1, 0)]
[(0, 1), (1, -1)]
[(0, 0, 0), (0, 0, 0), (0, 0, 0)]
[(0, 1, 0), (1, 0, 1), (0, 1, 0)]
[(-1, 1, 1), (1, -1, 1), (1, 1, -1)]
[(0, 0, 1), (1, 0, 0), (0, 1, -1)]
[(0, 1, 0, 0), (0, 0, 0, 1), (1, 0, 0, 0), (0, 0, 1, -1)]
[(0, 0, 1, 0), (0, 0, 1, 0), (1, 0, -1, 1), (0, 1, 0, 0)]
[(0, 0, 0, 1), (1, 0, 0, 0), (-1, 1, 1, 0), (1, 0, 0, 0)]
[(1, 0, 1, 0, -1), (0, 1, 0, 0, 0), (0, 0, 0, 0, 1), (0, 0, 0, 1, 0), (0, 0, 0, 0, 1)]
[(0, 0, 1, 0, 0), (0, 1, -1, 1, 0), (1, -1, 1, 0, 0), (0, 1, 1, -1, 0), (0, 0, -1, 1, 1)]
[(0, -1, 0, 1, 1), (1, -1, 1, -1, 1), (0, 1, 1, 0, -1), (1, 1, -1, 1, -1), (-1, 1, 0, 0, 1)]
[(0, 0, 1, 0, 0, 0, 0, 0), (1, 0, 1, 0, 1, 0, 0, 0), (0, 0, 0, 1, -1, 0, 0, 1), (0, 0, 1, -1, 1, 0, 0, 0), (0, 0, 0, 0, 0, 0, 1, 0), (0, 0, 0, 0, 0, 1, 0, 0), (0, 1, -1, 1, 0, 0, 0, 0), (0, 0, 1, 0, 0, 0, 0, 0)]

test-suite.sh

while read; do
        if python2 asmv.py <<< "$REPLY"; then
                echo "true"
        else
                echo "false"
        fi
done < test-cases.txt 2>&- | uniq -c

Çıktı

$ bash test-suite.sh
     12 true
     17 false

Nasıl çalışır

Sıfır göz ardı edilerek, her satır ve sütun desen ibaret olan (1, -1) * 1 arasında, örneğin, alternatif oluşumları 1 ve -1 , başlangıç ve bitiş ile 1 (çok toplamı olan 1 ).

Bu durumda doğrulamak için, zip / giriş matris devrik M , komuta sonucu M (şimdi bir sıralar ve sütunlar listesinden oluşan) ve başa getirebilir -1 her satır / sütununa.

Örneğin, M aşağıdaki matrislerden biriyse (geçerli, geçersiz)

     0  1  0         0  0  0
     0  0  1         1  0  0
     1  0  0         0  1 -1

sonuçlar

-1 | 0  1  0    -1 | 0  0  0
-1 | 0  0  1    -1 | 1  0  0
-1 | 1  0  0    -1 | 0  1 -1
------------    ------------
-1 | 0  0  1    -1 | 0  1  0
-1 | 1  0  0    -1 | 0  0  1
-1 | 0  1  0    -1 | 0  0 -1

Oluşturulan matrisin satır bazında okunması, desen (-1, 1) * ile düz bir sıra ile sonuçlanmalıdır . Durumun bu olduğunu doğrulamak için, tüm satırların en üst satırından başlayarak toplamını alırız.

Örnek matrisler için bu,

-1 -1  0  0 -1 -1 -1  0 -1  0  0  0 -1 -1 -1  0 -1  0  0  0 -1 -1  0  0
-1 -1 -1 -1 -2 -1 -1 -1 -2 -2 -1 -2 -3 -3 -2 -2 -3 -3 -3 -2 -3 -3 -3 -4

Geçerli alternatif işareti matris için çıkış oluşacak -1 'in ve 0 ' ın ve - her yana -1 önceki sadeleşir 1 başka numaraları - ve tam tersi.

İlk bakışta, bu, son sütunun 1 ile bitip bitmediğini kontrol etmede başarısız gibi görünebilir . Bununla birlikte, k sıfırları içeren bir n × n matrisi için , geçerli satırlar n + k olanlarını içerecektir . Sonuncusu hariç tüm sütunlar da geçerli olsaydı , sütunlarda n + k - 1 olanlar olurdu , bu imkansızdır.

Başka sayı olmadığını test etmek için, kısmi toplamları değişken s'de saklarız ve oluşturulan matris ile her girişi için güncelleriz s+=[n][s].

Eğer s, 0 = ve s = -1 , bu eşdeğerdir s+=n. Ancak, diğer tüm s değerleri için , bir IndexError neden olur , bu nedenle Python hemen çıkış kodu 1 ile sonlanır . Bu herhangi bir noktada gerçekleşmezse, program çıkış kodu 0 ile temiz bir şekilde biter .


0

R, 54 bayt

Anonim işlev, Dennis'in Python 2, Jelly ve Julia'nın cevaplarıyla aynı mantığı kullanır.

function(x)all(abs(cumsum(rbind(-1,cbind(t(x),x))))<2)
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.