N-е число Грифона


26

Днями я придумав серію номерів і вирішив перевірити, що це за номер OEIS. На мій подив, ця послідовність виявилася не в базі даних OEIS, тому я вирішив назвати послідовність після себе (зауважте, хтось інший, який набагато розумніший за мене, напевно, вже придумав це, і якщо хтось знайде фактична назва цієї послідовності, будь ласка, прокоментуйте, і я зміню назву питання). Оскільки я не міг ніде знайти послідовності, я вирішив назвати його після себе, звідси "Числа Грифона". EDIT: Завдяки @Surb за те, що він звернув до мене увагу на те, що ця послідовність дорівнює OEIS-послідовності A053696 - 1.

Число Грифона - це число форми , де обидва і - цілі числа, більші або рівні два, а послідовність Грифона - це набір усіх чисел Грифона в зростанні замовлення. Якщо існує кілька способів утворення числа Грифона (перший приклад - 30 , що є і 2 + 2 ^ 2 + 2 ^ 3 + 2 ^ 4, і 5 + 5 ^ 2 ), число підраховується лише один раз у послідовності. Перші кілька грифонових чисел: 6, 12, 14, 20, 30, 39, 42, 56, 62, 72 .а+а2+...+ахах302+22+23+245+526,12,14,20,30,39,42,56,62,72

Ваше завдання:

Напишіть програму або функцію, яка отримує ціле число н як вхід і виводить н е число грифона.

Вхід:

Ціле число від 0 до 10000 (включно). Ви можете трактувати послідовність як 0-індексованою, так і 1-індексованою, залежно від того, що вам зручніше. Будь ласка, вкажіть, яку систему індексації ви використовуєте у своїй відповіді, щоб уникнути плутанини.

Вихід:

Число Грифона, що відповідає входу.

Випробування:

Зверніть увагу, що це передбачає, що послідовність є 0-індексованою. Якщо ваша програма передбачає 1-індексовану послідовність, не забудьте збільшити всі вхідні номери.

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

Оцінка:

Це , тому найнижча оцінка в байтах виграє.


6
Послідовність Грифон - A053696 - 1. Іншими словами, A053696 - це зростаюча послідовність чисел форми . а0+а1++ах
Surb

2
@Surb ах, тому я не міг його знайти. У такому випадку я вкладу цю інформацію в редагування, але залиште все питання таким, яким воно є, оскільки краща назва послідовності не здається.
Грифон - Відновіть Моніку

Відповіді:


15

Желе , 9 байт

bṖ’ḅi-µ#Ṫ

Повна програма, яка читає (1-індексоване) ціле число з STDIN і друкує результат.

Спробуйте в Інтернеті!

Як?

Число Грифона - це число, яке може бути вираженим у базі, меншій від самого себе, таким, що всі цифри є одними, крім найменш значущих, що дорівнює нулю. Наприклад:

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

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

Ця програма бере n, потім запускає v=0і тестує цю властивість і прирости, vпоки не знайде nтакі числа, а потім виводить остаточне.

Для перевірки базового bчисла він віднімає по одній з кожної цифри, перетворює з базової v, а потім перевіряє, чи є результат -1 . (Зверніть увагу, що bменше 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 байт

:Qtt!^Ys+uSG)

1-основа.

Спробуйте в Інтернеті!

Пояснення

Розглянемо вклад n = 3як приклад.

:    % 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

Матриця, отримана на етапі (*), містить, можливо, повторювані числа Грифона. Зокрема, він містить nвиразні номери грифона в першому ряду. Це не обов'язково nнайменші грифонові числа. Однак нижній лівий запис 2+2^+···+2^n перевищує верхній правий запис n+n^2, і тому всі числа в останньому рядку перевищують цифри в першому рядку. Це означає, що розширення матриці вправо або вниз не сприяло б будь-якому номеру Грифона, нижчому за найменші nчисла в матриці. Таким чином, матриця гарантовано містить nнайменші номери грифона. Отже, її nнайнижчим унікальним елементом є рішення.


1
Що за чорт, це дивовижно!
IQuick 143,

8

Haskell , 53 байти

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

Спробуйте в Інтернеті!

Число н - Грифон, якщо існують цілі числа і такі, що .а2х2н=i=1хаi

Ми генеруємо нескінченний список всіх таким чином, що пошук грубої сили показує, що це так.н6

Відповідь - функція індексу (нульова індексація) цього списку, позначена в Haskell як (list!!).

Чому це a^y+n==n*a+aправильно?

З формули підсумовування геометричної прогресії :

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

ми маємо, пускаючи :(α,ρ,ν)=(а,а,х)

н=i=1хаi=а(1-ах)1-а=а-ах+11-а.

Переставляючи рівняння, отримуємо н(1-а)=а-ах+1 .

Перестановка , що ще далі, ми отримаємо х + 1 + п = п + .ах+1+н=на+а

Заміна у пошуку грубої сили дає остаточний вираз .у=х+1a^y+n=n*a+a

