Ci sono N ricorrenze consecutive di un numero in una riga / colonna in una matrice?


20

Prendi una matrice A consistente in numeri interi positivi e un singolo numero intero positivo N come input e determina se ci sono almeno N occorrenze consecutive dello stesso numero in qualsiasi riga o colonna nella matrice.

Hai solo bisogno di testare in orizzontale e in verticale.

Casi test

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

Le spiegazioni sono sempre una buona cosa :)


5
Sembra che ami le matrici.
Okx,

4
Bene, sono un ragazzo MATLAB ... Mat rix Lab oratory =)
Stewie Griffin,

È sufficiente restituire un valore di verità / falsità?
Dennis,

@Dennis ovviamente :)
Stewie Griffin il

5
Stranamente, perché sei un ragazzo Matlab, fai delle sfide che sembrano facili in MATLAB ma hanno una leggera svolta che esclude l'ovvia soluzione ...
Sanchises,

Risposte:


7

Buccia , 9 byte

≤▲mLṁgS+T

Prende un array 2D e un numero, restituisce 0per istanze errate e un numero positivo per istanze veritiere. Provalo online!

Spiegazione

Husk è un linguaggio funzionale, quindi il programma è solo una composizione di diverse funzioni.

≤▲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.

5

Dyalog APL, 27 25 23 byte

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

Provalo online!

Grazie a @MartinEnder e @Zgarb per -2 byte ciascuno (la composizione elimina la necessità di usare we parentesi inutili)

Avvisami se ci sono problemi e / o byte al golf. Argomento a sinistra è N , argomento di destra è una .

Spiegazione:

{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

4

Perl 6 , 60 byte

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

Provalo online!

  • @^mè la matrice di input (primo argomento) ed $^nè il numero di occorrenze consecutive da verificare (secondo argomento).
  • [Z,] @^m è la trasposizione della matrice di input.
  • (@^m | [Z,] @^m)è una giunzione or della matrice di input e la sua trasposizione. Quanto segue maprestituisce un valore di verità se si $^nverificano valori uguali consecutivi in ​​qualsiasi riga dell'invocante. Applicato alla matrice di input OPPURE alla sua trasposizione, valuta un valore di verità se la matrice di input o la sua trasposizione contengono $^nvalori uguali consecutivi in ​​qualsiasi riga; se la trasposizione soddisfa tale condizione, ciò significa che la matrice di input ha $^nvalori uguali consecutivi in ​​una delle sue colonne.
  • *.rotor($^n => $^n - 1)trasforma ogni riga in una sequenza di $^nsezioni -elemento. Ad esempio, se $^nè 3 e una riga è <1 2 2 2 3>, questo viene valutato (<1 2 2>, <2 2 2>, <2 2 3>).
  • .map({ [==] $_ })trasforma ogni sezione in un valore booleano che indica se tutti gli elementi della sezione sono uguali. Continuando con l'esempio precedente, questo diventa (False, True, False).
  • .any trasforma quella sequenza di booleani in una giunzione or che è vera se uno qualsiasi dei booleani è vero.

L'output è un valore di giunzione o verità che è vero se la matrice di input o la sua trasposizione hanno QUALSIASI riga in cui i $^nvalori consecutivi sono uguali.


4

MATL , 12 byte

t!YdY'wg)>~a

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

Una matrice non quadrata non può essere concatenata correttamente alla sua trasposizione, né in verticale né in orizzontale. Quindi il codice li concatena in diagonale , creando una matrice diagonale a blocchi.

La matrice risultante viene linearizzata nell'ordine della colonna maggiore e codificata per la lunghezza della corsa. Gli zeri risultanti dalla concatenazione diagonale a blocchi servono per isolare le serie di valori effettivi.

I risultati della codifica della lunghezza della corsa sono una matrice di valori e una matrice di lunghezze della corsa. Vengono mantenute le lunghezze di corsa corrispondenti a valori diversi da zero. L'output è 1se alcune di quelle lunghezze sono maggiori o uguali al numero di input e in caso 0contrario.

Vediamo i risultati intermedi per renderlo più chiaro. Considera gli input

[10 10 10;
 20 20 30]

e

3

La matrice diagonale a blocchi contenente la matrice di input e la sua trasposizione (codice t!Yd) è:

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

Questa matrice è implicita linearizzata in ordine di colonna maggiore (verso il basso, poi attraverso):

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

La codifica run-length (codice Y') fornisce i seguenti due vettori (mostrati qui come vettori di riga; in realtà sono vettori di colonna): vettore con valori

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

e vettore con lunghezze di esecuzione

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

Mantenere solo le lunghezze corrispondenti a valori diversi da (codice wg)) dà

1 1 1 1 1 1 3 2 1

Il confronto per vedere quali lunghezze sono maggiori o uguali al numero di input (codice >~) produce il vettore

0 0 0 0 0 0 1 0 0

Infine, l'output dovrebbe essere true(mostrato come 1) se il vettore sopra contiene almeno una truevoce (codice a). In questo caso il risultato è

1

4

Ottava, 77 70 byte

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

Provalo online!

Spiegazione: Poiché la matrice contiene solo numeri interi diversi da zero, è possibile aggiungere un bordo di 0 secondi attorno alla matrice e calcolare la codifica della lunghezza di esecuzione della matrice (rimodellata in un vettore)

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

3
Mi piacciono molto le tue soluzioni (non solo questa), ma potrebbero sicuramente beneficiare di alcune spiegazioni! :) Non sapevo che Octave avesse runlength... Impara qualcosa di nuovo ogni giorno ...
Stewie Griffin,

