fundo
A sequência OEIS A272573 descreve uma espiral em uma grade hexagonal da seguinte maneira:
Inicie uma espiral de números em um mosaico hexagonal, com o hexágono inicial como a (1) = 1. a (n) é o menor número inteiro positivo que não é igual a ou anteriormente adjacente a seus vizinhos.
A sequência começa
1, 2, 3, 4, 5, 6, 7, 4, 6, 8, 5, 9, 8, 10, 2, 11, ...
Aqui está uma ilustração do padrão espiral:
a(11) != 1
porque então3
e1
seria adjacente em dois lugares.a(11) != 2
porque então3
e2
seria adjacente em dois lugares.a(11) != 3
porque então3
seria adjacente a si mesmo.a(11) != 4
porque então3
e4
seria adjacente em dois lugares.- Portanto
a(11) = 5
.
Desafio
O desafio é escrever um programa que calcule A272573 . Isso é código-golfe , então o código mais curto vence.
code-golf
sequence
hexagonal-grid
Peter Kagey
fonte
fonte
Respostas:
JavaScript (ES6),
267 .. 206199 bytesExperimente online!
Quão?
Definições
Por convenção, chamaremos célula de canto de uma célula que possui apenas uma aresta em comum com a camada anterior da espiral e a célula lateral de célula que possui duas arestas em comum com a camada anterior. Conforme sugerido por Ourous, também podemos pensar nelas como células da ordem 1 e 2, respectivamente.
As células de canto são mostradas em amarelo abaixo. Todas as outras células são células laterais (exceto a célula central, que é um caso especial).
Sobre vizinhos de célula
Nós realmente não precisamos acompanhar as coordenadas das células na grade. A única coisa que precisamos saber é a lista de células vizinhas para cada célula na espiral a qualquer momento.
Nos diagramas a seguir, os vizinhos na camada anterior são mostrados em tom claro e os vizinhos adicionais na camada atual em tom mais escuro.
Uma célula possui 2 vizinhos entre as células anteriores se:
Uma célula possui 3 vizinhos entre as células anteriores se:
Implementação de vizinhos de célula
No código acima:
map()
Encontrando o próximo termo da sequência
fonte
Limpo ,
284279272262 bytesExperimente online!
Gera a sequência para sempre.
Mapeamento hexagonal
A maior parte do código destina-se ao mapeamento de hexágonos exclusivamente para
(x,y)
coordenadas, para que haja uma função única e simples para determinar a adjacência que é válida para todos os mapeamentos de pontos.Os pontos mapeados são assim:
A partir daí, determinar a adjacência é trivial e ocorre quando um dos seguintes:
x1 == x2
eabs(y1-y2) == 1
y1 == y2
eabs(x1-x2) == 1
y1 == y2 - 1
ex2 == x1 - 1
y1 == y2 + 1
ex2 == x1 + 1
x1 == x2
ey1 == y2
Geração de pontos
Observe que, ao atravessar o hexágono em espiral, as diferenças se repetem para cada camada
n
:n
etapas de(1,0)
n-1
etapas de(1,-1)
n
etapas de(0,-1)
n
etapas de(-1,0)
n
etapas de(-1,1)
n
etapas de(0,1)
Isso gera os pontos na ordem correta, somando prefixos dessa sequência:
Reunindo
O código que realmente encontra a sequência da pergunta é apenas:
Que, por sua vez, é principalmente filtrado por
and[r<>j\\(u,v)<-m|c h u,(p,q)<-m|q==v,(i,j)<-m|c p i]
Esse filtro obtém pontos de
m
(a lista de pontos já mapeados) por:j
(i,j)
lugaresi
adjacentes ap
(p,q)
onde o valorq
é igual av
(u,v)
locaisu
adjacentes ao ponto atualfonte