Uma matriz piramidal é uma matriz quadrada em que todos os números aumentam ou diminuem a partir do ponto central, como as duas matrizes abaixo:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
Ou:
3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3
Dado um número inteiro diferente de zero n
, crie uma matriz piramidal onde os números vão de 1
para n
ordem crescente (se n <0) ou ordem decrescente (se n> 0) a partir do centro. Se n
for par, haverá 4 números de centro (veja os exemplos).
Como sempre:
- Formato opcional de entrada e saída
- O número de espaços, delimitador etc. é opcional
Casos de teste:
1
1
-1
1
5
1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 3 3 3 3 2 1
1 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1
-5
5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5
2
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
-2
2 2 2 2
2 1 1 2
2 1 1 2
2 2 2 2
-4
4 4 4 4 4 4 4 4
4 3 3 3 3 3 3 4
4 3 2 2 2 2 3 4
4 3 2 1 1 2 3 4
4 3 2 1 1 2 3 4
4 3 2 2 2 2 3 4
4 3 3 3 3 3 3 4
4 4 4 4 4 4 4 4
-10 < n < 10
?Respostas:
Geléia ,
1817 bytesExperimente online! ou verifique todos os casos de teste .
Como funciona
fonte
EXCEL: 126 bytes
=MAX(MIN(MIN(CELL("row",RC)-1,CELL("col",RC)-1),MIN(((ABS(R1C1)-1)*2+3)-CELL("row",RC),((ABS(R1C1)-1)*2+3)-CELL("col",RC))),0)
Experimente online *
Nota: esta resposta usa a notação R1C1. Se você vai tentar fazer isso sozinho. você precisa ativá-lo nas opções do Excel.
a fórmula dada precisa estar em todas as células presentes além (2,2). Coloque o tamanho desejado da pirâmide em (1,1).
captura de tela rápida da fórmula em ação:
Aqui está uma imagem adicional de alguma diversão com formatação condicional!
* Demora muito tempo para atualizar, atualmente.
fonte
=MAX(MIN(MIN(ROW()-1,COLUMN()-1),MIN(((ABS(A1)-1)*2+3)-ROW(),((ABS(A1)-1)*2+3)-COLUMN())),0)
92 bytes. No entanto, ele ainda não lida com os casos e a fórmula não pode ser arrastada, pois a referência da célula não está bloqueada.=MEDIAN(MIN(ROW()-1,COLUMN()-1),ABS(A1)*2+1-MAX(ROW(),COLUMN()),0)
Range
ou muito mais do que 126 bytes.Python 2,
1099998Criar lista
e brinque um pouco com isso.
edit: nova maneira de criar lista + thx Lynn por dois bytes
fonte
If n is even, then there will be 4 center numbers
MATL ,
2624 bytesExperimente online! Ou verifique todos os casos de teste (código ligeiramente modificado para servir como suíte de testes).
Explicação
O código primeiro cria a matriz de saída assumindo entrada positiva
n
. A matriz é inicializada como1
entrada ímpar ou como a matriz vazia para entrada par (isso é criado como uma matriz de identidade com tamanho igual à paridade da entrada). Em seguida, o seguinte é repetidon
vezes para entrada par en-1
horas para entrada ímpar: estenda a matriz com um quadro contendo0
e adicione1
a todos os elementos.Por exemplo, as etapas para entrada
n
são:Matriz inicial:
Estender com moldura:
Adicionar
1
:Estender com moldura:
Adicionar
1
:Isso fornece a saída correta para entrada positiva. Se a entrada for negativa, a matriz precisará ser modificada adicionando a entrada menos
1
e assumindo o valor absoluto:Você pode assistir a matriz crescendo (código modificado para mostrar etapas intermediárias) em MATL Online! O intérprete ainda é um beta. Se não funcionar, pressione "Executar" novamente ou recarregue a página.
Código comentado
fonte
.2
segundosPython 2.7:
123122120 bytesprobs ainda podem salvar alguns bytes ...
edit1:
N=abs(n)
para salvar 1 byteedit2:
(i+1)*(n>0)or-n-i
para salvar 2 bytesfonte
Haskell,
119113110104102101 bytesRetorna a matriz como uma lista de listas de números inteiros, por exemplo:
f 2
->[[1,1,1,1],[1,2,2,1],[1,2,2,1],[1,1,1,1]]
.Como funciona:
fonte
Perl, 175 bytes
Inclui 1 bytes para
-p
.(Existe uma nova linha à direita que eu não sei mostrar com a remarcação, mas você precisa dela).
Necessidades
-p
, bem como-M5.010
ou-E
para executar:Porra, isso é muito longo ... Vou tentar outras abordagens quando tiver algum tempo.
fonte
eval
?y///
não interpola, use aspas duplas para interpolar$w
e$k
, em seguida,eval
para executary///
.Python 2, 109 bytes
fonte
J,
2926 bytesUso
Explicação
O
i.
verbo intervalo gera[0, 1, ..., n-1]
positivon
e[n-1, n-2, ..., 0]
negativo, on
que é útil aqui.fonte
Mathematica, 78 bytes
Explicação
Faça a matriz inicial: 1x1 se ímpar, 2x2 se for par.
Gere uma lista de 1 a abs (entrada) - 1.
Preencher a matriz inicial usando a lista mencionada acima.
Adicione 1 ou entrada, o que for menor.
Aplique valor absoluto a toda a matriz.
fonte
PHP,
177157 bytescorrer com
php -r '<code>
circula pelas linhas e colunas, imprime os valores dependendo da distância do centro.
$n=abs($z)+1
: O+1
Salva algumas+1
e-1
em expressões posteriores-$n+1
(pré-incremento na condição!) a$n-1
(-abs($z)
aabs($z)
)$n
: 1) são ignoradas(
$n&1
é verdade para colunas pares aqui! Lembre-se do+1
?)+1
.fonte
Haskell,
191183173169168 168 bytesUso:
Obrigado a nimi por
2102024 bytes!fonte
negate
é(0-)
f
para[id!id,tail!init]!!mod n 2
e, em seguida, em linha-lo emg
e usar a1<2
guarda para vincular um resultado intermediário do ramo:g n| ... |q<-r<$>a n=([id!id,tail!init]!!mod n 2)q$a n
. Você não precisa de um nome para a função principal.a
, também (e voltar para a1<2
guarda):g n| ... |1<2=[id!id,tail!init]!!mod n 2=<<map r$r$(\x->(x<$[1..x])++[x+1..n])<$>[1..n]
.m=map
, em!
:...(++).m y
eg
:g n|n<0=m(m(abs.((n-1)+)))$g$abs n|1<2=[id!id,tail!init]!!mod n 2=<<m r$r$m(\x->(x<$[1..x])++[x+1..n])[1..n]
.JavaScript (ES6), 107 bytes
l
é o tamanho da matriz. On<0?-n-j:j+1
parece estranho, mas eu não consigo encontrar nada melhor.fonte
Vim,
152143 bytesTenho certeza de que isso poderia ser mais praticado, principalmente nas últimas duas linhas, mas meu cérebro está frito.
Experimente online!
Aqui está no formato xxd com caracteres não imprimíveis:
Explicação
Ele constrói a pirâmide do centro para fora, cercando o número do centro com
x
es:Em seguida, substitui
x
es pelo número seguinte e o envolvex
novamente com es:...e assim por diante. Para números pares, ele faz a mesma coisa, mas começa com uma base 2x2.
Aqui está o código "ungolfed". É um tanto pouco convencional que eu "grave" uma macro digitando-a em um buffer (daí todos os
<C-v>
) e excluindo-a em um registro, que é a melhor maneira que encontrei para compor uma macro sem realmente executar as teclas digitadas.fonte
PHP, 215 bytes
fonte
R, 112 bytes
Precisa de número inteiro
n
na área de trabalho, caso contrário, executen=scan()
por 8 bytes extras.fonte