A espiral de Ulam é um tópico verdadeiramente fascinante, mas intrigante, em matemática. Como ele funciona em detalhes pode ser encontrado aqui , mas um breve resumo pode ser explicado da seguinte forma:
Começo escrevendo um, depois escrevo dois à direita. Acima dos dois, escrevo três e, à esquerda, escrevo quatro. Eu continuo esse padrão de circular em torno de 1 (e qualquer número entre eu e 1) infinitamente (ou até que seja ordenado que pare), formando um padrão em espiral. (veja o exemplo abaixo)
O objetivo
Crie um programa que aceite n (sempre será um número ímpar maior que zero) como uma entrada correlacionada com o número de linhas e, em seguida, imprima os valores dos números primos linha por linha da espiral do Ulam. A formatação pode ser de qualquer forma, mas deve ser legível por humanos e óbvia.
Por exemplo, dada a entrada 3, seu programa deve produzir 5,3,2,7
, porque 3 linhas produzem a seguinte espiral:
5 4 3 <-- first row has the primes 5 and 3
6 1 2 <-- second row has the prime 2
7 8 9 <-- third row has the prime 7
Como este é um código de golfe, a resposta com o menor número de bytes vence (não importa quão ineficiente)! As brechas padrão não são aceitáveis.
Respostas:
Pitão, 20 bytes
Experimente online: Demonstração
Este código gera toda a espiral do Ulam, conecta todas as linhas e filtros para números primos.
Explicação:
fonte
MATLAB, 48
Basicamente, isso cria uma espiral do tamanho necessário (solicitado pelo usuário) e, em seguida, organiza-a para que apareça na ordem correta das linhas. Isso é armazenado em a. Em seguida, ele exibe todos os valores em que são primos.
Como você disse em qualquer formato legível, salvei um byte e fui para a saída padrão de disp () que é (no seu caso de teste, n = 3):
Como um bônus adicional, isso funciona para qualquer n> 0, incluindo números pares. Por exemplo, a saída para n = 10 é:
fonte
spiral
função é #CJam,
4233 bytesExperimente online
A versão mais recente inclui melhorias substanciais sugeridas pelo @Martin.
O método para construir a espiral é, em cada etapa, girar a matriz que temos até agora em 90 graus e adicionar uma linha com números adicionais. Isto é repetido
(n / 2) * 4
vezes.Os valores na matriz resultante são então filtrados por serem primos.
Explicação:
fonte
2/4*
ser substituído por2*
, ou você o deixou de propósito?(2*
deve estar correto.Mathematica 223
Isso apropria o código de Kuba para uma espiral de Ulam. É por isso que estou enviando como um wiki da comunidade. Eu apenas joguei golfe e selecionei os números primos, listados pela linha em que residem.
Exemplo
Para melhorar a exibição:
fonte
Mathematica, 118 bytes
Isso gera a espiral Ulam na forma linear, observando que a posição de cada número subsequente pode ser acumulada como
ou seja, comece do centro e mova 1 para a direita, 1 para cima, 2 para a esquerda, 2 para baixo, 3 para a direita, 3 para cima, ...
Resultado:
fonte
Javascript,
516363304276243240 bytesMinha solução não cria uma matriz densa com a espiral, mas retorna o índice que corresponde ao número especificado na matriz de Ulam da ordem dada. Então, ele percorre os números entre 2 e M * M e cria uma matriz de números primos com o idx fornecido pelo fn ulamIdx
Minified se parece com isso:
Para a entrada 15, a saída é:
,,,,,,,,,,,,,,,, 197 ,,,, 193,, 191 ,,,,,,,,,,,,,,, 139, 137 , 199,, 101 ,,,, 97 ,,,,,,,, 181 ,,,,,,, 61, 59 ,,,, 131 ,, 103, 103, 37 ,,,,,, 31, 89, 179, 149, 67, 17 ,,,, 13 ,,,,,,,,,,, 5, 3, 29, ,,, 151 , 19 ,,, 2,11,, 53,, 127 ,,, 107, 41,, 7 ,,,,,,,,,,, 71 ,,,, 23 ,,,,,,, 109, 43, 47, 83, 173, 73, 79, 79, 79, 113, 113 ,,,,,, 113 ,,,,,,, ,,,,, 157 ,,,,,, 163 ,,,, 167 ,,,, 211 ,,,,,,,,,,,, 223
fonte