Czy istnieje N kolejnych wystąpień liczby w wierszu / kolumnie w macierzy?

20

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ą :)

Stewie Griffin
źródło
5
Wygląda na to, że kochasz matryce.
Okx
4
Cóż, jestem facetem MATLAB ... Mat Rix Lab oratorium =)
Stewie Griffin
Czy wystarczy zwrócić wartość prawda / fałsz?
Dennis
@Dennis oczywiście :)
Stewie Griffin
5
Irytujące, ponieważ jesteś facetem Matlaba,
stwarzasz

Odpowiedzi:

7

Łuska , 9 bajtów

≤▲mLṁgS+T

Pobiera tablicę 2D i liczbę, zwraca 0dla 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.

≤▲mLṁgS+T
        T  Transpose the array
      S+   and concatenate with original.
           We get a list of the rows and columns of the input array.
    ṁ      Map and concatenate
     g     grouping of equal consecutive elements.
           This gives all consecutive runs on rows and columns.
  mL       Map length over the runs,
 ▲         take the maximum of the results
≤          and see if it's at least the second input.
Zgarb
źródło
5

Dyalog APL, 27 25 23 bajtów

{1∊∊⍷∘⍵¨(⊢,⍪¨)⍺/¨⍳⌈/∊⍵}

Wypróbuj online!

Dzięki @MartinEnder i @Zgarb za -2 bajty każdy (kompozycja eliminuje potrzebę używania wi 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:

{1∊∊⍷∘⍵¨(⊢,⍪¨)⍺/¨⍳⌈/∊⍵}
                     ⍵    - Right argument
                    ∊     - Flatten the array
                 ⍳⌈/      - 1 ... the maximum (inclusive)
              ⍺/¨         - Repeat each item ⍺ (left argument) times.
        (⊢,⍪¨)            - Argument concatenated with their transposes.
    ⍷∘⍵¨                  - Do the patterns occur in ⍵?
   ∊                      - Flatten (since we have a vector of arrays)
 1∊                       - Is 1 a member?
{                     }   - Function brackets
Zacharý
źródło
4

Perl 6 , 60 bajtów

{(@^m|[Z,] @^m).map(*.rotor($^n=>$^n-1).map({[==] $_}).any)}

Wypróbuj online!

  • @^mjest macierzą wejściową (pierwszy argument) i $^njest 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ższe mapwartości są zgodne z prawdą, jeśli $^nkolejne 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ą $^nkolejne równe wartości w dowolnym wierszu; jeśli transpozycja spełnia ten warunek, oznacza to, że macierz wejściowa ma $^nkolejne 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 $^njest 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 $^nkolejne wartości są równe.

Sean
źródło
4

MATL , 12 bajtów

t!YdY'wg)>~a

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ą, 1jeśli niektóre z tych długości są większe lub równe liczbie wejściowej, i w 0przeciwnym razie.

Zobaczmy wyniki pośrednie, aby było jaśniej. Rozważ dane wejściowe

[10 10 10;
 20 20 30]

i

3

Blokowa macierz diagonalna zawierająca macierz wejściową i jej transpozycję (kod t!Yd) to:

10 10 10  0  0
20 20 30  0  0
 0  0  0 10 20
 0  0  0 10 20
 0  0  0 10 30

Ta matryca jest domyślnie zlinearyzowana w porządku głównym kolumny (w dół, a następnie w poprzek):

10 20  0  0  0 10 20  0  0  0 10 30  0  0  0  0  0 10 10 10  0  0 20 20 30

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ściami

10 20  0 10 20  0 10 30  0 10  0 20 30

i wektor o długościach przebiegu

1 1 3 1 1 3 1 1 5 3 2 2 1

Zachowanie tylko długości odpowiadających wartościom niezerowym (kodowi wg)) daje

1 1 1 1 1 1 3 2 1

Porównanie w celu sprawdzenia, które długości są większe lub równe liczbie wejściowej (kodowi >~), daje wektor

