Números poligonais!

12

Introdução

Em matemática, um número poligonal é um número representado como pontos ou seixos dispostos na forma de um polígono regular. Os pontos são vistos como alfas (unidades). Estes são um tipo de números figurados bidimensionais.

O número 10, por exemplo, pode ser organizado como um triângulo:

*
**
***
****

Mas 10 não pode ser organizado como um quadrado. O número 9, por outro lado, pode ser:

***
***
***

Alguns números, como 36, podem ser organizados como um quadrado e como um triângulo:

******  *
******  **
******  ***
******  ****
******  *****
******  ******

Por convenção, 1 é o primeiro número poligonal para qualquer número de lados. A regra para ampliar o polígono para o próximo tamanho é estender dois braços adjacentes em um ponto e, em seguida, adicionar os lados extras necessários entre esses pontos. Nos diagramas a seguir, cada camada extra é mostrada em vermelho.

Números triangulares:

Números triangulares

Números quadrados:

Números quadrados

Polígonos com maior número de lados, como pentágonos e hexágonos, também podem ser construídos de acordo com esta regra, embora os pontos não formem mais uma estrutura perfeitamente regular, como acima.

Números pentagonais:

Números pentagonais

Números hexagonais:

Números hexagonais

Fonte: Wikipedia

Sua tarefa

Dado um número inteiro positivo N (1 <= N <= 1000), imprima todo tipo de número poligonal N começando de números triangulares até e incluindo números icosagonais (20-gon).

Por exemplo, o número 10 é um número triangular e um número decagonal; portanto, a saída deve ser algo como (você pode escolher seu próprio formato de saída, mas deve se parecer com isso):

3 10

Casos de teste

1 -> 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 -> (None)
3 -> 3
6 -> 3 6
36 -> 3 4 13

Para referência, o nnúmero k-th -gonal é:

(k-2) (n) (n-1) / 2 + n

Crédito: xnor

Lembre-se, isso é , então o código com o menor número de bytes vence.

Oliver Ni
fonte
Para referência, o número nth k-gonal é (k-2)*n*(n-1)/2 + n.
Xnor
8
O objetivo da sandbox é melhorar as perguntas. Se você postar uma pergunta na sandbox e descobrir que não está claro o que você está perguntando, a resposta correta é não adicionar um comentário na sandbox, aguarde duas horas e, em seguida, poste a pergunta no modo principal não modificado e exclua a pergunta da sandbox , ocultando o comentário explicativo de pessoas com menos de alguns milhares de representantes. A resposta correta é reformular ou pedir sugestões para reformular, e dar mais um ou dois dias para verificar se a pergunta reformulada ainda tem problemas.
Peter Taylor

Respostas:

2

Python 3, 68 bytes

lambda R:[s+2for s in range(1,19)if(s-2+(4+s*(s-4+8*R))**.5)/2%s==0]

Para cada número potencial de lados s+2, resolve a fórmula quadrática R=s*n*(n-1)/2 + nde npara ver se o resultado é um número inteiro.

Comparar (73 bytes):

lambda R:[s+2for s in range(1,19)if R in[n+s*n*~-n/2for n in range(R+1)]]

Uma abordagem alternativa de solução para sfornece 62 bytes no Python 3, mas falha R=1.

lambda R:{(R-n)*2/n/~-n+2for n in range(2,R+1)}&{*range(3,21)}
xnor
fonte
1

JavaScript (ES6), 90 bytes

n=>[...Array(21).keys(n--)].slice(3).filter(i=>(Math.sqrt(i*i+8*i*n-16*n)+i-4)%(i+i-4)==0)

Resolve a equação quadrática. 73 bytes em versões suficientemente novas do Firefox:

n=>[for(i of Array(18).keys())if(((~-i**2+8*n*-~i)**.5+~-i)/2%-~i==0)i+3]
Neil
fonte
1

> <>, 62 + 3 = 65 bytes

&1v
v0<;?)+8a:+1~~<
1.292:{<>+n}ao^
>:&:&=?^:&:&)?^:@:@$-{:}++

Espera a entrada na parte superior da pilha, portanto, +3 bytes para o -vsinalizador.

Esta é minha primeira vez programando em> <>, portanto, posso estar perdendo alguns truques óbvios para reduzir o código.

Explicação:

Inicialização

&1v
v0<
1

Move N para o registrador, empurra o contador para a pilha (começando em 1, que corresponde a números triangulares) e inicia a sequência com os valores 0e 1.

Loop principal

 :&:&=?^:&:&)?^:@:@$-{:}++

Compara a parte superior da pilha com o registro. Se for igual, vá para a rotina de impressão. Se for maior, vá para a rotina de redefinição. Caso contrário, faça a diferença entre os dois principais itens da pilha, adicione o contador e adicione ao item anterior da pilha superior. Isso calcula o próximo número poligonal.

Impressão

 .292:{<>+n}ao^
       ^

Imprime o contador + 2, seguido por uma nova linha, e depois passa para a rotina de redefinição.

Redefinir

v0<;?)+8a:+1~~<
1             ^

Remove os dois principais itens da pilha e incrementa o contador. Encerra o programa se o contador for maior que 18, caso contrário, envia os números iniciais 0e 1para a pilha e retorna ao loop principal.

kyle1320
fonte
1

Gelatina , 22 bytes

18pȷµḢ×’×H+µ€_³¬FT:ȷ+3

Experimente online!

Explicação

