Weź jako dane wejściowe macierz A składającą się z dodatnich liczb całkowitych i pojedynczą dodatnią liczbę całkowitą N i ustal, czy istnieje co najmniej N kolejnych wystąpień tej samej liczby w dowolnym wierszu lub kolumnie w macierzy.
Musisz tylko przetestować poziomo i pionowo.
Przypadki testowe
N = 1
A =
1
Result: True
----------------
N = 3
A =
1 1 1
2 2 3
Result: True
----------------
N = 4
A =
1 1 1
2 2 3
Result: False
----------------
N = 3
A =
3 2 3 4 2 1
4 1 4 2 4 2
4 2 3 3 4 1
1 1 2 2 3 4
3 2 3 1 3 1
1 1 2 2 3 4
Result: True
----------------
N = 1
A =
5 2 3 8
Result: True
----------------
N = 3
111 23 12 6
111 53 2 5
112 555 5 222
Result: False
----------------
N = 2
4 2 6 2 1 5
2 3 3 3 3 3
11 34 4 2 9 7
Result: True
Wyjaśnienia są zawsze dobrą rzeczą :)
code-golf
number
decision-problem
matrix
Stewie Griffin
źródło
źródło
Odpowiedzi:
Łuska , 9 bajtów
Pobiera tablicę 2D i liczbę, zwraca
0
dla instancji fałszywych i liczbę dodatnią dla instancji zgodnych z prawdą. Wypróbuj online!Wyjaśnienie
Łuska jest językiem funkcjonalnym, więc program jest tylko kompozycją kilku funkcji.
źródło
Dyalog APL,
272523 bajtówWypróbuj online!
Dzięki @MartinEnder i @Zgarb za -2 bajty każdy (kompozycja eliminuje potrzebę używania
w
i bezcelowych parens)Powiadom mnie, jeśli są jakieś problemy i / lub bajty do gry w golfa. Lewy argument jest N , prawy argument jest .
Wyjaśnienie:
źródło
Perl 6 , 60 bajtów
Wypróbuj online!
@^m
jest macierzą wejściową (pierwszy argument) i$^n
jest liczbą kolejnych wystąpień do sprawdzenia (drugi argument).[Z,] @^m
jest transpozycją macierzy wejściowej.(@^m | [Z,] @^m)
jest połączeniem macierzy wejściowej i jej transpozycji. Poniższemap
wartości są zgodne z prawdą, jeśli$^n
kolejne równe wartości występują w dowolnym wierszu wywoływacza. Stosowany do macierzy wejściowej LUB jej transpozycji, ocenia na prawdziwą wartość, jeśli macierz wejściowa lub jej transpozycja zawierają$^n
kolejne równe wartości w dowolnym wierszu; jeśli transpozycja spełnia ten warunek, oznacza to, że macierz wejściowa ma$^n
kolejne równe wartości w jednej ze swoich kolumn.*.rotor($^n => $^n - 1)
zamienia każdy wiersz w sekwencję$^n
-elementów. Na przykład, jeśli$^n
jest to 3, a wiersz jest<1 2 2 2 3>
, to zostanie obliczone na(<1 2 2>, <2 2 2>, <2 2 3>)
..map({ [==] $_ })
zamienia każdy plasterek w wartość logiczną, która wskazuje, czy wszystkie elementy plastra są równe. Kontynuując poprzedni przykład, staje się(False, True, False)
..any
zamienia tę sekwencję logiczną w skrzyżowanie, które jest prawdą, jeśli którykolwiek z logicznych jest prawdziwy.Wyjście jest prawdą lub wartością połączenia, która jest prawdziwa, jeśli albo macierz wejściowa LUB jej transpozycja mają DOWOLNY wiersz, w którym
$^n
kolejne wartości są równe.źródło
MATL , 12 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Matryca niekwadratowa nie może być właściwie połączona z transpozycją, ani w pionie, ani w poziomie. Tak więc kod łączy je po przekątnej , tworząc macierz blokowo-diagonalną.
Powstała macierz jest linearyzowana w kolejności według kolumny i zakodowana według długości przebiegu. Zera wynikające z blokowej diagonalnej konkatenacji służą do izolowania przebiegów wartości rzeczywistych.
Wyniki z kodowania długości przebiegu to tablica wartości i tablica długości przebiegu. Zachowywane są długości przebiegu odpowiadające niezerowym wartościom. Dane wyjściowe są,
1
jeśli niektóre z tych długości są większe lub równe liczbie wejściowej, i w0
przeciwnym razie.Zobaczmy wyniki pośrednie, aby było jaśniej. Rozważ dane wejściowe
i
Blokowa macierz diagonalna zawierająca macierz wejściową i jej transpozycję (kod
t!Yd
) to:Ta matryca jest domyślnie zlinearyzowana w porządku głównym kolumny (w dół, a następnie w poprzek):
Kodowanie długości przebiegu (kod
Y'
) daje następujące dwa wektory (pokazane tutaj jako wektory wierszowe; w rzeczywistości są to wektory kolumnowe): wektor z wartościamii wektor o długościach przebiegu
Zachowanie tylko długości odpowiadających wartościom niezerowym (kodowi
wg)
) dajePorównanie w celu sprawdzenia, które długości są większe lub równe liczbie wejściowej (kodowi
>~
), daje wektorWreszcie wynik powinien być
true
(pokazany jako1
), jeśli powyższy wektor zawiera co najmniejtrue
wpis (koda
). W tym przypadku wynikiem jestźródło
Oktawa,
7770 bajtówWypróbuj online!
Objaśnienie: Ponieważ macierz zawiera tylko niezerowe liczby całkowite, możemy dodać granicę 0s wokół matrycy i obliczyć kodowanie długości fali matrycy (przekształcone w wektor)
źródło
runlength
... Naucz się czegoś nowego każdego dnia ...runlength
! Koncentrując się bardziej na Matlabie, nie pamiętam, że istniało w Octaverunlength
.Galaretka ,
98 bajtówBierze macierz jako argumenty i odczytuje liczbę całkowitą ze STDIN.
Wypróbuj online!
Jak to działa
Przykładowy przebieg
źródło
;Z
, choć w Japt zamiast w Galaretce ...Ȧ
Atom była inspirowana przez Mátl chociaż.E
wbudowany sposób był na to zrobić. Fajnie :)Python 2 ,
609291 bajtówWypróbuj online!
Zamiast zliczania
n
generowana jest lista z rozmiarem (dla każdego elementu w macierzy) i sprawdzana, czy jest na macierzyBez ciągów znaków, 94 bajty
Wypróbuj online!
źródło
Oktawa , 59 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wykorzystuje to to samo podejście, co moja odpowiedź MATL (patrz wyjaśnienie tam).
źródło
blkdiag(A,A')
. Bardzo dobrze!Japt ,
181514 bajtówSprawdź to
Wyjaśnienie
źródło
cUy)®ò¦ d_l ¨V\nd
, a drugi za pomocącUy)d_ò¦ d_l ¨V
, a wtedy praktycznie masz moje (usunięte) rozwiązanie.CJam , 16 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
runlength
funkcja Octave daje również wyjścia w tej kolejności. Ale jakoś czuję, że kolejność jestvalue, length
bardziej naturalnaPython 3 ,
129128125120104101 bajtówOgromne podziękowania dla @Zachary T, @Stewie Griffin, @Mr. Xcoder, @Rod, @totallyhuman za znaczne ulepszenie tego.
Wypróbuj online!
źródło
1
iif
.a=b;b=0;c=0
za=b=c=0
m+zip(*m)
zamiast tego możesz użyćm
czwartej linii i całkowicie upuścić pierwszą linię, przenosząc jąn<=max()
do ostatniej linii jakon<=c
b=b+1
używaćb+=1
... Ahh, Ninja'd autor: @StewieGriffin05AB1E ,
16 1412 bajtówWypróbuj online!
źródło
0
s w drugim rzędzie, więc powinno być prawdą.[3,3,3]
. W tym przypadku źle odczytałem wyzwanie, więc myślę, że się tutaj mylę.Galaretka , 18 bajtów
Wypróbuj online!
Zwroty
0
fałsz i niezerową liczbę całkowitą dla prawdy.Ew, to źle. I bardzo długo. Wskazówki dotyczące gry w golfa będą mile widziane :)
źródło
JavaScript (ES6), 99 bajtów
Bierze matrycę
m
i oczekiwaną liczbę wystąpieńn
w składni curry(m)(n)
. Zwraca wartość logiczną.W jaki sposób?
Ten kod nie jest szczególnie krótki, ale chciałem wypróbować podejście oparte wyłącznie na wyrażeniach regularnych.
Konwersja macierzy na ciąg
Używamy
m.join('|')
do przekształcania tablicy 2D w ciąg. To najpierw powoduje niejawny przymus wierszy macierzy do ciągów rozdzielanych przecinkami.Na przykład te dane wejściowe:
zostanie przekształcony w:
Dopasowywanie wierszy
Szukamy kolejnych wystąpień z rzędu z:
To pasuje:
\b
granica słów\d+
po którym następuje liczba(){n-1}
następnie n-1 razy:,
przecinek\1
po którym następuje nasze odniesienie: granica słowa + pierwsza liczba\b
po którym następuje granica słowaDopasowywanie kolumn
Szukamy kolejnych wystąpień w kolumnie z:
gdzie
L
jest długość rzędu.To pasuje:
\b
granica słów\d+
po którym następuje liczba(){n-1}
następnie n-1 razy:(){L-1}
L-1 razy:.
dowolny znak (w efekcie: przecinek lub kreska)\d+?
po którym następuje cyfra (ta nie musi być chciwa).
po którym następuje dowolny znak (ponownie: przecinek lub potok)\1
po którym następuje nasze odniesienie: granica słowa + pierwsza liczba\b
po którym następuje granica słowaPrzypadki testowe
Pokaż fragment kodu
źródło
Python 2 , 64 bajty
Wypróbuj online!
źródło
Clojure, 77 bajtów
Tworzy wszystkie kolejne partycje
p
długościN
(symbol%2
) i zlicza, ile ma różnych wartości. Następnie tworzy zestaw tych długości i zwraca,1
jeśli zostanie znaleziony z zestawu inil
inaczej.for
Konstrukt był idealnie pasuje do tego, moja oryginalna próba wykorzystywaneflatten
,concat
lub coś w tym krótki.źródło