Definição
Uma matriz de ponta de seta é uma matriz que possui todas as entradas iguais a 0 , exceto as na diagonal principal, linha superior e coluna mais à esquerda. Em outras palavras, a matriz deve ficar assim:
* * * * * * * * 0 0 0 0 * 0 * 0 0 0 * 0 0 * 0 0 * 0 0 0 * 0 * 0 0 0 0 *
Onde cada * é qualquer entrada diferente de zero.
Tarefa
Dada uma matriz quadrada de números inteiros não negativos, verifique se é ponta de seta de acordo com a definição acima.
Você não pode usar o tamanho da matriz como entrada, a menos que o idioma equivalente a uma matriz seja algo como um ponteiro e um comprimento (como C). Sempre será pelo menos 3 x 3.
O código mais curto em bytes em cada idioma vence.
Entrada e saída
Você pode escolher entre qualquer um dos seguintes formatos para receber entrada:
- Uma matriz no tipo de matriz nativa (se o seu idioma tiver um)
- Uma matriz 2D 1 (uma matriz de matrizes 1D, cada uma correspondendo a uma linha)
- Uma matriz 1D (uma vez que a matriz é sempre quadrada)
- Uma string (você escolheu o espaçamento, mas não abuse disso de forma alguma).
Quando se trata de fornecer saída, é possível relatar um valor de verdade / falsidade seguindo a definição padrão do problema de decisão ou escolher dois valores distintos e consistentes.
Além disso, você pode receber e fornecer resultados através de qualquer método padrão , em qualquer linguagem de programação , observando que essas brechas são proibidas por padrão. Se você quiser escolher outro formato ou não tiver certeza sobre algo, pergunte nos comentários.
1: ou o equivalente do seu idioma (lista, vetor etc.)
Exemplos
Vejamos os seguintes exemplos:
1 2 2 2 2 1 0 0 3 0 1 0 4 0 0 1
Essa é uma matriz de ponta de seta (seus programas devem reportar um valor verdadeiro), porque os elementos na diagonal principal são 1 1 1 1
, os da linha superior 1 2 2 2
e os da coluna mais à esquerda 1 2 3 4
. Todas as outras entradas são 0 , portanto, isso satisfaz todas as condições.
3 5 6 7 1 0 8 0 0
Essa matriz não é uma ponta de seta porque há um 0 na diagonal principal.
9 9 9 9 9 9 0 0 9 7 9 0 9 0 0 9
Este também não é uma ponta de seta, porque contém um 7 no lugar de um 0 .
Mais casos de teste
Verdade:
[[1, 1, 1], [1, 1, 0], [1, 0, 1]] [[1, 2, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]] [[1, 2, 2, 2], [2, 1, 0, 0], [3, 0, 1, 0], [4, 0, 0, 1]] [[34, 11, 35, 5], [56, 567, 0, 0], [58, 0, 679, 0], [40, 0, 0, 7]]
Falsy:
[[3, 5, 6], [7, 1, 0], [8, 0, 0]] [[9, 9, 9, 9], [9, 9, 0, 0], [9, 7, 9, 0], [9, 0, 0, 9]] [[1, 0, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]] [[1, 6, 3, 4], [13, 2, 0, 6], [29, 0, 1, 0], [2, 0, 0, 4]]
fonte
Respostas:
Javascript (ES6),
4847 bytesGuardado 1 byte graças a edc65
Retorna
false
para matrizes de ponta de seta etrue
para matrizes que não são de ponta de seta (permitidas, pois quaisquer dois valores distintos podem ser usados para representar verdadeiro e falso)Casos de teste:
Mostrar snippet de código
fonte
f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
f=
curso #;-)
J ,
2120191715 bytes-4 bytes graças a @GalenIvanov.
Recebe entrada como uma matriz (matriz 2).
Experimente online!
Explicação
Deixe que o histórico de edições seja uma lição para você não jogar golfe e escreva uma explicação ao mesmo tempo.
Explicação visual
Observe que isso é feito no REPL (as entradas são fornecidas começando com três espaços e a saída é fornecida sem espaços à esquerda). Por isso, às vezes omito funções de composição como
@
e,&
uma vez que as coisas no REPL são avaliadas da direita para a esquerda (as funções são mais complexas).Suponha que você tenha a seguinte matriz de amostra:
Primeiro, eu gostaria de explicar (e dar uma mensagem para) a maneira muito inteligente de @ GalenIvanov de gerar a matriz de identidade, que é a seguinte
=&/:@}.
.Primeiro, decapitamos a matriz de entrada (
}.
).Em seguida, obtemos os índices em que cada linha estaria se as linhas fossem classificadas usando
/:
-grade up.Observe que os índices resultantes são únicos : a lista não possui elementos duplicados (e por que faria isso? Não há como colocar dois elementos na mesma posição em uma matriz).
Por fim, usamos o nicho, mas prestamos
=
auto-classificação. Essa mônada compara cada elemento exclusivo com todos os outros elementos em uma matriz. Lembra como eu mencionei que era importante que as indicações resultantes fossem únicas? Como o=
self-classify faz as comparações na ordem em que os elementos exclusivos aparecem na lista, a saída resultante será a matriz de identidade de uma entrada exclusiva (é por isso que=@i.
é como você pode criar uma matriz de identidade de um determinado comprimento).Uma vez que tenhamos a matriz de identidade, é uma questão de adicionar uma linha de unidades e uma coluna de unidades, o que é feito de maneira muito simples (se for dado um átomo - ou seja, um único elemento - a
,
família o repetirá para preencher quando for adicionado) :Em seguida, simplesmente comparamos a matriz da ponta de seta gerada com o sinal da matriz de entrada.
fonte
*
suficiente em vez de0@<
(para 17 bytes)? Experimente=&/:
quando a combinei}.
, obtive isso*-:1,1,.=&/:@}.
por 15 bytes Experimente online!/:
e}.
-behead), obrigado novamente! Vou editá-lo.*-:1,1,.=@}.
funciona muito bem - não há necessidade de uma maneira sofisticada de encontrar a matriz de identidade. Você pode gerar uma matriz de identidade a partir da própria matriz quadrada simplesmente por=
. Então, solte uma linha com}.
, faça a matriz de identidade com=
, adicione uma linha e uma coluna com1
e assim por diante.Wolfram Language (Mathematica) , 47 bytes
Experimente online!
Explicação:
Clip@#
substitui todos os números diferentes de zero na matriz por 1s e, em seguida, comparamos isso com uma matriz com dimensões{1,1}Tr[1^#]
={Length@#, Length@#}
com 0 na posiçãoi,j
quando1 < i != j > 1
e 1 caso contrário.(Basicamente baseado na resposta de Uriel .)
Aqui está outra idéia que tem 16 bytes a mais - fique à vontade para roubá-la, se você conseguir:
Experimente online!
fonte
APL (Dyalog Classic) ,
19161513 bytes-1 byte graças a @ErikTheOutgolfer
(
⎕IO←0
)Experimente online!
-2 bytes graças a @ngn e @ H.PWiz
Quão?
(Matriz de entrada 2D S )
×≡
Verifique se S é positivo apenas em ...(∧=⌊
... as diagonais ou a linha superior e a coluna esquerda ...)/¨∘⍳∘⍴
... de S .fonte
⍳∘⍴
produtos cartesianos.×≡(=/∨1∊⊢)¨∘⍳∘⍴
(=/∨1∊⊢)
->(~≠⌊⌊)/
(∧=⌊)/
, claro ambos exigem⎕IO←0
PowerShell ,
112108 bytesExperimente online!
Recebe entrada e manipula como uma matriz de matrizes, pois o PowerShell não oferece suporte a matrizes (fora do suporte às matrizes de transformação do .NET Direct3D, o que é algo totalmente diferente).
Todo o algoritmo é baseado no fato de que números diferentes de zero são verdadeiros e zero é falsey no PowerShell, e usando a multiplicação para determinar esses valores de verdade / falsey.
Primeiro pegamos a primeira linha
$a[0]
e verificamos se essa matriz0
é-in
armazenada em nossa$o
variável utput. Se algo nessa linha é zero,$o
também é zero, caso contrário, é um, feito por uma rápida conversão com int+
.Em seguida, fazemos um loop de
1
até$a.count-1
, definindo$x
ao longo do caminho - vamos percorrer cada linha, uma de cada vez.A cada iteração, definimos a variável auxiliar
$i
para rastrear em qual linha estamos, depois passamos de0
para$x
para iterar cada elemento dessa linha. Dentro do loop interno, estamos multiplicando novamente$o
, desta vez selecionando uma configuração de tupla como um operador pseudo-ternário.A condicional da tupla
!$_-or$_-eq$i
, diz "quando estamos na 0ª coluna, ou a coluna corresponde à linha (ou seja, a diagonal principal)" para selecionar a segunda metade da tupla quando for verdade ou a primeira metade quando falsey. A tupla é composta por!($y=$a[$i][$_]), $y
. A primeira metade define$y
para jogar golfe na segunda metade, mas, de qualquer maneira, estamos selecionando o elemento atual. A primeira metade faz negação booleana, enquanto a segunda metade toma o elemento como está. Portanto, se não estivermos na coluna 0 nem na diagonal principal, garantiremos que o elemento seja zero, pegando o Booleano, não. Da mesma forma, garantimos que a 0ª coluna ou a diagonal principal seja diferente de zero, simplesmente utilizando-a.Portanto, agora que iteramos por todos os elementos da matriz,
$o
será0
que algum elemento estava incorreto ou um número inteiro diferente de zero se for uma matriz de ponta de seta. Nós dobramos o valor booleano, não para obter umFalse
ou outroTrue
, para tornar nossa saída consistente, e isso é deixado no pipeline em que a impressão está implícita.fonte
+
=[int]
? Isso é bom.Geléia ,
1412 bytes-2 bytes de Pietu1998
Experimente online!
Explicação
Use a matriz acima como exemplo de entrada.
fonte
APL (Dyalog) ,
211817 bytesExperimente online!
Quão?
Este vai para o outro lado -
=/¨∘⍳
- cria a matriz de identidade1-⍨⍴
- paran - 1
1⍪1,
- precede uma coluna e uma linha de 1s≡
- compara com×
- a matriz original, depois de passar por uma sinalização por elementosfonte
MATL , 15 bytes
Entrada é uma matriz (usando
;
como separador de linhas). A saída é1
para ponta de seta,0
caso contrário.Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
C (gcc) ,
8075 bytesExperimente online!
Economizou 5 bytes graças ao scottinet!
Reutilizou o código de teste desta resposta .
Analisa linearmente a matriz em busca de valores incorretos, retornando 0 para uma matriz de ponta de seta e 1 caso contrário. Verificamos calculando o exclusivo ou se o item em uma determinada posição é zero e se essa posição está na seta.
A codificação das informações da matriz 2D em uma dimensão leva a um conjunto de condições bastante simples. Se deixarmos
i
nosso índice com base em 0 nan
matriz dimensional,i<n
descreveremos a primeira linha. Da mesma forma,i%n==0
descreve a primeira coluna ei/n==i%n
descreve a diagonal.O melhor truque que encontrei para lidar com o retorno é definir a dimensão como zero ao encontrar um erro. Isso faz com que o loop termine imediatamente, e retornar a negação lógica da dimensão nos dará um dos dois valores distintos. A scottinet encontrou o caminho para fazer com que o GCC a devolvesse mais bem.
fonte
Python 2 , 75 bytes
Experimente online!
Python 2 , 85 bytes
Tomando o array como uma matriz 1D:
Experimente online!
fonte
R ,
787069685453 bytesExperimente online!
Portar a resposta de Luis Mendo é muito menor do que minha abordagem anterior.
Obrigado ao rturnbull por apontar um erro e jogar um byte!
resposta antiga, 68 bytes:
Experimente online!
A resposta de duckmayr testa que todas as entradas na diagonal principal e na primeira linha / coluna (
m[i]
) são diferentes de zero e as demais (m[-i]
) são zero, usando uma boa aritmética para obter a diagonal e a primeira linha.Essa resposta, no entanto, testa para garantir que (1) zero entrada não esteja na diagonal principal ou na primeira linha / coluna e (2) que haja, dada uma
n x n
matriz,3*n-2
entradas diferentes de zero.which
retorna os índices onde está sua entradaTRUE
e, com o opcionalarr.ind=T
, retorna uma matriz de índices para cada dimensão da matriz, nesse caso, dois.Portanto
any(i[,1]==i[,2])
, quando existe um zero na diagonal e quandoany(i==1)
existe um zero na primeira linha ou na primeira coluna.Finalmente, um pouco de aritmética mostra que o número de entradas diferentes de zero deve ser
3*n-2
,n
da primeira coluna,n-1
da diagonal en-1
da primeira linha.fonte
all(!m==!d)
a última linha?(!!m)==d
mas!
tem menor precedência do que==
. Eu acho qued==!!m
deveria fazer o truque, no entanto.d!=!m
faz o mesmo, por um byte a menos. Você pode salvar outro byte usando apryr::f
sintaxe e nãofunction
também.Python 2 ,
9290 bytesExperimente online!
Créditos
fonte
Haskell , 62 bytes
-3 bytes graças ao Sr. Xcoder. -13 bytes graças a user28667. -5 bytes graças ao Zgarb.
Experimente online!
fonte
<1
e esses truques? : P(x==y||x==0||y==0)==(m!!y!!x/=0)
deve ser menorx*y<1
.Gelatina , 10 bytes
Experimente online!
fonte
Python 3 ,
7271 bytesGraças a @xnor por jogar fora um byte!
Experimente online!
fonte
0<i!=j>0
salva um byte,Pitão,
2221 bytesDefinitivamente, essa não é a linguagem para manipulação de matrizes.
Para cada linha
b
e seu índicek
na matriz (.e
), pegue a primeira e ak
quinta entradas (lado esquerdo e diagonal) com,@bkh
e (+
) todas as outras entradas com.Db,0k
. Sek
não for 0 para corresponder à primeira linha (Wk
),!
nemM
todas essas entradas. Depois que todos eles tiverem sido selecionados, verifique se todos eles são verdadeiros. (.As
) Se houver um 0 onde não deveria haver, o local correspondente será agarrado como está e atrapalhará!
oe , e se houver um diferente de zero onde não deveria haver, será anotado como 0, que é também falso.Suíte de teste.
-1 bytes para trocar as ordens.
fonte
@VQUQ
ou.DVQUQ
para diagonais / excluir diagonais. Mas isso exigiria uma abordagem completamente diferente. Não tenho certeza embora ... (BTW esqueceu de ligação de actualização?)VQUQ
ideia:>.A++hCQhQ.(VQUQsstCt
. Isso parece altamente redundante, no entanto. Você pode ajustá-lo para economizar alguns bytes.Pip ,
312322 bytesEsta é uma função que utiliza uma lista aninhada de números 2D. Experimente online!
Explicação
Muitas comparações estão acontecendo aqui. A primeira coisa a saber é que os operadores de comparação no Pip podem ser encadeados, como no Python:
5>4>3
is5>4 and 4>3
(true), not(5>4)>3
(false). A segunda é que isso não se aplica ao==
operador "exatamente igual". Outra diferença: normal comparações têm precedência maior do que os operadores de mapeamentoMC
eMM
e pode ser usado em expressões lambda, enquanto==
tem menor precedência e não pode.Para gerar a primeira matriz, usamos
MC
"map-coords". Esse operador pega um número, gera uma grade de coordenadas quadradas desse tamanho e mapeia uma função para cada par de coordenadas (x, y), retornando uma lista de listas dos resultados. Por exemplo,{a+b} MC 3
daria o resultado[[0; 1; 2]; [1; 2; 3]; [2; 3; 4]]
.Aqui, o tamanho da grade é
#a
o tamanho do nosso argumento original. A função é0<_!=B>0
, que é uma maneira mais curta de escrever{0 < a != b > 0}
:Isso retorna 0 para a primeira linha / coluna e a diagonal principal e 1 em outro lugar.
fonte
Casca ,
1211 bytesExperimente online!
Explicação
A ideia é que Husk defina 0 com a potência de 0 como 1, de modo que o produto externo tenha 1s na primeira linha e coluna. Além disso, 1 na potência de qualquer número é 1, portanto o produto externo possui 1s na diagonal. Outras entradas são 0 à potência de um número positivo, que é 0. Isso fornece uma matriz de ponta de seta binária, com a qual comparamos a entrada
≡
.fonte
APL + WIN,
3633 bytesSolicita a entrada na tela de uma matriz APL 2d.
fonte
Clojure,
128959285 bytesÉ sempre emocionante ver dois colchetes de abertura consecutivos.
Versão original:
A primeira parte funciona
assoc
inserindo elementos diagonais da sub-matriz em zero e verificando se todas as linhas são iguais :) Usei um truque semelhante no método jacobiano .A
concat
última parte indica a diagonal + primeira linha e coluna e verifica se são positivas.fonte
Javascript (ES6), 58 bytes
Minha solução para Javascript:
Não é tão inteligente quanto a resposta de Herman , mas senti que também deveria postar aqui.
Mostrar snippet de código
fonte
Clojure,
212206188 bytes-6 bytes removendo alguns espaços perdidos e atalhos
range
. Talvez eu tenha que deixar isso para que eu possa pensar em uma maneira melhor.-18 bytes graças a @NikoNyrh e criando atalhos para
map
.Horrível, horrível. Não sei por que não consigo entender minha solução razoável.
Toma um vetor aninhado como entrada.
Tentei reescrever isso do zero usando um método diferente, e acabou por mais tempo. Em vez de esculpir manualmente as seções "resto" da matriz, decidi tentar gerar todas as coordenadas na matriz, gerar as coordenadas da ponta da seta e usá
clojure.set/difference
-las para obter as células que não são da seta. Infelizmente, a chamada para esse built-in é cara:223 bytes
fonte
#(drop 1 %)
é o mesmo querest
e#(not(zero? %))
é o mesmo quepos?
(como temos números não negativos). Você pode querer dar uma olhada na minha resposta de 128 bytes, que tem uma abordagem semelhante a esta. Após a implementação, percebi que há muito em falta para lidar com o acesso baseado em índice em um loop for.rest
. Eu provavelmente deveria desistir dessa tentativa e tentar novamente.Stax , 11 bytes CP437
Experimente online!
Versão descompactada com 13 bytes:
Finalmente empate Husk e derrotado por Jelly por apenas um byte ...
Explicação
fonte
R ,
8179 bytes-2 bytes graças ao Sr. Xcoder
Experimente online!
fonte
C, 117 bytes
Experimente online!
fonte
PowerShell , 186 bytes
Experimente online!
fonte
param($a)
para receber informações,-contains
elas podem ser trocadas por uma-in
e todas-eq0
podem ser trocadas por!
. Finalmente, você pode fazer um loop de1
até$a.length
e se livrar doif($_-ne0)
corpo do loop.Perl 5 , 136 + 2 (
-ap
) = 138 bytesExperimente online!
fonte
Limpo , 79 bytes
Experimente online!
fonte
Japonês , 16 bytes
Teste online!
Cara, isso me leva de volta aos bons velhos tempos, quando o Japt era regularmente muito mais longo do que outras langs do golfe ...
fonte
K (oK) ,
2730 bytesSolução:
Experimente online!
Explicação:
Eu devo estar fazendo algo estúpido, pois as soluções APL são menos da metade da contagem de bytes ...
24 bytes gastos na criação da ponta da seta.
or
juntas as três matrizes a seguir:Repartição completa:
fonte