Aparentemente sim! Em três etapas fáceis.
Passo 1
Seja f ( n ) a função de contagem primária (número de primos menor ou igual a n ).
Defina a sequência inteira s ( n ) da seguinte maneira. Para cada número inteiro positivo n ,
- Inicialize t para n .
- Enquanto t não for primo nem 1, substitua t por f ( t ) e itere.
- O número de iterações é s ( n ).
É garantido que o processo iterativo termine porque f ( n ) < n para todos os n .
Considere, por exemplo, n = 25. Inicializamos t = 25. Como esse não é um primo nem 1, calculamos f (25), que é 9. Esse valor se torna o novo valor para t . Como não é primo nem 1, continuamos: f (9) é 4. Continuamos novamente: f (4) é 2. Como esse é um primo, paramos aqui. Fizemos três iterações (de 25 para 9, depois para 4 e depois para 2). Assim s (25) é 3.
Os primeiros 40 termos da sequência são os seguintes. A sequência não está no OEIS.
0 0 0 1 0 1 0 2 2 2 0 1 0 2 2 2 0 1 0 3 3 3 0 3 3 3 3 3 0 3 0 1 1 1 1 1 0 2 2 2
Passo 2
Dado um número inteiro positivo ímpar N , construa uma matriz N × N (matriz) enrolando a sequência finita s (1), s (2), ..., s ( N 2 ) para formar uma espiral quadrada para fora . Por exemplo, dado N = 5, a espiral é
s(21) s(22) s(23) s(24) s(25)
s(20) s(7) s(8) s(9) s(10)
s(19) s(6) s(1) s(2) s(11)
s(18) s(5) s(4) s(3) s(12)
s(17) s(16) s(15) s(14) s(13)
ou, substituindo os valores,
3 3 0 3 3
3 0 2 2 2
0 1 0 0 0
1 0 1 0 1
0 2 2 2 0
etapa 3
Represente a matriz N × N como uma imagem com um mapa de cores cinza ou com outro mapa de cores do seu gosto. O mapa deve ser gradual, para que a ordem dos números corresponda a alguma ordem visualmente óbvia das cores. Os casos de teste abaixo mostram alguns exemplos de mapas de cores.
O desafio
Dado um número inteiro positivo ímpar N , produza a imagem descrita acima.
Regras
A espiral deve estar para fora, mas pode ser no sentido horário ou anti-horário, e pode começar a se mover para a direita (como no exemplo acima), esquerda, baixo ou para cima.
As escalas dos eixos horizontal e vertical não precisam ser as mesmas. Também etiquetas de eixo, barra de cores e elementos similares são opcionais. Desde que a espiral possa ser vista com clareza, a imagem é válida.
As imagens podem ser produzidas por qualquer meio padrão . Em particular, a imagem pode ser exibida na tela ou um arquivo gráfico pode ser produzido ou uma matriz de valores RGB pode ser impressa. Se estiver produzindo um arquivo ou uma matriz, publique um exemplo da aparência quando exibida.
Os meios e o formato de entrada são flexíveis, como de costume . Um programa ou uma função pode ser fornecida . As brechas padrão são proibidas .
O menor código em bytes vence.
Casos de teste
As imagens a seguir (clique para resolução total) correspondem a vários valores de N . Uma espiral no sentido horário e primeira direita é usada, como no exemplo acima. As imagens também ilustram vários mapas de cores válidos.
fonte
s(n)
pode ser alimentada em alguma função / pacote de plotagem sem ser modificada (acho queimshow
no matplotlib poderia lidar com isso, por exemplo), essa é uma forma de saída aceitável?imshow
fazimshow
faz isso.Respostas:
Dyalog APL, 94 bytes
assume
⎕IO=0
saída para n = 701 (convertida de .pgm para .png):
fonte
MATLAB -
197185178175184163162148142140 bytesRaspou 12 bytes, graças a Ander e Andras, e muito obrigado a Luis por juntar os dois. Shaved 16 graças a Remco, 6 graças a flawr
Resultado para
N=301
(F(301)
):Explicação:
fonte
Wolfram Language (Mathematica) , 124 bytes
Agradecemos a Martin Ender por salvar 12 bytes!
Experimente online!
A imagem gerada é:
Fórmula de forma fechada do valor espiral extraído diretamente desta resposta minha.
fonte
#/2-.5
salva um byte.p
até que você precise:...,{y,p=(1-#)/2,-p},{x,p,-p}
MATLAB:
115114110 bytesUm liner (executado no R2016b + como função no script ) 115 bytes
Colocar a função em um arquivo separado, conforme sugerido por flawr, e usar 1 byte adicional por regra de arquivo adicional
No arquivo
s.m
, 64 + 1 bytes para código + arquivoJanela de comando para definir
I
, 45 bytesTotal: 110 bytes
Isso usa recursão em vez de
while
loop, como as outras implementações do MATLAB ( gnovice , Adriaan ). Execute-o como um script (no R2016b ou mais recente), isso define a funçãoI
que pode ser executada comoI(n)
.Versão estruturada:
Exemplo:
Notas:
Também tentei tornar a
s
função anônima, é claro que reduziria significativamente a contagem. No entanto, existem 2 problemas:É difícil evitar recursões infinitas ao usar funções anônimas, pois o MATLAB não possui um operador ternário para oferecer uma condição de interrupção. Invocar um tipo de operador ternário (veja abaixo) também custa bytes, pois precisamos da condição duas vezes.
Você precisa passar uma função anônima para si mesma se for recursiva (veja aqui ), que adiciona bytes.
O mais próximo que cheguei disso usou as seguintes linhas, talvez possa ser alterado para funcionar:
fonte
MATLAB -
126121 * bytesTentei uma abordagem mais vetorizada do que Adriaan e consegui raspar mais bytes. Aqui está a solução de linha única:
E aqui está a solução bem formatada:
* Nota: se você deseja permitir um crapton métrico de iterações desnecessárias, pode alterar a linha
while any(i),
parafor m=v,
e salvar 5 bytes.fonte
cumsum
para vetorizar e evitarnnz(primes(...)
while any(i)
porfor m=M
. Quem se importa se o código leva horas para correr :-)n^2
iterações vão doer! ;)Python 3,
299265 bytesEconomizou 5 bytes graças às sugestões de formatação de Jonathan Frech e NoOneIsHere. Removidos 34 bytes adicionais removendo uma definição de função que foi chamada apenas uma vez.
Isso é um pouco mais longo do que alguns outros, devido ao python não ter um comando para determinar a primidez ou fazer espiral em uma matriz. No entanto, é executado relativamente rápido, cerca de um minuto para
n = 700
.Teste com
fonte
import
e*
.J, 121 bytes
Define uma função:
fonte
R, 231 bytes
Um pouco menos golfe:
Função anônima. Saída em uma janela gráfica. A escala está na escala vermelha, com a tonalidade mais escura igual a 0 e as tonalidades mais claras aumentando os valores.
Resultado para n = 101:
fonte