Grazie per avermelo ricordato runlength! Essendo più concentrato su Matlab, non ricordavo che esistesse in Octave
Luis Mendo il

@StewieGriffin Grazie, risposta aggiornata dopo il risveglio!
rahnema1,

@LuisMendo Dopo uno dei tuoi post mi sono reso conto di una funzione chiamata runlength.
rahnema1,

4

Gelatina , 9 8 byte

;ZjṡƓE€S

Prende la matrice come argomenti e legge il numero intero da STDIN.

Provalo online!

Come funziona

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

Esempio di esecuzione

;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

Ho avuto la stessa idea con ;Z, sebbene in Japt piuttosto che in Jelly ...
ETHproductions

Ora vedo perché hai chiesto dei valori di verità / falsità . Quella definizione in Jelly è stata ispirata da MATLAB (o MATL), vero?
Stewie Griffin,

No, Jelly usa internamente i condizionali di Python. L' Ȧatomo è stato ispirato da MATL però.
Dennis,

Oh beh, il mio era troppo lungo>. <Giusto, l' Eintegrato era il modo di farlo. Bello :)
HyperNeutrino il

3

Python 2 , 60 92 91 byte

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,[]))

Provalo online!

Invece di contare, nviene generato un elenco con dimensioni (per ogni elemento nella matrice) e verificato se si trova sulla matrice

Senza stringhe, 94 byte

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

Provalo online!


Penso che questo possa dare falsi positivi con numeri a più cifre.
xnor

@xnor there, fixed
Rod


3

Japt , 18 15 14 byte

cUy)d_ò¦ d_ʨV

Provalo

  • 3 byte salvati con l'aiuto di ETHproductions.

Spiegazione

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

1
Oh wow, non l'ho visto prima di pubblicare il mio. Potresti salvare 2 byte con cUy)®ò¦ d_l ¨V\nd, e un altro con cUy)d_ò¦ d_l ¨V, e quindi hai praticamente la mia soluzione (eliminata).
ETHproductions

Ha-Ha; grandi menti ..., @ETHproductions :) Sono scioccato dal fatto che sono stato il dito più veloce dopo che obarakon mi ha picchiato tutto il giorno oggi! Grazie per quei suggerimenti, ne avevo già individuato uno ma non ancora l'altro.
Shaggy,

2

CJam , 16 byte

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

Provalo online!

Spiegazione

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.

Mi sono sempre chiesto perché l'RLE di CJam dia lunghezza, quindi valore. Bene, risulta utile qui :-)
Luis Mendo,