0 0 0 0 0 0 1 0 0

Wreszcie wynik powinien być true(pokazany jako 1), jeśli powyższy wektor zawiera co najmniej truewpis (kod a). W tym przypadku wynikiem jest

1
Luis Mendo
źródło
4

Oktawa, 77 70 bajtów

@(A,N)any(([x y]=runlength([(p=padarray(A,[1 1]))(:);p'(:)]))(!!y)>=N)

Wypró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)

@(A,N)any(([x y]=runlength([(p=padarray(A,[1 1]))(:);p'(:)]))(!!y)>=N)
                             p=padarray(A,[1 1])                        % add a border of 0s around the matrix 
                            (                   )(:)                    % reshape the matrix to a column vector
                                                     p'(:)              % transpose of the matrix reshaped to a column vector
                           [                        ;     ]             % concatenate two vectors vertically
           [x y]=runlength(                                )            % runlength encoding of the vector[x=count,y=value]
          (                                                 )           % take x,counts.
                                                             (!!y)      % extrect those counts that their valuse aren't 0
      any(                                                        >=N)  % if we have at least a count that is greater than or equal to N                                                              
rahnema1
źródło
3
Naprawdę podoba mi się twoje rozwiązanie (nie tylko to), ale z pewnością mogą skorzystać z niektórych wyjaśnień! :) Nie wiedziałem, że Octave miał runlength... Naucz się czegoś nowego każdego dnia ...
Stewie Griffin
Dzięki za przypomnienie mi o runlength! Koncentrując się bardziej na Matlabie, nie pamiętam, że istniało w Octave
Luis Mendo
@StewieGriffin Dzięki, odpowiedź zaktualizowana po przebudzeniu!
rahnema1
@LuisMendo Po jednym z twoich postów zauważyłem funkcję o nazwie runlength.
rahnema1
4

Galaretka , 9 8 bajtów

;ZjṡƓE€S

Bierze macierz jako argumenty i odczytuje liczbę całkowitą ze STDIN.

Wypróbuj online!

Jak to działa

;ZjṡƓE€S  Main link. Argument: M (matrix / row array)

 Z        Zip/transpose M.
;         Concatenate the row array with the column array.
  j       Join the rows and columns, separating by M.
    Ɠ     Read an integer n from STDIN.
   ṡ      Split the result to the left into overlapping slices of length 2.
     E€   Test the members of each resulting array for equality.
       S  Take the sum.

Przykładowy przebieg

;ZjṡƓE€S  Argument: [[1, 2], [3, 2]]. STDIN: 2

 Z        [[1, 3], [2, 2]]

;         [[1, 2], [3, 2], [1, 3], [2, 2]]

  j       [1, 2, [1, 2], [3, 2], 3, 2, [1, 2], [3, 2], 1, 3, [1, 2], [3, 2], 2, 2]

    Ɠ     2

   ṡ      [[1, 2],             [2, [1, 2]],        [[1, 2], [3, 2]],   [[3, 2], 3],
           [3, 2],             [2, [1, 2]],        [[1, 2], [3, 2]],   [[3, 2], 1],
           [1, 3],             [3, [1, 2]],        [[1, 2], [3, 2]],   [[3, 2], 2],
           [2, 2]                                                                 ]

     E€   [     0,                       0,                       0,             0,
                0,                       0,                       0,             0,
                0,                       0,                       0,             0,
                1                                                                 ]

       S  1
Dennis
źródło
Miałem ten sam pomysł ;Z, choć w Japt zamiast w Galaretce ...
ETHproductions
Teraz rozumiem, dlaczego pytałeś o wartości prawdy / fałszu . Ta definicja w Galaretce została zainspirowana przez MATLAB (lub MATL), prawda?
Stewie Griffin
Nie, Jelly używa warunkowo Pythona wewnętrznie. ȦAtom była inspirowana przez Mátl chociaż.
Dennis
No cóż, mój był zbyt długi>. <Racja, Ewbudowany sposób był na to zrobić. Fajnie :)
HyperNeutrino
3

Python 2 , 60 92 91 bajtów

def f(n,x):x=[map(str,i)for i in x];print any(`[i]*n`[1:-1]in`x+zip(*x)`for i in sum(x,[]))

Wypróbuj online!

Zamiast zliczania ngenerowana jest lista z rozmiarem (dla każdego elementu w macierzy) i sprawdzana, czy jest na macierzy

Bez ciągów znaków, 94 bajty

lambda n,x:any((e,)*n==l[i:i+n]for l in x+zip(*x)for i in range(len(l)-n+1)for e in sum(x,()))

Wypróbuj online!

Pręt
źródło
Myślę, że może to dać fałszywie dodatnie wyniki dla liczb wielocyfrowych.
xnor
@ xnor tam, naprawiono
Rod
3

Japt , 18 15 14 bajtów

cUy)d_ò¦ d_ʨV

Sprawdź to

  • 3 bajty zapisane z pomocą ETHproductions.

Wyjaśnienie

    :Implicit input of 2D array U and integer V
c   :Append to U...
Uy  :U transposed.
d   :Check if any of the elements (sub-arrays) in U return true when...
_   :Passed through a function that...
ò   :Partitions the current element by...
¦   :Checking for inequality.
d   :Check if any of the partitions return true when...
_   :Passed through a function that checks if...
Ê   :The length of the current element...
¨V  :Is greater than or equal to V.
    :Implicit output of resulting boolean.
Kudłaty
źródło
1
Och wow, nie widziałem tego przed opublikowaniem mojego. Możesz zapisać 2 bajty za pomocą cUy)®ò¦ d_l ¨V\nd, a drugi za pomocą cUy)d_ò¦ d_l ¨V, a wtedy praktycznie masz moje (usunięte) rozwiązanie.
ETHprodukcje
Ha ha; wielkie umysły ..., @ETHproductions :) Jestem zszokowany, byłem najszybszym palcem po tym, jak Obarakon bije mnie cały dzień dzisiaj! Dzięki za te wskazówki, zauważyłem już jedną, ale jeszcze nie drugą.
Shaggy
2

CJam , 16 bajtów

q~_z+N*e`:e>0=>!

Wypróbuj online!

Wyjaśnienie

q~    e# Read and eval input.
_z+   e# Append the matrix's transpose to itself.
N*    e# Join with linefeeds to flatten without causing runs across rows.
e`    e# Run-length encode.
:e>   e# Get maximum run (primarily sorted by length).
0=    e# Get its length.
>!    e# Check that it's not greater than the required maximum.
Martin Ender
źródło
Zawsze zastanawiałem się, dlaczego RLE CJama podaje długość, a potem wartość. Okazuje się, że przydaje się tutaj :-)
Luis Mendo
@LuisMendo Chyba dlatego, że tak to byś powiedział: „3 a, 5 b, 2 c”. Właściwie to porządek uważam za dość użyteczny.
Martin Ender
W rzeczywistości runlengthfunkcja Octave daje również wyjścia w tej kolejności. Ale jakoś czuję, że kolejność jest value, lengthbardziej naturalna
Luis Mendo
2

