N-ty numer gryfa


26

Pewnego dnia wymyśliłem serię liczb i postanowiłem sprawdzić, jaki to numer OEIS. Ku mojemu zaskoczeniu, sekwencja nie pojawiła się w bazie danych OEIS, więc postanowiłem nazwać tę sekwencję po sobie (zauważ, że ktoś, kto jest o wiele mądrzejszy ode mnie, prawdopodobnie już to wymyślił i jeśli ktoś znajdzie faktyczna nazwa tej sekwencji, proszę o komentarz, a ja zmienię tytuł pytania). Ponieważ nigdzie nie mogłem znaleźć sekwencji, postanowiłem ją nazwać po sobie, stąd „Gryphon Numbers”. EDYCJA: Dzięki @Surb za zwrócenie mojej uwagi na fakt, że ta sekwencja jest równa sekwencji OEIS A053696 - 1.

Numer gryfa szereg postaci a+a2+...+ax , gdzie zarówno a jak i x są liczbami całkowitymi większymi lub równymi dwa, a sekwencja Gryphona jest zbiorem wszystkich liczb Gryphona w porządku rosnącym. Jeśli istnieje wiele sposobów tworzenia liczby Gryfa (pierwszy przykład to 30 , czyli 2+22+23+24 i 5+52 ), liczba jest liczona tylko raz w sekwencji. Pierwsze kilka liczb Gryfa to:6,12,14,20,30,39,42,56,62,72 .

Twoje zadanie:

Napisać program lub funkcji, które otrzymuje się całkowitą na wejściu i na wyjściu z th liczby Gryphon. nn

Wkład:

Liczba całkowita od 0 do 10000 (włącznie). Możesz traktować sekwencję jako indeksowaną 0 lub 1 indeksowaną, w zależności od tego, co wolisz. Proszę podać, jakiego systemu indeksowania używasz w swojej odpowiedzi, aby uniknąć nieporozumień.

Wydajność:

Numer Gryphona odpowiadający wejściu.

Przypadki testowe:

Należy pamiętać, że przy założeniu, że sekwencja ma indeks 0. Jeśli twój program zakłada sekwencję 1-indeksową, nie zapomnij zwiększyć wszystkich liczb wejściowych.

Input:    Output:
0   --->  6
3   --->  20
4   --->  30
10  --->  84
99  --->  4692
9999 -->  87525380

Punktacja:

To jest , więc wygrywa najniższy wynik w bajtach.


6
Sekwencja gryfa to A053696 - 1. Innymi słowy, A053696 to rosnąca sekwencja liczb w postaci . a0+a1++ax
Surb

2
@Surb ah, dlatego nie mogłem go znaleźć. W takim przypadku wstawię te informacje do edycji, ale resztę pytania zachowam tak, jak jest, ponieważ nie wydaje się, aby sekwencja była lepsza.
Gryphon - Przywróć Monikę

Odpowiedzi:


15

Galaretka , 9 bajtów

bṖ’ḅi-µ#Ṫ

Pełny program, który odczytuje liczbę całkowitą (indeksowaną 1) ze STDIN i wypisuje wynik.

Wypróbuj online!

W jaki sposób?

Liczba Gryphona to liczba, która jest wyrażana w bazie mniej niż sama, tak że wszystkie cyfry są jedynymi, z wyjątkiem najmniej znaczących, czyli zerowych. Na przykład:

30=1×24+1×23+1×22+1×21+0×20302=11110

84=1×43+1×42+1×41+0×40844=1110

Ten program pobiera n, a następnie uruchamia o v=0i testuje tę właściwość i zwiększa vją, aż znajdzie ntakie liczby, a następnie wyprowadza ostateczną.

Aby przetestować bnumer bazowy , odejmuje jeden od każdej cyfry, konwertuje z bazy v, a następnie sprawdza, czy wynikiem jest 1 . (Uwaga, że bjest mniejsza niż v)

3020×304+0×303+0×302+0×301+(1)×300=1

8440×843+0×842+0×841+(1)×840=1

