Introdução (pode ser ignorado)
Colocar todos os números inteiros positivos em sua ordem regular (1, 2, 3, ...) é um pouco chato, não é? Então, aqui está uma série de desafios em torno de permutações (reorganizações) de todos os números inteiros positivos. Este é o sexto desafio desta série (links para o primeiro , segundo , terceiro , quarto e quinto desafio).
Esse desafio tem um tema leve de Páscoa (porque é Páscoa). Eu me inspirei neste ovo de ganso altamente decorado (e na minha opinião pessoal bastante feio).
Isso me lembrou a espiral de Ulam , onde todos os números inteiros positivos são colocados em uma espiral no sentido anti-horário. Essa espiral tem alguns recursos interessantes relacionados aos números primos, mas isso não é relevante para este desafio.
Chegamos à permutação deste desafio de números inteiros positivos se pegarmos os números na espiral de Ulam e rastrearmos todos os números inteiros em uma espiral de rotação no sentido horário , começando em 1. Dessa forma, obtemos:
1, 6, 5, 4, 3, 2, 9, 8, 7, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, etc.
Se você desenhar as duas espirais, obterá uma espécie de malha infinita de espirais (casca de ovo) ( observe a referência da Nova Ordem ali ).
Esta sequência está presente no OEIS sob o número A090861 . Como esse é um desafio de "sequência pura", a tarefa é gerar para um dado como entrada, onde é A090861 .
Tarefa
Dada uma entrada inteira , imprima no formato inteiro, onde é A090861 .
Nota: a indexação baseada em 1 é assumida aqui; você pode usar a indexação baseada em 0; portanto, , etc. Por favor mencione isso na sua resposta se você optar por usá-lo.
Casos de teste
Input | Output
---------------
1 | 1
5 | 3
20 | 10
50 | 72
78 | 76
123 | 155
1234 | 1324
3000 | 2996
9999 | 9903
29890 | 29796
Regras
- Entrada e saída são números inteiros.
- Seu programa deve, no mínimo, suportar entrada no intervalo de 1 a 32767).
- Entrada inválida (0, valores flutuantes, seqüências de caracteres, valores negativos etc.) pode levar a resultados imprevisíveis, erros ou comportamento (não) definido.
- Aplicam- se as regras de E / S padrão .
- As brechas padrão são proibidas.
- Isso é código-golfe , então as respostas mais curtas em bytes ganham
JavaScript (ES7),
46 4541 bytesIndexado a 0.
Experimente online!
Quão?
Isso é baseado na fórmula indexada em 1 usada nos programas de exemplo de A090861 .
Experimente online!
Experimente online!
Experimente online!
Que pode ser traduzido em:
Ao indexá-lo, você economiza 5 bytes imediatamente:
A fórmula pode ser ainda mais simplificada usando:
que pode ser expresso como:
levando a:
e finalmente:
fonte
Wolfram Language (Mathematica) , 60 bytes
Experimente online!
fonte
MATL ,
1211 bytesExperimente online!
Muito ineficiente em memória. Anexar
X^k
torna mais eficiente .fonte
C # (compilador interativo do Visual C #) , 67 bytes
Experimente online!
fonte
Python 3.8,
10474656057 bytesEdit: Obrigado a Johnathan Allan por obtê-lo de 74 a 57 bytes!
Esta solução usa indexação baseada em 0.
fonte
>
no lugar do<=
ex*x
no lugar dex**2
... como assim:def f(n):x=((n-1)**.5+1)//2;return 8*x**2+(-2,6)[n>4*x*x+2*x]*x+2-n
... TIOPython 3.8 (pré-lançamento) , 53 bytes
Uma porta direta da resposta JavaScript de Arnauld , faça voto positivo e / ou a resposta Mathematica de J42161217 e / ou a resposta Python de Kapocsi :)
Indexado a 0.
Experimente online!
fonte
Befunge,
6757 bytesEsta solução assume a indexação baseada em 0 para os valores de entrada.
Experimente online!
Explicação
Começamos calculando o "raio" no qual a entrada n é encontrada com um loop:
No final do loop, o valor anterior de n é o deslocamento na espiral naquele raio:
Podemos então determinar se estamos na seção superior ou inferior da espiral da seguinte maneira:
E quando tivermos todos esses detalhes, o valor espiral será calculado com:
O raio é o único valor que precisamos armazenar como uma "variável", limitando-o a um valor máximo de 127 no Befunge-93, para que esse algoritmo possa manipular entradas de até 65024.
fonte
Japonês , 15 bytes
Solução de porto de geléia de Jonathan. 1 indexado.
Tente
fonte
x+(1-x%2)
estáx|1
(economizando um byte no Jelly), do qual essa resposta também pode se beneficiar, aposto.C ++ (gcc) , 88 bytes
Indexado 1; usa a fórmula na página OEIS, mas manipulada para salvar alguns bytes.
Experimente online!
fonte
sqrt(n-1)/2+.5
vez de(sqrt(n-1)+1)/2