Шукаєте, поки nдостатньо?

  • Якщо (іншими словами, ), то що доводить . Тому немає сенсу перевіряти будь-яке значення .а>нан+1

    ау+н>а2(н+1)а=на+а
    ау+нна+аа>н

  • у>н

    ау+н>ан=ан-1а2н-1а>(н+1)а=на+а,
    ау+нна+а

    2n1>n+1n6


7

Python 3.8 (попередній випуск) , 98 92 89 78 71 байт

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

Спробуйте в Інтернеті!

0-індексований. Тут слід використовувати ціле поділ, оскільки плавці f (10000) плавають.

2ан+22хн+2н

-6 байт завдяки Джонатану Аллану

-3 байти завдяки ArBo. Я майже робив так, як він запропонував, але спробував використати те, {*(...)}що все одно не економило місце

-11 байт завдяки математиці

-7 байт завдяки ArBo

Математичне підтвердження достовірності

Використовуючи 0-індексацію заради цього доказу, навіть незважаючи на те, що математична умова є 1-індексованою.

  • Гнн
  • г(а,х)=а+а2+...+ахах
  • Ан2ан+22хн+2
  • А0={г(2,2)}={6}={Г0}
  • Ан+1={г(а,х),г(а+1,х),г(а,х+1),г(а+1,х+1)|г(а,х)Ан}
  • г(а+1,х)<г(а+1,х+1)ах
  • г(а,х+1)<г(а+1,х+1)ах
  • Гн+1г(а+1,х+1)Гн=г(а,х)
  • г(а+1,х)<г(а+2,х)ах
  • г(а,х+1)<г(а,х+2)ах
  • Гн+1г(а+1,х)г(а,х+1)Гн=г(а,х)
  • Гн+1Ан+1ГнАн
  • Г0А0ГнАнн
  • Г0ГнГннАнАн

f=зайвий, і lambda n,r=range:заощадить ще 4 (на кшталт )
Джонатан Аллан

Ви можете кинути set()та замінити його набір розуміння, щоб дістатися до 89
ArBo

Також ви можете видалити посилання f=з TIO, додавши його до заголовка, як у TIO мого 89-байтового
ArBo

86 байт з Python 3.8 та виразами присвоєння
ovs

У рядку "Тому Gn + 1 ≠ (a + 1, x + 1), якщо Gn = g (a, x)" є помилкою, вона повинна бути Gn + 1 ≠ g (a + 1, x + 1), якщо ...
IQuick 143,

5

J , 35 32 байти

-3 байти завдяки FrownyFrog

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

Спробуйте в Інтернеті!

Пояснення таке ж, як оригінал. Просто використовує явну форму для збереження байтів, видаляючи кілька @.

оригінальна відповідь, негласна, з поясненням: 35 байт

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

Спробуйте в Інтернеті!

Аналогічно підходу Луїса Мендо, ми створюємо "таблицю потужності" (як таблицю часу) з верхнього рядка 2 3 ... nта лівого стовпця, в 1 2 ... nрезультаті чого:

 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

^~/ >:створює таблицю і 1+i.@+&2створює 1... nпослідовності, і ми додаємо 2 ( +&2) до вводу, щоб гарантувати, що у нас завжди достатньо елементів для створення таблиці навіть для 0 або 1 входів.

Після того, як у нас з’явиться таблиця над рішенням, це тривіально. Ми просто скануємо суму рядків +/\, а потім видаляємо перший рядок, вирівнюємо, беремо унікальний і сортуємо /:~@~.@,@}.. Нарешті, {використовує оригінальний вхід, щоб індексувати цей результат, виробляючи відповідь.


явна нотація зберігає 3
FrownyFrog

дякую, приємний улов.
Іона


3

R , 65 62 байти

-1 байт завдяки Джузеппе.

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

Спробуйте в Інтернеті!

1-індексований.

аiх=1

Зауважте, що sort(unique(...))це не спрацювало, як uniqueдало б унікальні рядки матриці, а не унікальні записи. Використання unique(sort(...))робіт, оскільки sortперетворюється у векторний.


Це займе трохи більше роботи, але використовуючи tі diffinvстановить 64 байти
Джузеппе

1
@Giuseppe Дякую! Я не знав diffinv. Я покатав ще 2 байти, замінивши [-1:-2,]на [3:n,].
Робін Райдер



1

Вугілля деревне , 36 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. 1-індексований. Використовує алгоритм Луїса Мендо. Пояснення:

Nθ

н

FθFθ⊞υ

нн

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

1хаi=ах+1-аа-1

F⊖θ≔Φυ›κ⌊υυ

н-1

I⌊υ

Роздрукуйте найменший залишився номер грифона.


1

Japt , 23 байти

Шановний Джебус! Або я справді забув, як грати в гольф, або випивка нарешті приймає свою справу!

Не прямий порт рішення Джонатана, але дуже натхненний його спостереженням.

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

Спробуй це


1

05AB1E , 12 байт

L¦ãε`LmO}êIè

0-індексований

н

Пояснення:

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.