Надрукуйте n-е число Фібоначчі, що містить n-е число Фібоначчі!


22

Виклик

Ви повинні написати програму, яка приймає позитивне ціле число nяк вхідне, і виводить число nФібоначчі (скорочене як Fib # у всьому), яке містить nth Fib # як підзарядку. Для цілей цього виклику послідовність Фібоначчі починається з a 1.

Ось кілька прикладів, які ви можете використовувати як тестові випадки, або як приклади для уточнення проблеми (для останнього, будь ласка, залиште коментар нижче, пояснюючи те, що вам здається незрозумілим).

n=1
Fib#s: 1
       ^1 1st Fib# that contains a 1 (1st Fib#)
Output: 1

n=2
Fib#s: 1, 1
       ^1 ^2 2nd Fib# that contains a 1 (2nd Fib#)
Output: 1

n=3
Fib#s: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233
             ^1              ^2                   ^3 3rd Fib# that contains a 2 (3rd Fib#)
Output: 233

n=4
Output: 233

n=5
Output: 6765

n=6
Output: 28657

n=7
Output: 1304969544928657

n=8
Output: 14472334024676221

n=9
Output: 23416728348467685

n=10
Fib#s: 1, ..., 34, 55, 89, ..., 63245986, 102334155, 165580141, ..., 2880067194370816120, 4660046610375530309
                   ^1                     ^2         ^3                                   ^10 10th Fib# that contains a 55 (10th Fib#)
Output: 4660046610375530309

Як завжди, це , тому перейдіть до мінімальної кількості байтів.

Якщо щось заплутане / незрозуміле, залиште коментар.

(Цей виклик ґрунтується на ще одному викладеному мною виклику: надрукуйте n-й пріоритет, який містить n )


3
Я рекомендую включити n=5тестовий зразок, тому що я просто зробив нерозумну помилку, коли написав чек, який підраховував число кілька разів, якщо в ньому була підрядка більше одного разу. n=5Зловив би це через 55.
Ørjan Johansen

2
@officialaimm Я не думаю, що розумно очікувати дуже високих цифр. Моє рішення працює на TIO до n=25(вихід має 1186 цифр), потім вбивається за n=26(3085 цифр, зібраних на моєму власному ноутбуці). Здається, стрибок у скруті, коли fib(n)отримує ще одну цифру (як можна було б очікувати). Наступний стрибок, 31, має 12990 цифр у кінцевому результаті.
Ørjan Johansen

1
Так. Лол! моє рішення python застрягає для n> 6, оскільки є рекурсивна функція, яка викликається багато разів у циклі. : D
officialaimm

1
@officialaimm О так, експоненціальна вибух - це проблема при визначенні Фібоначчі безпосередньо за допомогою рекурсії. Навіть без цього ви можете скоріше досягти межі рекурсії Python.
Ørjan Johansen

1
@Shaggy: Це те, що я мав на увазі під послідовністю: коли 0 - це число 0-го числа Фібоначчі, то 1 - це перше ("1-е"?) Число Фібоначчі.
ShreevatsaR

Відповіді:


12

Haskell , 85 84 байт

Редагувати:

  • -1 байт: Лайконі скорочений l.
  • Друкарський ( x>=sдля x<=s) в поясненні.

fбере Intі повертає a String.

l=0:scanl(+)1l
m=show<$>l
f n|x<-m!!n=[y|y<-x:m,or[x<=s|s<-scanr(:)""y,x++":">s]]!!n

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

Як це працює

  • l- нескінченний список чисел Фібоначчі, визначений рекурсивно як часткові суми 0:1:l. Починається з того, 0що списки індексуються 0. mце той самий список, перетворений у рядки.
  • В f:
    • nє вхідним номером і xє (рядком) nчислом Фібоначчі.
    • У зовнішньому розумінні списку y- це число Фібоначчі, перевірене на те, чи міститься воно xяк підрядка. Прохідні ys збираються у списку та індексуються разом із остаточним, !!nщоб дати результат. Додатковий xпредваряются тести , щоб зберегти два байта по порівнянні з використанням !!(n-1)в кінці.
    • Для того щоб уникнути підрахунку голосів в yдекілька разів з, випробування кожного yзагорнуті в orі інший список розуміння.
    • У розумінні внутрішнього списку він sповторюється за допомогою суфіксів y.
    • Для того, щоб перевірити , є чи xце префікс s, ми перевіряємо , є чи x<=sй x++":">s. ( ":"дещо довільне, але має бути більшим за будь-яку цифру.)

1
l=0:scanl(+)1lзберігає байт.
Лайконі


4

Python 2 , 99 86 байт

  • Ørjan Johansen Зберег 7 байт: починаючи з b=i=x=-1 a=1та випадаючиx and
  • Ørjan Johansen знову врятував 3 байти: f and n==2доf*(n>2)
  • Феліпе Нарді Батіста врятував 9 байт: a,b=a+b,aскорочення економічного свопу f-=str(x)in str(a), стиснуте(n<2)*f
  • ovs збережено 13 байт: перехід від python 3 до python 2.
f=n=input()
b=i=x=-1
a=1
while(n>2)*f:i+=1;a,b=a+b,a;x=[x,a][i==n];f-=`x`in`a`
print a

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

Пояснення:

f=n=int(input())                 # f is number of required numbers

b=i=x=-1                         # i is index(counter) set at -1
                                 # In Two-sided fibonacci, fib(-1) is 1 
                                 # and b(fib before it) i.e. fib(-2) is -1
                                 # Taking advantage of all -1 values, x is 
                                 # also set to -1 so that the `if str(...`
                                 # portion does not execute until x is set a 
                                 # value(i.e. the nth fibonacci) since there 
                                 # is no way -1 will be found in the number 
                                 # (ALL HAIL to Orjan's Genius Idea of using 
                                 # two-sided fibonacci)      

a=1                              # fib(-1) is 1


while(n>2)*f:                    # no need to perform this loop for n=1 and 
                                 # n=2 and must stop when f is 0

 i+=1                            # increment counter

 b,a=a,a+b                       # this might be very familiar (fibonacci 
                                 # thing ;))                         

 x=[x,a][i==n]                   # If we have found (`i==n`) the nth 
                                 # fibonacci set x to it

 f-=`x`in`a`                     # the number with required substring is 
                                 # found, decrease value of f

print a                          # print required value

Python 3 , 126 120 113 112 110 101 99 байт

f=n=int(input())
b=i=x=-1
a=1
while(n>2)*f:i+=1;a,b=a+b,a;x=[x,a][i==n];f-=str(x)in str(a)
print(a)

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


1
Ви можете позбутися ще від 7 байтів, починаючи з b=i=x=-1 a=1і скидаючи x and . (По суті, починаючи на 3 кроки раніше у двосторонній послідовності Фібоначчі -1, 1, 0, 1, 1, 2, ....)
Ørjan Johansen

1
Ви залишили пробіл наприкінці -1: P
Ørjan Johansen

1
Ерм рум'янець . Також я хочу позбутися від `і n> 2`, але, здається, n==2справді потрібне спеціальне лікування. Але це можна скоротити до *(n>2).
Ørjan Johansen

1
переграли його до 88 байт , деякі зміни виключно для python 2. Але решта також буде працювати в python 3
Феліпе Нарді Батіста

1
для python 3 ви можете ще пограти в 9 байт: ось
Феліпе Нарді Батіста

4

Java, 118 111 байт

i->{long n=i,p=0,q,c=1;for(;--n>0;p=c,c+=q)q=p;for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;return p;}

Я думаю, що не можна дублювати біт Фібоначчі, але всі мої зусилля якимось чином призводять до збільшення байтів.

Завдяки Кевіну за вдосконалення ... здогадуйтесь, це показує, що це була моя перша спроба в гольфі :)


