Desafio:
Dada uma entrada de matriz, determine a quantidade de diagonais e antiagonais com números duplicados.
Portanto, se tivermos uma matriz como esta:
[[aa,ab,ac,ad,ae,af],
[ba,bb,bc,bd,be,bf],
[ca,cb,cc,cd,ce,cf],
[da,db,dc,dd,de,df]]
Todas as diagonais e antiagonais seriam:
[[aa],[ab,ba],[ac,bb,ca],[ad,bc,cb,da],[ae,bd,cc,db],[af,be,cd,dc],[bf,ce,dd],[cf,de],[df],
[af],[ae,bf],[ad,be,cf],[ac,bd,ce,df],[ab,bc,cd,de],[aa,bb,cc,dd],[ba,cb,dc],[ca,db],[da]]
Exemplo:
[[1,2,1,2,1,2],
[1,2,3,4,5,6],
[6,5,4,3,2,1],
[2,1,2,1,2,1]]
Todas as diagonais e antiagonais seriam:
[[1],[2,1],[1,2,6],[2,3,5,2],[1,4,4,1],[2,5,3,2],[6,2,1],[1,2],[1],
[2],[1,6],[2,5,1],[1,4,2,1],[2,3,3,2],[1,2,4,1],[1,5,2],[6,1],[2]]
Removendo todas as diagonais e antiagonais que contêm apenas números exclusivos:
[[2,3,5,2],[1,4,4,1],[2,5,3,2],[1,4,2,1],[2,3,3,2],[1,2,4,1]]
Portanto, a saída é a quantidade de diagonais e antiagonais que contêm números duplicados:
6
Regras do desafio:
- Se a matriz de entrada estiver vazia, contiver apenas 1 número ou apenas números únicos em toda a matriz, a saída será sempre
0
. - A entrada é garantida para conter apenas dígitos positivos
[1,9]
(a menos que esteja completamente vazia). - A matriz sempre será retangular (ou seja, todas as linhas têm o mesmo comprimento).
- A E / S é flexível. A entrada pode ser tomada como uma lista de listas de números inteiros, ou uma matriz 2D de números inteiros, ou um objeto Matrix, como uma string, etc. etc. Você também pode usar uma ou ambas as dimensões da matriz como entrada adicional se ele salvasse bytes no idioma de sua escolha.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
- Além disso, é altamente recomendável adicionar uma explicação para sua resposta.
Casos de teste:
Input: Output:
[[1,2,1,2,1,2], 6
[1,2,3,4,5,6],
[6,5,4,3,2,1],
[2,1,2,1,2,1]]
[[]] 0
[[1,2], 0
[3,4]]
[[1,1], 2
[1,1]]
[[9,9,9], 6
[9,9,9],
[9,9,9]]
[[7,7,7,7], 8
[7,7,7,7],
[7,7,7,7]]
[[1,1,1], 1
[2,3,4],
[2,5,1]]
[[1,8,4,2,9,4,4,4], 12
[5,1,2,7,7,4,2,3],
[1,4,5,2,4,2,3,8],
[8,5,4,2,3,4,1,5]]
[[1,2,3,4], 4
[5,6,6,7],
[8,6,6,9],
[8,7,6,5]]
fonte
row
ecol
à minha lista de 'funções extremamente situacionais'. Solução realmente inteligente.c(m|x-y,m|x+y)
linha reta para a chamada sapply, remover al=
peça. Não vejo nenhum teste com falha. Experimente online!l
restava apenas uma instância.row
ecolumn
ao R esta manhã, porque nunca ouvi falar deles.J ,
2120 bytes-1 byte graças a Jonah!
Experimente online!
Explicação:
fonte
(-.@-:~.)
"os itens exclusivos não combinam" em J, mas eu já encontrei isso muitas vezes também e acho que você não pode ... nós temos=
e~:
, por um lado mão e-:
e<this is missing>
.1#.|.,&((~:&#~.)/.)]
. Experimente online!&
, obrigado!Japonês , 31 bytes
Experimente todos os casos de teste
Explicação:
Também tentei uma versão baseada na resposta de Kirill L. Haskell, mas não consegui encontrar uma boa maneira de "agrupar por uma função dos índices X e Y" e a alternativa que encontrei não era boa o suficiente.
fonte
JavaScript (ES6),
107 105 10198 bytesExperimente online!
Nota
Da maneira como esse código é jogado, a anti-diagonal que consiste na única célula inferior esquerda nunca é testada. Tudo bem porque não pode conter valores duplicados.
Comentado
fonte
05AB1E , 25 bytes
Experimente online! ou como um conjunto de testes
Explicação
Sinto como se tivesse perdido algo aqui.
Precisa tentar jogar isso mais tarde.
fonte
rotate N left
seriaN._
agora. Entãoí‚εεygÅ0«N._]
também funciona. Também é possível remover o achatamento com essa nova alteração ... embora ainda não haja economia de bytes:í‚vyεygÅ0«N._}ø}«ʒ0KDÙÊ}g
N(._
eu acho, mas o seuNFÁ}
é o mesmo comprimento e, nesse caso, ainda mais curto, devido ao]
fechamento do loop e dos mapas simultaneamente. No geral, o uso de._
só é útil quando você sai para salvar 1 byte, em comparação comNFÀ}
.Python 2 ,
144136 bytesExperimente online!
fonte
Oitava , 98 bytes
Experimente online!
fonte
cellfun
, e para os masoquistasstructfun
. No Octave, é um loop for ou havingfun
!Haskell,
118112 bytesExperimente online!
fonte
Carvão ,
615653 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Loop sobre diagonais para frente e para trás;
i=0
representa diagonais avançadas enquantoi=1
representa diagonais reversas.Loop sobre cada índice de linha. Isso representa o índice do início da diagonal.
Faça um loop sobre o índice de cada coluna.
Calcule o índice de linha da diagonal neste índice de coluna. Eu uso um
for
loop sobre uma matriz de elemento único em vez de uma atribuição, pois isso evita a quebra da atribuição em um bloco com a seguinte instrução, economizando assim um byte.Verifique se esta é a primeira coluna ou se a diagonal está prestes a envolver entre a parte inferior e a superior.
Caso contrário, apareça a última lista da lista de listas.
se for, inicie uma nova lista vazia.
Adicione a entrada diagonal atual a essa lista.
E empurre essa lista (de volta) para a lista de listas.
Conte o número de listas que contêm duplicatas.
Vamos dar um exemplo quando
i=0
ek=1
. Isso significa que já coletamos duas diagonais[[1,1,5,2],[9,4,3,5]]
. Aqui está a nossa entrada:Em seguida, passamos
l
de0
para7
. Isso avança a linha e a coluna em 1 a cada vez:A lista é agora
[[1,1,5,2],[9,4,3,5],[5,4,4]]
. No entanto, quandol
é3
que temosk+l=4
um múltiplo da altura da matriz. Isto significa que precisamos começar uma nova lista:[[1,1,5,2],[9,4,3,5],[5,4,4],[]]
. Em seguida, continuamos a coletar elementos diagonais:A lista é agora
[[1,1,5,2],[9,4,3,5],[5,4,4],[2,7,2,1]]
. Agora, quandol
é7
que temosk+l=8
outro múltiplo da altura da matriz. Isto significa que precisamos começar uma nova lista, o que acaba com o último elemento dessa diagonal:[[1,1,5,2],[9,4,3,5],[5,4,4],[2,7,2,1],[4]]
.Ao coletar diagonais de quebra automática começando no primeiro elemento de cada linha, eventualmente acumulamos todas as diagonais da matriz.
fonte
Wolfram Language (Mathematica) ,
99 98 96 9483 bytesExperimente online!
Function[a,a~Diagonal~#&/@Range[t=-#~Total~2,-t]]
obtém todas as diagonais dea
- o que funciona porque#~Total~2
é maior que qualquer dimensão dea
.fonte
APL + WIN, 69 bytes
Solicita uma matriz 2d do formulário 4 6⍴1 2 1 2 1 2 1 2 3 4 5 6 6 5 4 3 2 1 2 1 2 1 2 1
Isso produz:
Experimente online! Cortesia de Dyalog Classic
Explicação:
Rendimentos:
fonte
Perl 5,
8982 bytesTIO
fonte
TSQL,
140128 bytesEncontrou uma maneira de jogar 12 caracteres no golfe. Essa não é mais a solução mais longa.
Golfe:
Ungolfed:
Experimente
fonte