Existem N ocorrências consecutivas de um número em uma linha / coluna em uma matriz?

20

Pegue uma matriz A que contém números inteiros positivos e um único número positivo positivo N como entrada e determine se há pelo menos N ocorrências consecutivas do mesmo número em qualquer linha ou coluna da matriz.

Você só precisa testar horizontal e verticalmente.

Casos de teste

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

As explicações são sempre boas :)

Stewie Griffin
fonte
5
Você parece amar matrizes.
Okx 27/06
4
Bem, eu sou um cara MATLAB ... Mat Rix Lab oratório =)
Stewie Griffin
É suficiente retornar um valor de verdade / falsidade?
Dennis
@ Dennis é claro :)
Stewie Griffin
5
Irritante, porque você é um cara Matlab, você faz desafios que parecem fáceis em MATLAB, mas têm uma leve torção essa regra fora a solução óbvia ...
Sanchises

Respostas:

7

Casca , 9 bytes

≤▲mLṁgS+T

Pega uma matriz 2D e um número, retorna 0para instâncias falsas e um número positivo para instâncias verdadeiras. Experimente online!

Explicação

Husk é uma linguagem funcional, portanto, o programa é apenas uma composição de várias funções.

≤▲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
fonte
5

Dyalog APL, 27 25 23 bytes

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

Experimente Online!

Graças a @MartinEnder e @Zgarb por -2 bytes cada (a composição elimina a necessidade de usar we parênteses sem sentido)

Avise-me se houver algum problema e / ou bytes no golfe. Argumento esquerda é N , o argumento correto é A .

Explicação:

{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ý
fonte
4

Perl 6 , 60 bytes

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

Experimente online!

  • @^mé a matriz de entrada (primeiro argumento) e $^né o número de ocorrências consecutivas a serem verificadas (segundo argumento).
  • [Z,] @^m é a transposição da matriz de entrada.
  • (@^m | [Z,] @^m)é uma junção ou da matriz de entrada e sua transposição. A seguir, é mapavaliado um valor verdadeiro se $^nvalores iguais consecutivos ocorrerem em qualquer linha do invocante. Aplicado à matriz de entrada OU sua transposição, ele avalia um valor verdadeiro se a matriz de entrada ou sua transposição contêm $^nvalores iguais consecutivos em qualquer linha; se a transposição atender a essa condição, isso significa que a matriz de entrada possui $^nvalores iguais consecutivos em uma de suas colunas.
  • *.rotor($^n => $^n - 1)transforma cada linha em uma sequência de $^nfatias de elementos. Por exemplo, se $^nfor 3 e uma linha <1 2 2 2 3>, isso será avaliado como (<1 2 2>, <2 2 2>, <2 2 3>).
  • .map({ [==] $_ })transforma cada fatia em um booleano que indica se todos os elementos da fatia são iguais. Continuando o exemplo anterior, isso se torna (False, True, False).
  • .any transforma essa sequência de booleanos em uma junção or que é verdadeira se algum dos booleanos for verdadeiro.

A saída é um valor de verdade ou junção que é verdadeiro se a matriz de entrada OU sua transposição tiver QUALQUER linha em que os $^nvalores consecutivos sejam iguais.

Sean
fonte
4

MATL , 12 bytes

t!YdY'wg)>~a

Experimente online! Ou verifique todos os casos de teste .

Explicação

Uma matriz não quadrada não pode ser concatenada adequadamente à sua transposição, vertical ou horizontalmente. Portanto, o código concatena-os na diagonal , criando uma matriz diagonal de bloco.

A matriz resultante é linearizada na ordem principal da coluna e codificada no comprimento da execução. Os zeros resultantes da concatenação na diagonal do bloco servem para isolar as execuções dos valores reais.

Os resultados da codificação de comprimento de execução são uma matriz de valores e uma matriz de comprimentos de execução. Os comprimentos de execução correspondentes a valores diferentes de zero são mantidos. A saída é 1se alguns desses comprimentos forem maiores ou iguais ao número de entrada e, 0caso contrário.

Vamos ver os resultados intermediários para torná-lo mais claro. Considere entradas

[10 10 10;
 20 20 30]

e

3

A matriz diagonal do bloco que contém a matriz de entrada e sua transposição (código 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

Essa matriz está implícita linearizada na ordem principal da coluna (abaixo e depois):

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

A codificação de comprimento de execução (código Y') fornece os dois vetores a seguir (mostrados aqui como vetores de linha; na verdade, são vetores de coluna): vetor com valores

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

e vetor com comprimentos de execução

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

Manter apenas os comprimentos correspondentes a valores diferentes de zero (código wg)) fornece

1 1 1 1 1 1 3 2 1

A comparação para ver quais comprimentos são maiores ou iguais ao número de entrada (código >~) produz o vetor

0 0 0 0 0 0 1 0 0

Finalmente, a saída deve ser true(mostrada como 1) se o vetor acima contiver pelo menos uma trueentrada (código a). Nesse caso, o resultado é

1
Luis Mendo
fonte
4

Oitava, 77 70 bytes

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

Experimente online!

Explicação: Como a matriz contém apenas números inteiros diferentes de zero, podemos adicionar uma borda de 0s ao redor da matriz e calcular a codificação do comprimento de execução da matriz (remodelada para um vetor)

@(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
fonte
3
Eu realmente gosto das suas soluções (não apenas desta), mas elas podem se beneficiar definitivamente de algumas explicações! :) Eu não sabia Octave tinha runlength... Aprender algo novo todos os dias ...
Stewie Griffin
Obrigado por me lembrar runlength! Sendo mais focado em Matlab, eu não me lembrava que existia no Octave
Luis Mendo
@StewieGriffin Obrigado, resposta atualizada depois de acordar!
rahnema1
@LuisMendo Após uma de suas postagens, tomei conhecimento de uma função chamada runlength.
rahnema1
4

Geléia , 9 8 bytes

;ZjṡƓE€S

Pega a matriz como argumentos e lê o número inteiro de STDIN.

Experimente online!

Como funciona

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

Exemplo de execução

;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
fonte
Eu tive a mesma idéia com ;Z, embora em Japt em vez de geléia ...
ETHproductions
Agora entendo por que você perguntou sobre valores de verdade / falsidade . Essa definição em Jelly foi inspirada no MATLAB (ou MATL), não foi?
Stewie Griffin
Não, o Jelly usa internamente os condicionais do Python. O Ȧátomo foi inspirado pelo MATL.
Dennis
Oh, bem, o meu era muito longo>. <Certo, o Econstruído era o caminho para fazê-lo. Bom :)
HyperNeutrino
3

Python 2 , 60 92 91 bytes

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

Experimente online!

Em vez de contar, uma lista com o tamanho n(para cada elemento da matriz) é gerada e verificada se está na matriz

Sem strings, 94 bytes

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

Experimente online!

Cajado
fonte
Eu acho que isso pode dar falsos positivos com números de vários dígitos.
Xnor
@xnor lá, corrigido
Rod
3

Japonês , 18 15 14 bytes

cUy)d_ò¦ d_ʨV

Teste-o

  • 3 bytes salvos com alguma ajuda da ETHproductions.

Explicação

    :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.
Shaggy
fonte
1
Oh uau, eu não vi isso antes de postar o meu. Você pode salvar 2 bytes com cUy)®ò¦ d_l ¨V\nd, e outro com cUy)d_ò¦ d_l ¨V, e praticamente ter minha solução (excluída).
ETHproductions
Ha-Ha; grandes mentes ..., @ETHproductions :) Estou chocado por ser o dedo mais rápido depois de obarakon me bater o dia todo hoje! Obrigado por essas dicas, já havia visto uma, mas não a outra ainda.
Shaggy
2

CJam , 16 bytes

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

Experimente online!

Explicação

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
fonte
Eu sempre me perguntei por que o RLE do CJam fornece duração e valor. Bem, ele acaba por ser útil aqui :-)
Luis Mendo
@LuisMendo Acho que é assim que você diria "3 a's, 5 b's, 2 c's". Na verdade, acho essa ordem útil com bastante frequência.
Martin Ender
Na verdade, a runlengthfunção do Octave também fornece resultados nessa ordem. Mas de alguma forma eu me sinto a ordem value, lengthmais natural
Luis Mendo
2

