Выведите n-е число Фибоначчи, содержащее n-е число Фибоначчи!


22

Вызов

Вы должны написать программу, которая принимает положительное целое число в nкачестве входных данных и выводит число nФибоначчи th (сокращенное на Fib # повсюду), которое содержит nth Fib # в качестве подстроки. Для целей этой задачи последовательность Фибоначчи начинается с 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.
— Орджан Йохансен

2
@officialaimm Не думаю, что стоит ожидать очень больших цифр. Мое решение работает на TIO до n=25(выход имеет 1186 цифр), а затем уничтожается n=26(3085 цифр скомпилировано на моем ноутбуке). Кажется, что скачок в сложности всякий раз, когда fib(n)получает еще одну цифру (как и следовало ожидать). Следующий скачок, 31, имеет 12990 цифр в конечном выводе.
— Орджан Йохансен

1
Да. Смешно! мое решение на python застревает при n> 6, потому что есть рекурсивная функция, которая вызывается много раз в цикле. : D
— officialaimm

1
@officialaimm Да, экспоненциальный взрыв - проблема при определении Фибоначчи напрямую с помощью рекурсии. Даже без этого вы можете достичь предела рекурсии Python довольно скоро.
— Орджан Йохансен

1
@Shaggy: Это то, что я имел в виду под последовательным: когда 0 - это 0-е число Фибоначчи, то 1 - это первое («1-е»?) Число Фибоначчи.
— ShreevatsaR

Ответы:


12

Haskell , 85 84 байта

РЕДАКТИРОВАТЬ:

  • -1 байт: лайкони сокращен l.
  • Опечатка ( x>=sдля x<=s) в объяснении.

fпринимает Intи возвращает 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)в конце.
    • Чтобы избежать подсчета ys несколько раз, тесты каждого из yних обернуты orи понимание другого списка.
    • В понимании внутреннего списка sперебирает суффиксы y.
    • Чтобы проверить, xявляется ли префикс s, мы проверяем, x<=sи x++":">s. ( ":"несколько произвольно, но должно быть больше любой цифры.)

1
l=0:scanl(+)1lсохраняет байт.
— Лайкони


4

Python 2 , 99 86 байт

  • Орьян Йохансен Сохранено 7 байт: начиная с b=i=x=-1 a=1и заканчиваяx and
  • Ørjan Йохансен снова спас 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 байт: переход с питона 3 на питон 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, ....)
— Орджан Йохансен

1
Вы оставили пробел в конце -1: P
— Орджан Йохансен

1
Эмм краснеть . Также я хочу избавиться от `и n> 2`, но, похоже, n==2действительно нуждается в особом подходе. Но это может быть сокращено до *(n>2).
— Орджан Йохансен

1
увеличил его до 88 байт , некоторые изменения относятся только к python 2. но остальные будут работать и в python 3
— Фелипе Нарди Батиста,

1
для питона 3 вы все еще можете
— Фелипе Нарди Батиста,

4

Ява, 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)))
  • 2 6 байт сэкономлено благодаря Арно

Попытайся

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

Mathematica, 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 Мин


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
Добро пожаловать на программирование головоломки и 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...]

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

'fif: Сохранить все элементы, содержащие число fФибоначчи[2,21,233...]

Ṗf⁻: Печать f-1элемента th (-1 из-за индексации на основе 0)233


GitHub, кажется, содержит только readme и учебник. Реализация упоминается, но она не связана. Хотя PPCG теперь позволяет использовать языки, более новые, чем проблема, я считаю, что нам все еще требуется общедоступная реализация.
— Орджан Йохансен

@ ØrjanJohansen, Ахах, спасибо, что напомнили мне. Я забыл загрузить это! Это будет через минуту.
— Гравитон

Кажется, ваша реализация использует UTF-8, в данном случае это фактически 28 байтов (не берите в голову настройку Haskell, я использую только TIO для подсчета байтов). По этой причине такие языки, как Jelly и т. Д., Имеют свои собственные кодовые страницы.
— Орджан Йохансен,

@ ØrjanJohansen Touché, я работаю над распространением таблицы для ее собственной кодировки, как мы говорим.
— Гравитон

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.