Matrycy przemiennego znak jest n
w n
matrycy składającej się z liczb 1, 0, 1, takie, że:
- Suma każdego wiersza i kolumny to 1
- Niezerowe wpisy w każdym wierszu i kolumnie występują naprzemiennie w znaku
Macierze te uogólniają macierze permutacyjne, a liczba takich macierzy dla danego n
była przez pewien czas przedmiotem zainteresowania. Występują one naturalnie podczas kondensacyjnej metody obliczania macierzy (kondensatora Dodgsona) (nazwanej na cześć Charlesa Dodgsona, lepiej znanego jako Lewis Carroll).
Oto kilka przykładów macierzy naprzemiennych 4 na 4:
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
A oto kilka przykładów macierzy 4 na 4, które nie są naprzemiennymi macierzami znaków:
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)
Twój program lub funkcja będzie podawany był n
przez n
matrycę ( n >= 1
) z -1s, 0 i 1 - wyprowadzenia wartości truthy jeśli dana macierz jest macierzą zmienny znak, inaczej wyjście A wartość falsy.
To jest golf golfowy , więc celem jest zminimalizowanie liczby używanych bajtów.
Przypadki testowe
Poniższe przypadki testowe podano w formacie listy 2D w stylu Pythona.
Prawda:
[[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]]
Odpowiedzi:
Siatkówka ,
62585653 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1 i
\t
należy je zastąpić rzeczywistymi tabulatorami (0x09, które w przeciwnym razie byłyby zamienione na spacje przez SE).Format wejściowy to macierz, w której każda kolumna używa trzech znaków wyrównanych do prawej, np .:
Dane wyjściowe to
0
(fałsz) lub1
(prawda).Zestaw testowy. (Kilka pierwszych wierszy przekształca format wejściowy i pozwala Retinie na uruchomienie kilku przypadków testowych jednocześnie.)
Wyjaśnienie
Na szczęście dane wejściowe są matrycą kwadratową: transpozycja kwadratów jest prawie wykonalna w siatkówce, podczas gdy transpozycja prostokątów jest ogromnym bólem.
Zaczynamy od dodania tabulacji, całego wejścia ponownie (przy użyciu prefiksu
$`
), a następnie zakończenia linii na końcu (przy użyciu aliasu Retina¶
). Używamy tabulatorów, aby oddzielić dwie kopie, abyśmy mogli rozróżnić je podczas transpozycji jednego z nich, a używając znaku spacji, możemy później zapisać kilka bajtów.To jest najtrudniejszy bit: transpozycja pierwszej kopii matrycy. Chodzi o to, aby dopasować komórki w pierwszej kopii, a następnie posortować je (stabilnie) według pozycji poziomej. Dopasowujemy komórki do
...
(ponieważ mają one zawsze trzy znaki szerokości), a następnie mierzymy pozycję poziomą za pomocą(.+)
środka spojrzenia. Następnie, aby upewnić się, że transponujemy tylko pierwszą kopię, sprawdzamy, czy możemy dotrzeć do początku ciągu bez przechodzenia obok karty.Możesz zauważyć, że dopasuje to również niektóre trzy bajtowe ciągi (które nawet nie wyrównują się z komórkami) w pierwszym rzędzie drugiej kopii, ponieważ
.+
mogą przechodzić przez kartę. Nie stanowi to jednak problemu, ponieważ pozioma pozycja tych dopasowań jest ściśle większa niż jakakolwiek wewnątrz pierwszej kopii, więc dopasowania te pozostają na swoim miejscu.Reszta jest dość prosta:
Usuwamy spacje i zera z danych wejściowych.
I na koniec sprawdzamy, czy całe dane wejściowe składają się z zakończonych białymi wierszami formularza
1(-11)*
, tj. Naprzemiennej sekwencji1
i-1
zaczynającej się i kończącej na1
(bo inaczej nie sumuje się1
).źródło
Galaretka, 15 bajtów
Wypróbuj online!
źródło
Pyth, 16 bajtów
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
źródło
Galaretka , 11 bajtów
Zwraca 1 dla naprzemiennych macierzy znaków, w przeciwnym razie 0 . Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
tło
Bez względu na zera, każdy wiersz i kolumna musi składać się ze wzoru (1, -1) * 1 , tzn. Naprzemiennie występujących 1 i -1 , rozpoczynających się i kończących na 1 (więc suma wynosi 1 ).
Aby to sprawdzić, bierzemy tablicę wszystkich wierszy i kolumn i łączymy je za pomocą -1 jako separatora. Ponieważ wszystkie punkty końcowe mają wartość 1 , wynikowa płaska tablica spełnia wzór (1, -1) * 1 wtedy i tylko wtedy, gdy spełniają to wiersze i kolumny.
Dla rzeczywistego testu obliczamy skumulowaną sumę tablicy. Na matrycy znak przemiennego wynikiem będzie tablica 0 „S 1 ” S, która kończy się 1 .
Odwracamy sumę skumulowaną i deduplikujemy ją, zachowując kolejność początkowych wystąpień wszystkich unikalnych elementów. W przypadku prawdziwych danych wejściowych wynikiem będzie lista [1, 0] .
Aby wyprowadzić odpowiedni Boolean, konwertujemy zduplikowane sumy skumulowane z wartości binarnych na liczby całkowite i sprawdzamy, czy wynikiem jest 2 .
Jak to działa
źródło
MATL,
18161513 bajtów3 bajty zapisane dzięki @Luis
To rozwiązanie przyjmuje tablicę 2D jako dane wejściowe i wyświetla tablicę prawdy lub falseya . Należy zauważyć, że w MATL tablica prawdy składa się ze wszystkich niezerowych elementów, podczas gdy wynik falsey ma co najmniej jeden element zerowy. Oto kolejna demonstracja tablic true / falsey .
Wypróbuj online
Zmodyfikowana wersja, aby pokazać wszystkie przypadki testowe
Wyjaśnienie
źródło
Julia, 36 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
112100 bajtówSpłaszcza tablicę i jej transpozycję do ciągów, a następnie (ignorując
0
s) sprawdza wzorzec1-11...1-11
w każdym ciągu.Edycja: Zapisano 12 bajtów dzięki @PeterTaylor.
źródło
-11-1...-11-1
bo od wpisy alternatywny i mieć pozytywny sumę, musi istnieć jeden więcej1
niż-1
, więc wzór musi być1-11...1-11
.Python 2,
6360 bajtówDane wejściowe to lista krotek.
Kończy się to kodem wyjścia 0 dla naprzemiennych macierzy znaków i kodem wyjścia 1 w przeciwnym razie. Co to jest prawda i fałsz i - jak pokazano w sekcji weryfikacji - może być rzeczywiście użyte jako warunek np. W skrypcie Bash.
Weryfikacja
test-skrzynki.txt
test-suite.sh
Wynik
Jak to działa
Pomijając zera, każdy wiersz i kolumna musi składać się ze wzoru (1, -1) * 1 , tzn. Naprzemiennie występujących 1 i -1 , rozpoczynających się i kończących na 1 (więc suma jest1 ).
Aby to sprawdzić, spakowujemy / transponujemy macierz wejściową M , dołączamy wynik do M (teraz składający się z listy wierszy i kolumn) i poprzedzamy -1 do każdego wiersza / kolumny.
Na przykład jeśli M jest jedną z następujących macierzy (poprawna, niepoprawna)
wyniki są
Odczyt wygenerowanej macierzy wierszowo musi skutkować płaską sekwencją ze wzorem (-1, 1) * . Aby to sprawdzić, bierzemy sumę wszystkich wpisów, zaczynając od górnego rzędu.
W przypadku przykładowych macierzy daje to wynik
W przypadku prawidłowej macierzy znaków przemiennych dane wyjściowe będą składać się z -1 i 0 oraz - ponieważ każde -1 anuluje poprzednie 1 i odwrotnie - żadnych innych liczb.
Na pierwszy rzut oka może się to nie sprawdzać, czy ostatnia kolumna kończy się na 1 . Jednak w przypadku macierzy n × n zawierającej k zer, prawidłowe wiersze będą zawierać n + k jedynek. Gdyby wszystkie kolumny oprócz ostatniej były również poprawne , w kolumnach byłoby n + k - 1 , co jest niemożliwe.
Aby sprawdzić, czy nie ma innych liczb, przechowujemy sumy częściowe w zmiennej s i aktualizujemy je dla każdego wpisu z wygenerowaną macierzą za pomocą
s+=[n][s]
.Jeśli s = 0 lub s = -1 , jest to równoważne z
s+=n
. Jednak dla wszystkich innych wartości s powoduje błąd IndexErr , więc Python natychmiast kończy działanie z kodem wyjścia 1 . Jeśli tak się nie stanie, program kończy się z kodem wyjścia 0 .źródło
R, 54 bajty
Funkcja anonimowa, wykorzystuje tę samą logikę, co odpowiedzi Pytona 2, Galaretki i Julii Dennisa.
źródło