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 :)
code-golf
number
decision-problem
matrix
Stewie Griffin
fonte
fonte
Respostas:
Casca , 9 bytes
Pega uma matriz 2D e um número, retorna
0
para 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.
fonte
Dyalog APL,
272523 bytesExperimente Online!
Graças a @MartinEnder e @Zgarb por -2 bytes cada (a composição elimina a necessidade de usar
w
e parênteses sem sentido)Avise-me se houver algum problema e / ou bytes no golfe. Argumento esquerda é N , o argumento correto é A .
Explicação:
fonte
Perl 6 , 60 bytes
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, émap
avaliado um valor verdadeiro se$^n
valores 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$^n
valores iguais consecutivos em qualquer linha; se a transposição atender a essa condição, isso significa que a matriz de entrada possui$^n
valores iguais consecutivos em uma de suas colunas.*.rotor($^n => $^n - 1)
transforma cada linha em uma sequência de$^n
fatias de elementos. Por exemplo, se$^n
for 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
$^n
valores consecutivos sejam iguais.fonte
MATL , 12 bytes
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 é
1
se alguns desses comprimentos forem maiores ou iguais ao número de entrada e,0
caso contrário.Vamos ver os resultados intermediários para torná-lo mais claro. Considere entradas
e
A matriz diagonal do bloco que contém a matriz de entrada e sua transposição (código
t!Yd
) é:Essa matriz está implícita linearizada na ordem principal da coluna (abaixo e depois):
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 valorese vetor com comprimentos de execução
Manter apenas os comprimentos correspondentes a valores diferentes de zero (código
wg)
) forneceA comparação para ver quais comprimentos são maiores ou iguais ao número de entrada (código
>~
) produz o vetorFinalmente, a saída deve ser
true
(mostrada como1
) se o vetor acima contiver pelo menos umatrue
entrada (códigoa
). Nesse caso, o resultado éfonte
Oitava,
7770 bytesExperimente 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)
fonte
runlength
... Aprender algo novo todos os dias ...runlength
! Sendo mais focado em Matlab, eu não me lembrava que existia no Octaverunlength
.Geléia ,
98 bytesPega a matriz como argumentos e lê o número inteiro de STDIN.
Experimente online!
Como funciona
Exemplo de execução
fonte
;Z
, embora em Japt em vez de geléia ...Ȧ
átomo foi inspirado pelo MATL.E
construído era o caminho para fazê-lo. Bom :)Python 2 ,
609291 bytesExperimente online!
Em vez de contar, uma lista com o tamanho
n
(para cada elemento da matriz) é gerada e verificada se está na matrizSem strings, 94 bytes
Experimente online!
fonte
Oitava , 59 bytes
Experimente online! Ou verifique todos os casos de teste .
Isso usa a mesma abordagem da minha resposta MATL (veja a explicação lá).
fonte
blkdiag(A,A')
. Muito agradável!Japonês ,
181514 bytesTeste-o
Explicação
fonte
cUy)®ò¦ d_l ¨V\nd
, e outro comcUy)d_ò¦ d_l ¨V
, e praticamente ter minha solução (excluída).CJam , 16 bytes
Experimente online!
Explicação
fonte
runlength
função do Octave também fornece resultados nessa ordem. Mas de alguma forma eu me sinto a ordemvalue, length
mais naturalPython 3 ,
129128125120104101 bytesMuito obrigado a @Zachary T, @Stewie Griffin, @Mr. Xcoder, @Rod, @totallyhuman por melhorar muito isso.
Experimente online!
fonte
1
eif
.a=b;b=0;c=0
pora=b=c=0
m+zip(*m)
em vezm
na linha 4, e soltar inteiramente 1ª linha, movendo on<=max()
para a última linha comon<=c
b=b+1
usarb+=1
... Ahh, Ninja'd @StewieGriffin05AB1E ,
16 1412 bytesExperimente online!
fonte
0
s consecutivos na segunda linha, portanto deve ser verdade.[3,3,3]
. Eu interpretei mal o desafio nesse caso, então acho que estou errado aqui.Geléia , 18 bytes
Experimente online!
Retorna
0
para false e um número inteiro diferente de zero para truthy.Eca, isso é ruim. E muito tempo. Dicas de golfe seriam apreciadas :)
fonte
JavaScript (ES6), 99 bytes
Toma a matriz
m
e o número esperado de ocorrênciasn
na sintaxe de curry(m)(n)
. Retorna um booleano.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:
será transformado em:
Correspondência de linha
Procuramos ocorrências consecutivas seguidas com:
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 palavrasCorrespondência de colunas
Procuramos ocorrências consecutivas em uma coluna com:
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 palavrasCasos de teste
Mostrar snippet de código
fonte
Python 2 , 64 bytes
Experimente online!
fonte
Clojure, 77 bytes
Cria todas as partições consecutivas
p
de comprimentoN
(símbolo%2
) e conta quantos valores distintos ela possui. Em seguida, ele forma o conjunto desses comprimentos e retorna1
se for encontrado no conjunto e denil
outra forma.for
construção foi o ajuste perfeito para isso, minha tentativa original usadoflatten
,concat
ou algo desse curto.fonte