Python 3 , 129 128 125 120 104 101 bytes

Muito obrigado a @Zachary T, @Stewie Griffin, @Mr. Xcoder, @Rod, @totallyhuman por melhorar muito isso.

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

Experimente online!

irapsaged
fonte
Você não precisa de um espaço entre 1e if.
Zacharý 27/06
Salve quatro bytes substituindo a=b;b=0;c=0pora=b=c=0
Mr. Xcoder 27/17/17
(Não tenho certeza), mas eu acho que você poderia usar m+zip(*m)em vezm na linha 4, e soltar inteiramente 1ª linha, movendo o n<=max()para a última linha comon<=c
Rod
120 bytes
totallyhuman
Em vez de b=b+1usar b+=1... Ahh, Ninja'd @StewieGriffin
Mr. Xcoder
2

05AB1E , 16 14 12 bytes

Døìvyγ€gM²‹_

Experimente 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
fonte
1
@MagicOctopusUrn Não sei ao certo o que você quer dizer. Esse exemplo possui 3 0s consecutivos na segunda linha, portanto deve ser verdade.
Riley
@MagicOctopusUrn Se você interromper essa execução (TIO), ela retornará false.
Riley
O terceiro comando não concatena as linhas transpostas para as linhas originais?
Magic Octopus Urn
Além disso, eu pensei que deveria retornar verdadeiro apenas para 3 quando houver [3,3,3]. Eu interpretei mal o desafio nesse caso, então acho que estou errado aqui.
Magic Octopus Urn
@MagicOctopusUrn Os três primeiros comandos criarão uma matriz que contém cada linha e cada coluna como elementos individuais.
Riley
1

Geléia , 18 bytes

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

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

Retorna 0para false e um número inteiro diferente de zero para truthy.

Eca, isso é ruim. E muito tempo. Dicas de golfe seriam apreciadas :)

HyperNeutrino
fonte
1

JavaScript (ES6), 99 bytes

Toma a matriz me o número esperado de ocorrências nna sintaxe de curry (m)(n). Retorna um booleano.

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

Quão?

Esse código não é particularmente curto, mas eu queria tentar uma abordagem puramente baseada em expressões regulares.

Conversão da matriz em uma string

Usamos m.join('|')para transformar o array 2D em uma string. Isso primeiro causa uma coerção implícita das linhas da matriz em cadeias separadas por vírgula.

Por exemplo, esta entrada:

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

será transformado em:

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

Correspondência de linha

Procuramos ocorrências consecutivas seguidas com:

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

Isso corresponde:

  • \b um limite de palavras
  • \d+ seguido por um número
  • (){n-1}seguido n-1 vezes por:
    • , uma vírgula
    • \1 seguido da nossa referência: um limite de palavras + o primeiro número
  • \b seguido por um limite de palavras

Correspondência de colunas

Procuramos ocorrências consecutivas em uma coluna com:

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

Onde Lé o comprimento de uma linha.

Isso corresponde:

  • \b um limite de palavras
  • \d+ seguido por um número
  • (){n-1}seguido n-1 vezes por:
    • (){L-1} L-1 vezes:
      • . qualquer caractere (com efeito: vírgula ou tubo)
      • \d+? seguido por um número (este deve ser não ganancioso)
    • . seguido por qualquer caractere (novamente: vírgula ou tubo)
    • \1 seguido da nossa referência: um limite de palavras + o primeiro número
  • \b seguido por um limite de palavras

Casos de teste

Arnauld
fonte
0

Clojure, 77 bytes

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

Cria todas as partições consecutivas pde comprimento N(símbolo %2) e conta quantos valores distintos ela possui. Em seguida, ele forma o conjunto desses comprimentos e retorna 1se for encontrado no conjunto e de niloutra forma. forconstrução foi o ajuste perfeito para isso, minha tentativa original usado flatten, concatou algo desse curto.

NikoNyrh
fonte