Dado um número inteiro de entrada n
, desenhar uma cobra número, isto é, uma grelha de medição n x n
que consiste nos números 1
através de n^2
que são enrolados em torno de si na seguinte forma:
Entrada n = 3
:
7 8 9
6 1 2
5 4 3
Entrada n = 4
:
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
Entrada n = 5
:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
(Inspirado por esse problema do Project Euler.)
Isso é código-golfe , a resposta mais curta em bytes vence!
4
:? Ou qualquer número par.Respostas:
MATL , 3 bytes
Experimente online!
Explicação
Built-in ... ¯ \ _ (ツ) _ / ¯
fonte
C #,
203202196193178 bytesGuardou um byte graças a @StefanDelport.
Economizou 22 bytes graças a @FelipeNardiBatista.
Isso funciona com a seguinte observação de como os quadrados são construídos:
Como você pode ver, cada bit é adicionado ao quadrado anterior. Para números pares, vamos direto de onde estávamos, até um mais baixo do que o quadrado e depois deixamos para o final. Os números ímpares são essencialmente o oposto, vamos para a esquerda, até um acima da altura atual e depois até o fim.
Versão completa / formatada:
fonte
++i<=n;
pode se tornarn>++i
, nada mais que eu possa ver, +1.n%2<1?2:1
para2-x%2
? Eu não testei em C #, mas em C e Python funcionou.for(int o=n-2+n%2>>1,i=r[o,o]=1,c=2,w=o,h=o,j;n>i++;){var b=i%2<1; ....
golfed um poucovar b=1-2*(i%2);r[h,w+=b]=c++;for(j=0;j<i-1;++j)r[h+=b,w]=c++;for(j=0;j<i-1;++j)r[h,w-=b]=c++;
Dyalog APL,
70564541 bytesExperimente online!
Quão?
calcula as diferenças entre os índices;
1
e¯1
para direita e esquerda,¯⍵
e⍵
para cima e para baixo.1,⊢,¯1,-
vem como1 ⍵ ¯1 ¯⍵
,+⍨⍴
estende esse array ao comprimento de⍵×2
, para que o final2/⍳
possa repetir cada um deles, com uma contagem de repetições aumentando a cada segundo elemento:então,
precede o elemento superior esquerdo da espiral,
limitar os primeiros elements 2 elementos desta lista de distâncias,
executa soma cumulativa,
classifica os índices (
⍵[i] = ⍵[⍵[i]]
), para traduzir a matriz original com os índices de cada elemento e, finalmente,formas como uma
⍵×⍵
matriz.fonte
C,
321307295284283282 bytesObrigado a @Zachary T e @Jonathan Frech por jogarem um byte!
Aloca uma matriz bidimensional de zeros e começa a preenchê-la de algum lugar no meio. Por fim, os valores maiores que zero, mas menores ou iguais ao quadrado da entrada são impressos.
Experimente online!
Formatado:
fonte
i,j,k,a,b,m;f(n){n*=n;int**l=calloc(a=m=3*n,4);
pori,j,k,a,b,m,**l;f(n){n*=n;l=calloc(a=m=3*n,4);
para salvar um byte?k<=n;
porn>k;
para salvar um byte.PHP , 192 bytes
Experimente online!
Do mesmo modo, construir uma string em vez de uma matriz
PHP , 217 bytes
Experimente online!
fonte
[-1,1][$d&1]
->$d&1?:-1
for(;$k<$a;print join($o)."\n")ksort($o=&$e[+$k++]);
. E outra:"%$l".d
. E mais um:$x*$l*$a+$y*$l
->($x*$a+$y)*$l
.$s
com um sublinhado acolchoado (ou letra ou dígito); esse personagem será substituído..d
sua própria abordagem para salvar 2 bytesPHP,
185 176174 bytesExecute como tubo
-nR
ou teste-o online .demolir
fonte
APL (Dyalog Classic) ,
3229 bytesExperimente online!
Usos
⎕io←1
. Inicia com uma matriz de 0 por 1 (⍪⍬
). 2N vezes (⍣2⍣⍵
) adiciona a altura da matriz (≢⍵
) a cada um de seus elementos, coloca1 2...height
à direita (,⌸
) e gira (⌽⍉
). Quando terminar, corrige a orientação do resultado (⊖∘⌽⍣⍵⌽
) e reverte os números subtraindo-os de N 2 +1 (1+×⍨-
).fonte
Mathematica, 177 bytes
fonte
C ++,
245228 bytesExperimente online!
A função calcula e imprime o valor de cada número da matriz, dependendo de sua posição x, y , aplicando esta lógica:
Versão formatada :
fonte
Python 3 ,
249247 bytesInicializo uma matriz 2D e encontro o ponto de partida, que é o centro para n ímpar ou deslocamento (-1, -1) para o par n e, em seguida, dimensiono o padrão de preenchimento / cursor com o número atual do 'anel'. Sinto que estou perdendo um truque para interpretar as instruções, mas não criei nada mais barato.
Experimente online!
-2 graças a Zachary T!
fonte
\t
e\n
como 1 byte e ainda obter 249 byteslen("def f(n): M=[n*[0]for a in range(n)] x=y=n//2-(n%2<1) M[x][y]=i=s=1 while 1: t=s*2 for d in'R'+'D'*(t-1)+'L'*t+'U'*t+'R'*t: if i==n*n:print(*M,sep='\n');return v=[1,-1][d in'LU'] if d in'UD':x+=v else:y+=v M[x][y]=i=i+1 s+=1") 223
Wolfram Language (Mathematica) ,
(...)83 bytesOs bytes medidos em UTF8,
\[LeftFloor]
(⌊
) e\[RightFloor]
(⌋
) custam 3 bytes cada. O Mathematica não possui nenhum conjunto de caracteres de bytes especial.Experimente online!
Usa o formulário fechado para cada um dos 4 casos e, em seguida, toma o máximo com cuidado para obter o resultado desejado.
Retorna uma matriz 2D de números inteiros. Não tenho certeza se isso é permitido e, embora tenha sido solicitado nos comentários , o OP não respondeu.
fonte
Clojure, 206 bytes
Eu acho que esse é um começo decente, constrói o quadro em sequência em um mapa de hash e o particiona em
n x n
listas. Issodefmacro
acabou sendo bastante longo, mas o código ainda é mais curto com ele do que sem. Existe uma sintaxe mais sucinta para descrevê-la?O volume de bytes calcula o ponto inicial e constrói a lógica de pesquisa da próxima velocidade
v
. Talvez um aninhadovec
seja melhor, mas você tem dois índices e velocidades para acompanhar.fonte
J , 41 bytes
Experimente online!
Faz o mesmo que a submissão de APL do ngn, mas começa com uma matriz 1 por 1 e repete 2 × N − 2 vezes.
fonte
Python 165 (ou 144)
Isso cria uma matriz numpy, depois a gira e adiciona um lado até que o tamanho correto seja atingido. A pergunta não especificou se o mesmo ponto inicial precisa ser usado para números pares e ímpares; se não for o caso, a linha
if n%2==0:a=r(r(a))
poderá ser removida, economizando 21 bytes.fonte
J , 41 bytes
formatação padrão
Essa abordagem é baseada no At Play With J Volutes (o APL de Uriel usa uma técnica semelhante).
É inesperado e elegante o suficiente para justificar uma segunda resposta em J, pensei.
Essencialmente, não fazemos nada de procedimento ou mesmo geométrico. Em vez disso, criamos aritmeticamente uma sequência simples que, quando a varredura é somada e classificada, fornece a ordem correta do número em espiral da esquerda para a direita, de cima para baixo. Em seguida, modelamos isso em uma matriz e terminamos.
Vou adicionar uma explicação mais detalhada quando o tempo permitir, mas o artigo vinculado explica isso em profundidade.
Experimente online!
fonte
Python 3 (sem pilha) ,
192188179150 bytesExperimente online!
Salva 4 bytes, pois a rotação fasorial de 90 graus é feita facilmente sem números complexos
fonte
R , 183 bytes
Experimente online!
Saída é uma matriz de cobra (ou matriz de cobra, qualquer que seja). Provavelmente não é o método mais eficiente, e provavelmente poderia ser jogado, mas achei que valia a pena mostrar. Estou bastante orgulhoso disso, na verdade!
O método constrói a matriz de dentro para fora, sempre acrescentando um número adicional de números inteiros igual ao número de colunas na matriz antes de acrescentar. O padrão a seguir é vinculado por colunas ou linhas, além de reverter alguns valores para que eles sejam anexados na ordem correta.
193 bytes
Exatamente o mesmo que acima, mas final
b
éExperimente online!
que fornece uma saída um pouco mais limpa, mas não vi nenhum critério especial para a saída, portanto, a primeira resposta deve funcionar se não me engano.
fonte