2
Знімки заборонені. Ви повинні перетворити це на лямбда так: i->{long n=i,p=0,q,c=1;while(--n>0){q=p;p=c;c+=q;}n=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}return p;}(118 байт)
Okx

1
Ласкаво просимо до PPCG! Після того, як ви змінили його на лямбда, як вказував @Okx, мушу сказати, що це вражаюча відповідь. Я спробував зробити цей виклик близько години тому, безпосередньо перед обідом, і здався. Тож +1 від мене. Деякі дрібниці для гольфу: while(--n>0){q=p;p=c;c+=q;}можуть бути for(;--n>0;p=c,c+=q)q=p;і n=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}можуть бути for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;. (Загалом: i->{long n=i,p=0,q,c=1;for(;--n>0;p=c,c+=q)q=p;for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;return p;}( 111 байт )
Кевін Круїйсен

2

Perl 6 , 45 байт

{my@f=0,1,*+*...*;@f.grep(/$(@f[$_])/)[$_-1]}

$_є аргументом функції; @f- послідовність Фібоначчі, ліниво породжена.


2

JavaScript (ES6), 96 93 92 90 86 байт

0-індексований, при цьому число 0 у послідовності 1. Лайно в 14.

f=(n,x=1,y=1)=>n?f(n-1,y,x+y):x+""
g=(n,x=y=0)=>x>n?f(y-1):g(n,x+!!f(y++).match(f(n)))

Спробуй це

f=(n,x=1,y=1)=>n?f(n-1,y,x+y):x+""
g=(n,x=y=0)=>x>n?f(y-1):g(n,x+!!f(y++).match(f(n)))
oninput=_=>o.innerText=(v=+i.value)<14?`f(${v}) = ${f(v)}\ng(${v}) = `+g(v):"Does not compute!"
o.innerText=`f(0) = ${f(i.value=0)}\ng(0) = `+g(0)
<input id=i min=0 type=number><pre id=o>


Пояснення

Оновлена ​​версія, яку слід підписати, коли я отримаю хвилину.

f=...                   :Just the standard, recursive JS function for generating the nth Fibonacci number
g=(...)=>               :Recursive function with the following parameters.
n                       :  The input integer.
x=0                     :  Used to count the number of matches we've found.
y=0                     :  Incremented on each pass and used to generate the yth Fibonacci number.
x>n?                    :If the count of matches is greater than the input then
f(y-1)                  :    Output the y-1th Fibonacci number.
:                       :Else
g(...)                  :    Call the function again, with the following arguments.
n                       :      The input integer.
x+                      :      The total number of matches so far incremented by the result of...
RegExp(f(n)).test(f(y)) :        A RegEx test checking if the yth Fibonacci number, cast to a string, contains the nth Fibonacci number.
                        :        (returns true or false which are cast to 1 and 0 by the addition operator)
y+1                     :      The loop counter incremented by 1

Здається, ваша відповідь дає різні результати від прикладів.
ericw31415

@ ericw31415, це тому, що він 0-індексований.
Кудлатий

Я спеціально написав це, хоча: "Для цілей цього виклику послідовність Фібоначчі починається з 1."
ericw31415

@ ericw31415: І моя послідовність починається з 1, вона просто 0-індексована; числа 0 і 1 у послідовності дорівнюють 1, 2-е - 2, 3-е - 3, 4-е - 5, 5-е - 8, тощо.
Кудлатий



1

Математика, 85 байт

(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&

вхід

[10]

-4 байти від @JungHwan Min

вихід

4660046610375530309


2
Виглядає дивно, але f@i@n++цілком справедливо, зменшуючи 1 байт. Використання Forзамість Whileзменшує 3 байти. 85 байт:(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&
JungHwan Min


1

R, 77 72 байти

F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)

Це використовує gmpбібліотеку для числа Фібоначчі. Досить відверта реалізація питання.

F=gmp::fibnum;          # Alias Fibonacci function to F
i=0;                    # intitalise counter
d=n=scan();             # get n assign to d as well
while(n)               # loop while n
  if(grepl(F(d),F(i<-i+1)))  # use grepl to determine if Fib of input is in Fib# and increment i
     n=n-1;             # decrement n
F(i)                  # output result

Деякі тести

> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 2
2: 
Read 1 item
Big Integer ('bigz') :
[1] 1
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 3
2: 
Read 1 item
Big Integer ('bigz') :
[1] 233
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 10
2: 
Read 1 item
Big Integer ('bigz') :
[1] 4660046610375530309
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 15
2: 
Read 1 item
Big Integer ('bigz') :
[1] 1387277127804783827114186103186246392258450358171783690079918032136025225954602593712568353

0

Clojure, 99 байт

(def s(lazy-cat[0 1](map +(rest s)s)))#(nth(filter(fn[i](.contains(str i)(str(nth s %))))s)(dec %))

Основне рішення, використовує нескінченну послідовність чисел Фібоначчі s.


0

C #, 35 байт

int u=1,b=1;for(;b<n;){b+=u;u=b-u;}

Спробуй це

int n=int.Parse(t2.Text);int u=1,b=1;for(;b<n;){b+=u;u=b-u;t.Text+=b.ToString()+" ";}if(b==n){t.Text+="true";}

1
Ласкаво просимо на програмування Puzzle та Code-Golf. Відповіді мають бути або повною програмою, або функцією, тоді як ви лише надали фрагмент. Зокрема, ви припускаєте, що вхід є, nі ви просто ставите висновок b(я думаю). Ви можете це записати nяк аргументи і повернення b... Також я впевнений, що ви не обчислюєте те, що вимагає проблем. Насправді я поняття не маю, що ти обчислюєш. Чи можете ви надати, будь ласка, використання якогось коду, який ми можемо запустити для підтвердження вашого рішення? (ваш "Спробуйте" не можна запустити так, як є.)
Дада,

0

NewStack , 14 байт

N∞ ḟᵢfi 'fif Ṗf⁻

Розбивка:

N∞              Add all natural numbers to the stack
   ḟᵢ           Define new function will value of input
     fi          Get the n'th Fibonacci number for ever element n
       'fif      Remove all elements that don't contain the (input)'th Fibonacci number 
           Ṗf⁻  Print the (input-1)'th element

Англійською: (з прикладом 3)

N∞: Складіть список натуральних чисел [1,2,3,4,5,6...]

ḟᵢ: Збережіть вхід у змінній f [1,2,3,4,5,6...]

: Перетворіть список у числа Фібоначчі [1,1,2,3,5,8...]

'fif: Зберігайте всі елементи, що містять fчисло число Фібоначчі[2,21,233...]

Ṗf⁻: Роздрукувати цей f-1елемент (-1 за рахунок 0-індексування)233


Здається, що GitHub містить лише прочитане та підручник. Згадана імплементація, але вона не пов'язана. Хоча PPCG тепер дозволяє мови, новіші, ніж виклик, я вважаю, що нам все-таки потрібна загальнодоступна реалізація.
Ørjan Johansen

@ ØrjanJohansen, Аха дякую, що нагадали. Я забув це завантажити! Це стане за хвилину.
Гравітон

Схоже, ваша реалізація використовує UTF-8, і в цьому випадку це фактично 28 байт (не заважайте налаштуванню Haskell, я використовую лише TIO для підрахунку байтів). Такі мови, як Jelly тощо, мають власні кодові сторінки з цієї причини.
Ørjan Johansen

@ ØrjanJohansen Touché, я працюю над розповсюдженням таблиці для власного кодування, як ми говоримо.
Гравітон

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