bṖ’ḅi-µ#Ṫ - Main Link: no arguments
       #  - set v=0 then count up collecting n=STDIN matches of:
      µ   -  the monadic link -- i.e. f(v):  e.g. v=6
 Ṗ        -    pop (implicit range of v)            [1,2,3,4,5]
b         -    to base (vectorises)                 [[1,1,1,1,1,1],[1,1,0],[2,0],[1,2],[1,1]]
  ’       -    decrement (vectorises)               [[0,0,0,0,0,0],[0,0,-1],[1,-1],[0,1],[0,0]]
   ḅ      -    from base (v) (vectorises)           [0,-1,5,1,0]
     -    -    literal -1                           -1
    i     -    first index of (zero if not found)   2
          - }  e.g. n=11 -> [6,12,14,20,30,39,42,56,62,72,84]
        Ṫ - tail         -> 84
          - implicit print

11

MATL , 16 13 bajtów

:Qtt!^Ys+uSG)

Na podstawie 1.

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe n = 3jako przykład.

:    % Implicit input: n. Range
     % STACK: [1 2 3]
Q    % Add 1, element-wise
     % STACK: [2 3 4]
tt   % Duplicate twice, transpose
     % STACK: [2 3 4], [2 3 4], [2;
                                 3;
                                 4]
^    % Power, element-wise with broadcast
     % STACK: [2 3 4], [ 4   9  16;
                         8  27  64;
                        16  81 256]
Ys   % Cumulative sum of each column
     % STACK: [2 3 4], [ 4    9  16;
                         12  36  80;
                         28 117 336]
+    % Add, element-wise with broadcast (*)
     % STACK: [ 6  12  20;
               14  39  84
               30 120 340]
u    % Unique elements. Gives a column vector
     % STACK: [  6;
                14;
                30;
                12;
               ···
               340]
S    % Sort
     % STACK: [  6;
                12
                14;
                20;
               ···
               340]
G)   % Push input again, index. This gets the n-th element. Implicit display
     % STACK: 14

Macierz uzyskana w kroku (*) zawiera prawdopodobnie powtarzające się liczby Gryphona. W szczególności zawiera nwyraźne liczby Gryphon w pierwszym rzędzie. Niekoniecznie są to nnajmniejsze liczby Gryfa. Jednak dolny lewy wpis 2+2^+···+2^n przekracza górny prawy wpis n+n^2, a zatem wszystkie liczby w ostatnim rzędzie przekraczają liczby w pierwszym rzędzie. Oznacza to, że rozszerzenie macierzy w prawo lub w dół nie przyczyni się do uzyskania liczby Gryphonów niższej niż najniższe nliczby w macierzy. Dlatego macierz ma zagwarantowane, że zawiera nnajmniejsze liczby Gryphona. W rezultacie rozwiązaniem jest jego nnajniższy unikalny element.


1
Co do diabła, to jest niesamowite!
IQuick 143

8

Haskell , 53 bajty

([n|n<-[6..],or[a^y+n==n*a+a|a<-[2..n],y<-[3..n]]]!!)

Wypróbuj online!

Liczba n to Gryphon, jeśli istnieją liczby całkowite a2 i x2 takie, że n=i=1xai .

Generujemy nieskończoną listę wszystkich n6 tak że wyszukiwanie metodą brutalnej siły pokazuje, że tak jest.

Odpowiedzią jest funkcja indeksu (indeksowana od zera) na tę listę, oznaczona w Haskell jako (list!!).

Dlaczego jest a^y+n==n*a+apoprawny?

Ze wzoru na sumowanie postępu geometrycznego :

i=1ναρi1=α(1ρν)1ρ

(α,ρ,ν)=(a,a,x)

n=i=1xai=a(1ax)1a=aax+11a.

n(1a)=aax+1

ax+1+n=na+a

y=x+1a^y+n=n*a+a

Czy szukanie jest nwystarczające?

  • Jeśli a>nan+1

    ay+n>a2(n+1)a=na+a
    ay+nna+aa>n

  • Podobnie: Jeśli y>n , a następnie Y +

    ay+n>an=an1a2n1a>(n+1)a=na+a,
    ay+nna+a

    2n1>n+1n6