Python 3 , 129 128 125 120 104 101 bajtów

Ogromne podziękowania dla @Zachary T, @Stewie Griffin, @Mr. Xcoder, @Rod, @totallyhuman za znaczne ulepszenie tego.

def f(n,m):
 a=b=c=0;m+=zip(*m)
 for r in m:
  for i in r:b,a=[1,b+1][a==i],i;c=max(c,b)
 return n<=c

Wypróbuj online!

niewzruszony
źródło
Nie potrzebujesz odstępu między 1i if.
Zacharý
Zapisz cztery bajty zastępując a=b;b=0;c=0za=b=c=0
pana Xcoder
(Nie jestem pewien), ale myślę, że m+zip(*m)zamiast tego możesz użyć mczwartej linii i całkowicie upuścić pierwszą linię, przenosząc ją n<=max()do ostatniej linii jakon<=c
Rod
120 bajtów
całkowicie ludzki
Zamiast b=b+1używać b+=1... Ahh, Ninja'd autor: @StewieGriffin
Mr. Xcoder
2

05AB1E , 16 14 12 bajtów

Døìvyγ€gM²‹_

Wypróbuj online!

Dø           # Duplicate the input and transpose one copy
  ì          # Combine the rows of both matrixes into one array
   vy        #   For each row...
     γ       #     Break into chunks of the same element
      €g     #     get the length of each chunk
        M    #     Get the largest length so far
         ²‹_ #     Check if that is equal to or longer than required
