Выведите 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...]

: Преобразовать список в числа Фибоначчи [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.