Nós tivemos um par de desafios sobre a espiral Ulam. Mas isso não basta.
Neste desafio, traçaremos uma espiral Ulam triangular (em oposição à espiral Ulam quadrada usual). Aqui está um esboço de como é a espiral.
Como sabemos, a espiral de Ulam organiza todos os números naturais em uma espiral externa e marca apenas aqueles que são primos. Portanto, no esboço acima, apenas os números que aparecem em preto (os números primos) seriam mostrados.
O desafio
Aceite um número N como entrada e exiba a espiral triangular Ulam até esse número.
- A entrada pode ser stdin ou argumento de função.
- A espiral deve girar na direção positiva (ou seja, no sentido anti-horário), como na figura acima.
- Qualquer uma das curvas de 120 graus da figura acima seria válida e a curva pode ser diferente para diferentes entradas. Mas o lado mais baixo dos triângulos implícitos deve ser horizontal, pois as únicas curvas permitidas são (múltiplos de) 120 graus.
- O código deve ser executado teoricamente (com tempo e memória suficientes) para qualquer N até o permitido por qualquer cálculo intermediário que você faça com o tipo de dados padrão.
double
basta; não há necessidade de tipos inteiros grandes. - Todas as funções internas são permitidas.
- Não aceitarei minha própria resposta (não que eu ache que seria a mais curta de qualquer maneira ...).
Formatos de saída
Escolha uma das seguintes opções.
Exiba um gráfico com um marcador (ponto, círculo, cruz, o que você preferir) em números primos e nada em números não primos. A escala não precisa ser a mesma para os dois eixos. Ou seja, os triângulos implícitos não precisam ser equilaterais. Eixos, linhas de grade e rótulos de eixo são opcionais. Apenas os marcadores nos números primos são necessários.
Um exemplo de saída para N = 12 seria o seguinte (compare com o esboço acima). O segundo gráfico é um exemplo mais interessante, correspondendo a N = 10000.
- Produza um arquivo de imagem com o descrito acima, em qualquer formato de imagem conhecido (como png, tiff, bmp).
Exiba a espiral como arte ASCII , usando um único caractere de sua escolha para números primos e espaço em branco para não números primos, com um espaço em branco para separar as posições numéricas na mesma linha. Espaços iniciais ou finais ou novas linhas são permitidos. Por exemplo, o caso N = 12 usando
o
como caractere seriao · · · o · o · · · o · o
onde é claro que apenas a
o
marca nos números primos seria realmente exibida. Os·
números não primos são mostrados aqui apenas para referência.
Critério de vitória
A recompensa real é ver por si mesmo esses incríveis padrões de código, o código mais curto vence.