Riley
źródło
1
@MagicOctopusUrn Nie jestem pewien, co masz na myśli. Ten przykład ma 3 kolejne 0s w drugim rzędzie, więc powinno być prawdą.
Riley
@MagicOctopusUrn Po rozbiciu tego uruchomienia (TIO) , zwraca false.
Riley
Czy trzecie polecenie nie łączy transponowanych wierszy z oryginalnymi wierszami?
Magic Octopus Urn
Pomyślałem też, że to ma zwracać prawdę tylko dla 3, gdy jest [3,3,3]. W tym przypadku źle odczytałem wyzwanie, więc myślę, że się tutaj mylę.
Magic Octopus Urn
@MagicOctopusUrn Pierwsze 3 polecenia utworzą tablicę zawierającą każdy wiersz i każdą kolumnę jako osobne elementy.
Riley
1

Galaretka , 18 bajtów

ŒrFUm2<⁴$ÐḟL
ZÇo³Ç

Wypróbuj online!

ŒrFUm2<⁴$ÐḟL  Helper Link
Œr            Run-length encode
  F           Flatten the whole thing, giving the numbers in the odd indices and the lengths of the runs in the even indices
   U          Reverse
    m2        Take every other element (thus only keeping the run lengths)
         Ðḟ   Discard the elements that are
      <⁴$                                   less than the required run length
           L  And find the length
ZÇo³Ç         Main Link
Z             Zip the matrix
 Ç            Call the helper link on it
   ³Ç         Call the helper link on the original matrix
  o           Are either of these truthy?

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

HyperNeutrino
źródło
1

JavaScript (ES6), 99 bajtów

Bierze matrycę mi oczekiwaną liczbę wystąpień nw składni curry (m)(n). Zwraca wartość logiczną.

m=>n=>[',',`(.\\d+?){${m[0].length-1}}.`].some(s=>m.join`|`.match(`(\\b\\d+)(${s}\\1){${n-1}}\\b`))

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:

[
  [ 1, 2, 3 ],
  [ 4, 5, 6 ]
]

zostanie przekształcony w:

"1,2,3|4,5,6"

Dopasowywanie wierszy

Szukamy kolejnych wystąpień z rzędu z:

/(\b\d+)(,\1){n-1}\b/

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łowa

Dopasowywanie kolumn

Szukamy kolejnych wystąpień w kolumnie z:

/(\b\d+)((.\d+?){L-1}.\1){n-1}\b/

gdzie Ljest 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łowa

Przypadki testowe

Arnauld
źródło
0

Clojure, 77 bajtów

#((set(for[I[%(apply map vector %)]i I p(partition %2 1 i)](count(set p))))1)

Tworzy wszystkie kolejne partycje pdługości N(symbol %2) i zlicza, ile ma różnych wartości. Następnie tworzy zestaw tych długości i zwraca, 1jeśli zostanie znaleziony z zestawu i nilinaczej. forKonstrukt był idealnie pasuje do tego, moja oryginalna próba wykorzystywane flatten, concatlub coś w tym krótki.

NikoNyrh
źródło