Liczby wielokątne!

12

Wprowadzenie

W matematyce liczba wieloboczna to liczba reprezentowana jako kropki lub otoczaki ułożone w kształt regularnego wielokąta. Kropki są uważane za alf (jednostki). Są to jeden typ dwuwymiarowych liczb figuratywnych.

Na przykład liczba 10 może być ułożona w trójkąt:

*
**
***
****

Ale 10 nie może być ułożone w kwadrat. Z drugiej strony liczba 9 może być:

***
***
***

Niektóre liczby, na przykład 36, można ułożyć zarówno jako kwadrat, jak i trójkąt:

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

Zgodnie z konwencją 1 jest pierwszą liczbą wielokątną dla dowolnej liczby stron. Zasadą powiększania wielokąta do następnego rozmiaru jest przedłużenie dwóch sąsiadujących ramion o jeden punkt, a następnie dodanie wymaganych dodatkowych boków między tymi punktami. Na poniższych schematach każda dodatkowa warstwa jest pokazana na czerwono.

Numery trójkątne:

Trójkątne Liczby

Numery kwadratowe:

Liczby kwadratowe

Wieloboki o większej liczbie boków, takie jak pięciokąty i sześciokąty, mogą być również budowane zgodnie z tą zasadą, chociaż kropki nie będą już tworzyć idealnie regularnej siatki, jak powyżej.

Liczby pięciokątne:

Liczby pięciokątne

Liczby sześciokątne:

Liczby sześciokątne

Źródło: Wikipedia

Twoje zadanie

Biorąc pod uwagę dodatnią liczbę całkowitą N (1 <= N <= 1000), wydrukuj każdy typ liczby wielobocznej N, zaczynając od liczb trójkątnych, aż do liczb icosagonalnych (20-gonowych).

Na przykład liczba 10 jest liczbą trójkątną i liczbą dziesiętną, więc wynik powinien być podobny (możesz wybrać własny format wyjściowy, ale powinien on wyglądać mniej więcej tak):

3 10

Przypadki testowe

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

Dla odniesienia, n-ty k-numeryczny to:

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

Źródło: xnor

Pamiętaj, to jest , więc wygrywa kod z najmniejszą liczbą bajtów.

Oliver Ni
źródło
Dla porównania, nth k-gonal liczba to (k-2)*n*(n-1)/2 + n.
xnor
9
Celem piaskownicy jest poprawa pytań. Jeśli opublikujesz pytanie w piaskownicy i odkryjesz, że nie jest jasne, o co pytasz, poprawną odpowiedzią jest nie dodawanie komentarza w piaskownicy, odczekaj dwie godziny, a następnie opublikuj pytanie w głównej niezmodyfikowanej i usuń pytanie w piaskownicy , ukrywając komentarz wyjaśniający przed osobami z mniej niż kilkoma tysiącami powtórzeń. Prawidłowa odpowiedź to przeformułowanie lub poproś o sugestie dotyczące przeformułowania i daj mu kolejny dzień lub dwa, aby sprawdzić, czy przeformułowane pytanie nadal ma problemy.
Peter Taylor

Odpowiedzi:

2

Python 3, 68 bajtów

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

Dla każdego potencjalnego liczbie boków s+2rozwiązuje kwadratowego wzoru R=s*n*(n-1)/2 + no n, czy wynik jest liczbą całkowitą.

Porównaj (73 bajty):

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

Alternatywne podejście do rozwiązywania sdaje 62 bajty w Pythonie 3, ale kończy się niepowodzeniem R=1.

lambda R:{(R-n)*2/n/~-n+2for n in range(2,R+1)}&{*range(3,21)}
xnor
źródło
1

JavaScript (ES6), 90 bajtów

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

Rozwiązuje równanie kwadratowe. 73 bajty w nowych, wystarczających wersjach Firefoksa:

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

> <>, 62 + 3 = 65 bajtów

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

Oczekuje wejścia na górze stosu, więc +3 bajty dla -vflagi.

To jest mój pierwszy program w> <>, więc może brakuje mi oczywistych sztuczek, aby skrócić kod.

Wyjaśnienie:

Inicjalizacja

&1v
v0<
1

Przenosi N do rejestru, wypycha licznik do stosu (rozpoczynając od 1, co odpowiada liczbom trójkątnym), i rozpoczyna sekwencję od wartości 0i 1.

Główna pętla

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

Porównuje górę stosu z rejestrem. Jeśli jest równy, przejdź do procedury drukowania. Jeśli jest większy, przejdź do procedury resetowania. W przeciwnym razie weź różnicę między dwoma górnymi elementami stosu, dodaj licznik i dodaj do poprzedniego elementu najwyższego stosu. Oblicza to następną liczbę wielokątną.

Wydrukować

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

Drukuje licznik + 2, następnie znak nowej linii, a następnie przechodzi do procedury resetowania.

Resetowanie

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

Usuwa dwa górne elementy stosu i zwiększa licznik. Kończy program, jeśli licznik jest większy niż 18, w przeciwnym razie wypycha numery początkowe 0i 1stos i wraca do głównej pętli.

kyle1320
źródło
1

Galaretka , 22 bajty

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

Wypróbuj online!

Wyjaśnienie

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
źródło
1

Axiom 203 bajty

 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)

tutaj jest mniej golfa i rutyny, które pokazują liczby

 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
źródło
0

AWK , 67 bajtów

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

Wypróbuj online!

Próbowałem rozwiązać równanie kwadratowe, ale sprawdzanie każdej wartości, aby sprawdzić, czy działa, jest krótsze (i mniej podatne na błędy)

Robert Benson
źródło
0

R, 68 66 bajtów

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

Czyta Nze standardowego. Oblicza pierwsze Nk-gonalne liczby i uzyskuje miejsce, w kktórym są one równe N, za pomocą wzoru xnor; jednak zapisuje bajty w nawiasach, używając 1:18zamiast 3:20i dodając 2na końcu.

expand.griddomyślnie nazywa kolumny Var1, Var2..., jeśli nie podano nazwy. $indeksuje przez częściowe dopasowanie, więc m$Vodpowiada m$Var2,drugiej kolumnie.

stara wersja:

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

Wypróbuj online!

Giuseppe
źródło
0

Pari / GP , 34 bajty

Pari / GP ma wbudowane narzędzie do testowania, czy liczba jest liczbą wieloboczną.

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

Wypróbuj online!

alephalpha
źródło
0

Galaretka , 20 bajtów

Właśnie zacząłem pisać skuteczny duplikat tego wyzwania (aczkolwiek obejmujący wszystkie k> 1 nie tylko [1,20]) ... więc zamiast tego odpowiem!

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

Pełny program drukujący wyniki galaretki na liście wyników *

Wypróbuj online!

* Brak wyników niczego nie drukuje;
  pojedynczy wynik drukuje tylko tę liczbę;
  wiele wyników drukuje []zamkniętą, , oddzielną listę liczb

W jaki sposób?

Ṫð’××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
źródło