7

Python 3.8 (wersja wstępna) , 98 92 89 78 71 bajtów

lambda n:sorted({a*~-a**x//~-a for a in(r:=range(2,n+3))for x in r})[n]

Wypróbuj online!

0-indeksowane. Należy tu zastosować dzielenie liczb całkowitych, ponieważ f (10000) przelewa się.

2an+22xn+2n

-6 bajtów dzięki Jonathanowi Allanowi

-3 bajty dzięki ArBo. Prawie zrobiłem, jak sam sugerował, ale próbowałem użyć, {*(...)}co i tak nie oszczędzało miejsca

-11 bajtów dzięki Mathmandan

-7 bajtów dzięki ArBo

Matematyczny dowód ważności

Wykorzystanie indeksowania 0 dla tego dowodu, mimo że konwencja matematyczna ma indeks 1.

  • Gnn
  • g(a,x)=a+a2+...+axax
  • An2an+22xn+2
  • A0={g(2,2)}={6}={G0}
  • An+1={g(a,x),g(a+1,x),g(a,x+1),g(a+1,x+1)|g(a,x)An}
  • g(a+1,x)<g(a+1,x+1)ax
  • g(a,x+1)<g(a+1,x+1)ax
  • Gn+1g(a+1,x+1)Gn=g(a,x)
  • g(a+1,x)<g(a+2,x)ax
  • g(a,x+1)<g(a,x+2)ax
  • W związku z tym Gn+1g(a+1,x)g(a,x+1)Gn=g(a,x)
  • Gn+1An+1GnAn
  • G0A0GnAnn
  • G0GnGnnAnAn

f=jest niepotrzebne i lambda n,r=range:pozwoli zaoszczędzić jeszcze 4 ( tak )
Jonathan Allan

Możesz upuścić set()i zastąpić go kompletnym zrozumieniem, aby dostać się do 89
ArBo

Możesz również usunąć f=link z linku TIO, umieszczając go w nagłówku, tak jak w TIO mojego 89-bajtowego
ArBo

86 bajtów Pythona 3,8 i wyrażenia przypisania
ovs

W wierszu „Dlatego Gn + 1 ≠ (a + 1, x + 1), jeśli Gn = g (a, x)” jest błędem, powinno być to Gn + 1 ≠ g (a + 1, x + 1), jeśli ...
IQuick 143

5

J , 35 32 bajtów

-3 bajty dzięki FrownyFrog

3 :'y{/:~~.,}.+/\(^~/>:)1+i.y+2'

Wypróbuj online!

Wyjaśnienie jest takie samo jak oryginału. Wystarczy użyć jawnej formy, aby zaoszczędzić bajty, usuwając wielokrotność @.

oryginalna odpowiedź, milcząca, z wyjaśnieniem: 35 bajtów

{[:/:~@~.@,@}.[:+/\@(^~/>:)1+i.@+&2

Wypróbuj online!

Podobnie do podejścia Luisa Mendo, tworzymy „tabelę mocy” (jak tabelę czasu) z górnym rzędem 2 3 ... ni lewą kolumną, w 1 2 ... nwyniku czego:

 2   3    4     5     6      7
 4   9   16    25    36     49
 8  27   64   125   216    343
16  81  256   625  1296   2401
32 243 1024  3125  7776  16807
64 729 4096 15625 46656 117649

^~/ >:tworzy tabelę i 1+i.@+&2tworzy 1... nsekwencje, i dodajemy 2 ( +&2) do danych wejściowych, aby upewnić się, że zawsze mamy wystarczającą liczbę elementów, aby utworzyć tabelę nawet dla danych wejściowych 0 lub 1.

Po powyższej tabeli rozwiązanie jest banalne. Po prostu skanujemy sumowanie wierszy +/\, a następnie usuwamy pierwszy wiersz, spłaszczamy, wybieramy unikatowe i sortujemy /:~@~.@,@}.. Na koniec {wykorzystuje oryginalne dane wejściowe do indeksowania tego wyniku, tworząc odpowiedź.


wyraźna notacja zapisuje 3
FrownyFrog

dziękuję, niezły chwyt.
Jonasz


3

R , 65 62 bajtów

-1 bajt dzięki Giuseppe.

n=scan();unique(sort(diffinv(t(outer(2:n,1:n,"^")))[3:n,]))[n]

Wypróbuj online!

1-indeksowany.

Generuje macierz wszystkich wartości postaci ı bierze skumulowaną sumę, usuwa się z pierwszego rzędu (0s) oraz drugi rząd (pozycje odpowiadające Xaix=1

Zauważ, że sort(unique(...))to nie zadziałałoby, ponieważ uniquedałoby unikalne wiersze macierzy, a nie unikatowe wpisy. Używanie unique(sort(...))działa, ponieważ sortkonwertuje na wektor.


Zajmuje to trochę więcej pracy, ale przy użyciu ti diffinvma 64 bajty
Giuseppe

1
@Giuseppe Thanks! Nie wiedziałem diffinv. Grałem w golfa o kolejne 2 bajty, zastępując [-1:-2,]je [3:n,].
Robin Ryder

2

JavaScript (ES7), 76 bajtów

1-indeksowany.

f=(n,a=[i=2])=>(n-=a.some(j=>a.some(k=>(s+=j**k)==i,s=j)))?f(n,[...a,++i]):i

Wypróbuj online!


JavaScript (ES7), 89 bajtów

1-indeksowany.

n=>eval('for(a=[i=1e4];--i>1;)for(s=1e8+i,x=1;a[s+=i**++x]=x<26;);Object.keys(a)[n]-1e8')

Wypróbuj online!



1

Węgiel drzewny , 36 bajtów

NθFθFθ⊞υ÷⁻X⁺²ι⁺³κ⁺²ι⊕ιF⊖θ≔Φυ›κ⌊υυI⌊υ

Wypróbuj online! Link jest do pełnej wersji kodu. 1-indeksowany. Wykorzystuje algorytm Luisa Mendo. Wyjaśnienie:

Nθ

n

FθFθ⊞υ

nn

÷⁻X⁺²ι⁺³κ⁺²ι⊕ι

1xai=ax+1aa1

F⊖θ≔Φυ›κ⌊υυ

n1

I⌊υ

Wydrukuj najniższy pozostały numer Gryphona.


1

Japt , 23 bajty

Drogi Jebusie! Albo ja naprawdę zapomniałem, jak grać w golfa, albo alkohol w końcu zbiera żniwo!

Nie jest to bezpośredni przykład rozwiązania Jonathana, ale bardzo zainspirowany jego obserwacją.

@ÈÇXìZ mÉ ìZÃeÄ}fXÄ}gNÅ

Spróbuj


1

05AB1E , 12 bajtów

L¦ãε`LmO}êIè

0-indeksowane

n

Wyjaśnienie:

L             # Create a list in the range [1, (implicit) input-integer]
              #  i.e. 4 → [1,2,3,4]
 ¦            # Remove the first item to make the range [2, input-integer]
              #  i.e. [1,2,3,4] → [2,3,4]
  ã           # Create each possible pair of this list by using the cartesian product
              #  i.e. [2,3,4] → [[2,2],[2,3],[2,4],[3,2],[3,3],[3,4],[4,2],[4,3],[4,4]]
   ε          # Map each pair to:
    `         #  Push the values of the pair separately to the stack
              #   i.e. [4,3] → 4 and 3
     L        #  Take the list [1, value] for the second value of the two
              #   i.e. 3 → [1,2,3]
      m       #  And then take the first value to the power of each integer in this list
              #   i.e. 4 and [1,2,3] → [4,16,64]
       O      #  After which we sum the list
              #   i.e. [4,16,64] → 84
            # After the map: uniquify and sort the values
              #  i.e. [6,14,30,12,39,120,20,84,340] → [6,12,14,20,30,39,84,120,340]
          Iè  # And index the input-integer into it
              #  i.e. [6,12,14,20,30,39,84,120,340] and 4 → 30
              # (after which the result is output implicitly)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.