18pȷµḢ×’×H+µ€_³¬FT:ȷ+3
18pȷ                   - All possible (k-2,n) pairs
    µ      µ€          - to each pair compute the corresponding polygonal number:
     Ḣ                 -   retrieve k-2
      ×’               -   multiply by n-1
        ×H             -   multiply by half of n
          +            -   add n
             _³        - subtract the input. There will now be 0's at (k-2,n) pairs which produce the input
               ¬FT     - retrieve all indices of 0's. The indices are now (k-2)*1000+n
                  :ȷ   - floor division by 1000, returning k-3
                    +3 - add 3 to get all possible k.
fireflame241
fonte
1

Axioma 203 bytes

 l(x)==(local q,m,a;v:List INT:=[];for i in 3..20 repeat(q:=solve((i-2)*n*(n-1)+2*n-2*x=0,n);if #q>1 then(m:=rhs q.1;a:=rhs q.2;if(m>0 and denom(m)=1)or(a>0 and denom(a)=1)then v:=cons(i,v)));v:=sort v;v)

aqui é menos jogado e rotineiro que mostra números

 l(x)==
  local q,m,a
  v:List INT:=[]
  for i in 3..20 repeat 
     q:=solve((i-2)*n*(n-1)+2*n-2*x=0,n)  -- this would find only rational solutions as r/s with r,s INT
     if #q>1 then -- if exist rational solution and denominator =1=> add to list of result
        m:=rhs q.1;a:=rhs q.2;
        if(m>0 and denom(m)=1)or(a>0 and denom(a)=1)then v:=cons(i,v) 
  v:=sort v
  v

 (2) ->  [[i,l(i)]  for i in 1..45]
    Compiling function l with type PositiveInteger -> List Integer

    (2)
    [[1,[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]], [2,[]], [3,[3]],
     [4,[4]], [5,[5]], [6,[3,6]], [7,[7]], [8,[8]], [9,[4,9]], [10,[3,10]],
     [11,[11]], [12,[5,12]], [13,[13]], [14,[14]], [15,[3,6,15]], [16,[4,16]],
     [17,[17]], [18,[7,18]], [19,[19]], [20,[20]], [21,[3,8]], [22,[5]],
     [23,[]], [24,[9]], [25,[4]], [26,[]], [27,[10]], [28,[3,6]], [29,[]],
     [30,[11]], [31,[]], [32,[]], [33,[12]], [34,[7]], [35,[5]], [36,[3,4,13]],
     [37,[]], [38,[]], [39,[14]], [40,[8]], [41,[]], [42,[15]], [43,[]],
     [44,[]], [45,[3,6,16]]]
                                                           Type: List List Any
RosLuP
fonte
0

AWK , 67 bytes

{for(k=2;++k<21;)for(n=0;++n<=$1;)if((k/2-1)*(n*n-n)+n==$1)print k}

Experimente online!

Tentei resolver o quadrático, mas verificar cada valor para ver se funciona é mais curto (e menos propenso a erros)

Robert Benson
fonte
0

R, 68 bytes

N=scan();m=expand.grid(k=1:18,1:N);n=m$V;m$k[m$k*n*(n-1)/2+n==N]+2

Nde stdin. Calcula os primeiros Nnúmeros k-gonal e obtém konde eles são iguais N, usando a fórmula de xnor; no entanto, salva bytes entre parênteses usando em 1:18vez de 3:20e adicionando 2no final.

expand.gridpor padrão, nomeia as colunas Var1, Var2..., se um nome não for fornecido. $índices por correspondência parcial, portanto m$Vcorresponde à m$Var2,segunda coluna.

versão antiga:

N=scan();m=expand.grid(k=3:20,1:N);n=m$V;m$k[(m$k-2)*n*(n-1)/2+n==N]

Experimente online!

Giuseppe
fonte
0

Pari / GP , 34 bytes

Pari / GP tem um built-in para testar se um número é um número poligonal.

x->[s|s<-[3..20],ispolygonal(x,s)]

Experimente online!

alefalpha
fonte
0

Gelatina , 20 bytes

Eu apenas comecei a escrever um truque eficaz desse desafio (embora abranja todos os k> 1 e não apenas [1,20]) ... então, em vez disso, eu vou responder!

Ṫð’××H+⁸
18pÇċ¥Ðf⁸+2

Um programa completo que imprime uma representação da lista Jelly dos resultados *

Experimente online!

* Nenhum resultado imprime nada;
  um único resultado imprime exatamente esse número;
  vários resultados imprime uma lista separada []e , separada de números

Quão?

Ṫð’××H+⁸ - Link 1, ith (x+2)-gonal number: list [x,i]   e.g. [3,4] (for 4th Pentagonal)
Ṫ        - tail & modify (i.e. yield i & make input [x])     4
 ð       - new dyadic chain, i.e. left = i, right = [x]
  ’      - decrement i                                       3
   ×     - multiply by [x]                                   [9]
     H   - halve [x]                                         [2]
    ×    - multiply                                          [18]
       ⁸ - chain's left argument, i                          4
      +  - add                                               [22]

18pÇċ¥Ðf⁸+2 - Main link: number, n                      e.g. 36
18p         - Cartesian product of range [1,18] with n       [[1,1],[1,2],...,[1,36],[2,1],...,[18,1],[18,2],[18,36]]
            -   (all pairs of [(k-2),i] which could result in the ith k-gonal number being n)
      Ðf    - filter keep if this is truthy:
        ⁸   -   chain's left argument, n                     36
     ¥      -   last two links as a dyad:
   Ç        -     call the last link as a monad (note this removes the tail of each)
    ċ       -     count (this is 1 if the result is [n] and 0 otherwise)
            -                            filter keep result: [[1],[2],[11]]
         +2 - add two                                        [[3],[4],[13]]
            - implicit print ...due to Jelly representation: [3, 4, 13]
Jonathan Allan
fonte