@LuisMendo immagino perché è così che lo diresti "3 a, 5 b, 2 c". In realtà trovo questo ordine utile abbastanza spesso.
Martin Ender,

In realtà, la runlengthfunzione di Octave fornisce anche uscite in quell'ordine. Ma in qualche modo sento l'ordine value, lengthpiù naturale
Luis Mendo il

2

Python 3 , 129 128 125 120 104 101 byte

Grazie enormi a @Zachary T, @Stewie Griffin, @Mr. Xcoder, @Rod, @totallyhuman per averlo migliorato di molto.

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

Provalo online!


Non è necessario uno spazio tra 1e if.
Zacharý,

Salva quattro byte sostituendo a=b;b=0;c=0cona=b=c=0
Mr. Xcoder il

(Non ne sono sicuro) ma penso che potresti usare m+zip(*m)invece msulla 4a riga, e rilasciare completamente la 1a riga, spostando n<=max()l'ultima riga comen<=c
Rod


Invece di b=b+1usare b+=1... Ah, Ninja di @StewieGriffin
Mr. Xcoder

2

05AB1E , 16 14 12 byte

Døìvyγ€gM²‹_

Provalo 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

1
@MagicOctopusUrn Non sono sicuro di cosa intendi. Quell'esempio ha 3 secondi consecutivi 0nella seconda riga, quindi dovrebbe essere vero.
Riley,

@MagicOctopusUrn Se interrompi quella corsa (TIO) , restituisce false.
Riley,

Il terzo comando non concatena le righe trasposte alle righe originali?
Magic Octopus Urn,

Inoltre, ho pensato che avrebbe dovuto tornare vero per 3 solo quando c'è [3,3,3]. Ho letto male la sfida in quel caso, quindi penso di sbagliarmi qui.
Magic Octopus Urn,

@MagicOctopusUrn I primi 3 comandi creeranno un array che contiene ogni riga e ogni colonna come singoli elementi.
Riley,

1

Gelatina , 18 byte

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

Provalo 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?

Restituisce 0false e un numero intero diverso da zero per verità.

Ew, questo è male. E molto lungo. I consigli sul golf sarebbero apprezzati :)


1

JavaScript (ES6), 99 byte

Prende la matrice me il numero previsto di occorrenze nnella sintassi del curry (m)(n). Restituisce un valore booleano.

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

Come?

Questo codice non è particolarmente breve, ma volevo provare un approccio basato esclusivamente su espressioni regolari.

Conversione della matrice in una stringa

Usiamo m.join('|')per trasformare l'array 2D in una stringa. Ciò provoca innanzitutto una coercizione implicita delle righe della matrice in stringhe separate da virgola.

Ad esempio, questo input:

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

sarà trasformato in:

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

Riga corrispondente

Cerchiamo ricorrenze consecutive di seguito con:

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

Questo corrisponde:

  • \b un limite di parole
  • \d+ seguito da un numero
  • (){n-1}seguito n-1 volte da:
    • , una virgola
    • \1 seguito dal nostro riferimento: un limite di parole + il primo numero
  • \b seguito da una parola limite

Colonna corrispondente

Cerchiamo ricorrenze consecutive in una colonna con:

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

dov'è Lla lunghezza di una riga.

Questo corrisponde:

  • \b un limite di parole
  • \d+ seguito da un numero
  • (){n-1}seguito n-1 volte da:
    • (){L-1} L-1 volte:
      • . qualsiasi carattere (in effetti: una virgola o una pipe)
      • \d+? seguito da un numero (questo deve essere non avido)
    • . seguito da qualsiasi carattere (di nuovo: una virgola o una pipe)
    • \1 seguito dal nostro riferimento: un limite di parole + il primo numero
  • \b seguito da una parola limite

Casi test



0

Clojure, 77 byte

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

Crea tutte le partizioni consecutive pdi lunghezza N(simbolo %2) e conta quanti valori distinti ha. Quindi forma l'insieme di queste lunghezze e ritorna 1se viene trovato dall'insieme e in nilaltro modo. foril costrutto era la soluzione perfetta per questo, il mio tentativo originale usato flatten, concato qualcosa del genere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.