Os números quadrados são aqueles que assumem a forma de n^2
onde n é um número inteiro. Estes também são chamados quadrados perfeitos, porque quando você pega a raiz quadrada deles, obtém um número inteiro.
Os 10 primeiros números quadrados são: ( OEIS )
0, 1, 4, 9, 16, 25, 36, 49, 64, 81
Números triangulares são números que podem formar um triângulo equilátero. O n-ésimo número do triângulo é igual à soma de todos os números naturais de 1 a n.
Os 10 primeiros números triangulares são: ( OEIS )
0, 1, 3, 6, 10, 15, 21, 28, 36, 45
Números triangulares quadrados são números quadrados e triangulares.
Os primeiros 10 números triangulares quadrados são: ( OEIS )
0, 1, 36, 1225, 41616, 1413721, 48024900, 1631432881, 55420693056, 1882672131025, 63955431761796
Há um número infinito de números quadrados, números triangulares e números triangulares quadrados.
Escreva um programa ou função nomeada que forneça um número de entrada (parâmetro ou stdin) n
, calcule o n
número triangular quadrado th e o produz / retorna, onde n é um número diferente de zero positivo. (Para n = 1, retorne 0)
Para que o programa / função seja um envio válido, ele deve poder retornar pelo menos todos os números de triângulos quadrados menores que 2 ^ 31-1.
Bônus
-4 bytes por poder gerar todos os números triangulares quadrados menores que 2 ^ 63-1
-4 bytes por poder, teoricamente, produzir números triangulares quadrados de qualquer tamanho.
Penalidade de +8 bytes para soluções que levam tempo não polinomial.
Pilha de bônus.
Esse é o desafio do código-golfe, portanto, a resposta com o menor número de bytes vence.
n
etapas, e em cada etapa a aritmética leva tempo linear, porque o número de dígitos cresce linearmenten
. Não acho que o tempo linear seja possível. A menos que você esteja dizendo que operações aritméticas são tempo constante?Respostas:
CJam,
128 bytesFaz uso da relação de recorrência do artigo da Wikipedia.
O código tem 16 bytes e se qualifica para os dois bônus.
Experimente on-line no intérprete CJam .
Como funciona
Meu código acabou sendo idêntico ao xnor em sempre em todos os aspectos, exceto pelo uso da pilha de CJam em vez de variáveis.
fonte
Python 2, 45 - 4-4 = 37
Repete usando a recorrência
Em teoria, isso suporta números de qualquer tamanho, mas é executado em tempo exponencial, portanto, não deve se qualificar para os bônus. Deve funcionar para números de qualquer tamanho. Por exemplo, para 100, dá
Uma solução recursiva usa 41 caracteres, mas não deve se qualificar porque leva tempo exponencial.
fonte
exec
solução. Se você puder alterar o limite de recursão, também poderá calcular um número de triângulo quadrado de qualquer tamanho, qualificando-o para o # 2. No entanto, não tenho certeza se isso se qualifica (@Rodolvertice).Pitão, 16-4-4 = 8 bytes
Usa a fórmula recursiva do artigo OEIS.
Ele usa o comando pós-atribuição, que é bastante novo e parece muito legal. Os usos reduzem aos
n-1
tempos de iteração devido à indexação baseada em 1.Parece ser polinomial, porque faz um loop n vezes e faz matemática e atribuição a cada iteração, mas eu não sou um cientista da computação. Termina n = 10000 quase instantaneamente.
Experimente aqui online .
fonte
b
.Oásis , 7 - 4 - 4 = -1 (Não competindo)
Experimente online!
Usos
a(0) = 0, a(1) = 1; for n >= 2, a(n) = 34 * a(n-1) - a(n-2) + 2
O Oasis suporta números inteiros de precisão arbitrários, portanto deve poder subir para qualquer número, desde que não ocorra excesso de pilha. Deixe-me saber se isso não conta para o bônus devido ao estouro da pilha. Também é possível que esse algoritmo específico não seja polinomial e informe-me se for esse o caso.
Não competir porque o idioma pós-data é um desafio.
Explicação:
Solução alternativa:
Em vez disso, usa
a(n) = 35*(a(n-1)-a(n-2)) + a(n-3)
fonte
For n=1 return 0
, mas isso retorna 1. Isso é corrigível adicionando a opção -O .JavaScript (ES6), 29-4 = 25 bytes
Guardado 5 bytes graças a @IsmaelMiguel !
Eu tive que codificar o 0, 1 e os negativos para evitar recursões infinitas.
Console, eu nomeei a função
f
:EDIT : O JavaScript arredondará os números para 16 (15) dígitos (Spec) porque esses números são muito grandes, causando um estouro. Coloque 714341252076979033 No seu console JavaScript e veja por si mesmo. É mais uma limitação do JavaScript
fonte
f(15)
deve retornar85170343853180456676
, não85170343853180450000
.n=>n?n<2?0:34*f(n-1)-f(n-2)+2:1
(31 bytes). Eu testei até o quinto número.n=>n>1?34*f(n-1)-f(n-2)+2:!!n
. Ele retornafalse
no0
,true
no1
e36
no2
. Se você quiser retornar um número, poderá substituí-lo!!n
por+!!n
.n=>n>1?34*f(n-1)-f(n-2)+2:n|0
(a mesma contagem de bytes, agora retorna sempre números)Excel VBA - 90 bytes
Usando a relação de recorrência da página da Wikipedia:
Quando executado, você é solicitado a n, a sequência até e incluindo n é emitida na coluna A:
Pode ser executado até e incluindo n = 202 antes de gerar um erro de estouro.
fonte
[Não está competindo] Pitão (14 - 4 - 4 = 6 bytes)
Utilizou a primeira recorrência do OEIS , que após 0,1,36 você pode encontrar A n = (A n-1 -1) 2 / A n-2 . R Não competindo porque esta solução começa em 36, se você diminuir, divide por zero (a entrada 0 fornece 36). Também teve que codificar 36.
Experimente aqui
fonte
Java, 53 - 4 = 49 bytes
É outra recursão simples, mas muitas vezes não consigo postar Java com uma pontuação <50, então ...
Agora, para algo não- recursivo, fica um pouco mais longo. Este é mais longo (112-4 = 108) e mais lento, por isso não sei por que o estou postando, exceto por ter algo iterativo:
fonte
Julia, 51 bytes - 4 - 4 = 43
Isso usa a primeira relação de recorrência listada na página da Wikipedia para números triangulares quadrados. Ele calcula n = 1000 em 0,006 segundos, e n = 100,000 em 6,93 segundos. É alguns bytes mais longo que uma solução recursiva, mas é muito mais rápido.
Ungolfed + explicação:
Exemplos:
fonte
PHP,
655956-4 = 52 bytesrepita até que a raiz quadrada de
$s
seja ∈ℤ: adicione$f
à soma$s
, incremente$f
;repetir
$argv[1]
vezes.soma de saída.
fonte
Prolog,
7074 - 4-4 = 66n(100,R)
Saídas em execução :Demora cerca de 1 segundo para executar
n(10000,X)
no meu computador.Edit : A versão 66 é recursiva da cauda. A versão anterior não recursiva da cauda é a seguinte:
Eles têm o mesmo comprimento em bytes, mas o não recursivo de cauda gera estouros de pilha além de um determinado ponto (no meu computador, por volta de 20500).
fonte
Javascript ES6,
777571 caracteresTeste:
fonte
C, 68 bytes
Este foi um desafio divertido com C
main(o,k){o==1?k=0:0;k<9e9&&k>=0&&main(34*o-k+2,o,printf("%d,",k));}
Assista aqui: https://ideone.com/0ulGmM
fonte
Gelatina , 13 - 8 = 5 bytes
Isso se qualifica para os dois bônus.
Experimente online!
Feito ao lado de caird coinheringaahing no chat .
Explicação
fonte
Perl 6 , 25 - 8 = 17 bytes
Experimente online!
fonte
05AB1E , 10 - 8 = 2 bytes
Experimente online!
fonte
APL (NARS), 67 caracteres, 134 bytes
teste:
f pesquisaria em sequência quadrática os elementos que também são números triangulares, portanto eles devem seguir a fórmula de verificação triangular nas APLs: 0 = 1∣√1 + 8 × m com o número m para verificar.
fonte