В числах Фибоначчи


20

Соревнование

Получив целочисленное входное значение, верните первое число Фибоначчи, которое содержит входные данные внутри себя вместе с индексом этого числа Фибоначчи (индексы, начинающиеся с 0 или 1 - до вас, но, пожалуйста, укажите, какой именно в вашем ответе). Например, если ввести 12, программа вернется, так 26: 121393как 12 находится в числе ( 12 1393), и оно находится в индексе 26 чисел Фибоначчи.

Примеры

Учитывая вход:

45

Ваша программа должна вывести:

33: 3524578

Входные данные:

72

Выход:

54: 86267571272

Входные данные:

0

Выход:

0: 0

Входные данные:

144

Выход:

12: 144

счет

Это , поэтому выигрывает самый короткий ответ на каждом языке.


Можем ли мы вместо этого выбрать 1-индексирование?
Мистер Xcoder

1
Не дубликат, но довольно близко к этой проблеме.
Линн

1
Перейдем к математике относительно того, является ли последовательность Фибоначчи нормальной или нет (этот вопрос предполагает, что это так).
AdmBorkBork

1
Нужно ли использовать двоеточие в качестве разделителя? Можем ли мы вывести массив / список?
Лохматый

Ответы:


8

Желе , 10 байт

0ÆḞ©w¥1#;®

Попробуйте онлайн!

Как это устроено

0ÆḞ©w¥1#;®  Main link. Argument: n

0           Set the return value to 0.
       #    Call the second link to the left with arguments k = 0, 1, 2, ... until
      1     one match has been found.
     ¥        Combine the two links to the left into a dyadich chain.
 ÆḞ             Compute the k-th Fibonacci number...
   ©              and copy it to the register.
    w           Yield 1 if n occurs inside the Fibonacci number, 0 otherwise.
         ®  Yield the value stored in the register.
        ;   Concatenate the index and the Fibonacci number.

Ты использовал тот же трюк, что и мой. :)
Эрик Outgolfer

@EriktheOutgolfer Как твои?
Деннис

Не публиковал, но обычно я тоже не использовал D...
Эрик Outgolfer


4

Perl 6 , 30 байт

{first :kv,/$_/,(0,1,*+*...*)}

Попробуйте онлайн!

firstэто функция, которая возвращает первый элемент последовательности, которая проходит тест, и она удобно берет :kvнаречие, которое говорит ей, что нужно вернуть и ключ (индекс), и совпадающее значение.


Предполагая, что вы можете вернуть объект Pair , вы можете использовать :pнаречие вместо :kv.
Брэд Гилберт b2gills

3

Пакет, 104 байта

@set/an=x=0,y=1
:l
@call set t=%%x:%1=%%
@if "%t%"=="%x%" set/an+=1,x+=y,y=x-y&goto l
@echo %n%: %x%

Работает n=0..45из-за ограниченного диапазона целочисленной арифметики Batch. Объяснение: Batch не имеет встроенного теста на совпадение, но у него есть оператор, который может заменять литеральные строки другими литеральными строками, поэтому, например if "%s:l=%"=="%s%", true, если %s%он не пустой, но не содержит l. Затем использование callтрюка для подстановки %1(ввода) в оператор замены, однако callне работает с операторами потока управления, поэтому необходимо промежуточное временное присваивание.



2

Javascript ES6, 68 символов

n=>eval('for(q=x=0,y=1;!`${x}`.match(n);++q)[x,y]=[y,x+y];q+": "+x')

Тестовое задание:

f=n=>eval('for(q=x=0,y=1;!`${x}`.match(n);++q)[x,y]=[y,x+y];q+": "+x')
console.log([45,72,0,144].map(f).join`
`)


2

Python 3, 76 байт

f=lambda n,l=[1,0]:str(n)in str(l[1])and(len(l)-2,l[1])or f(n,[l[0]+l[1]]+l)


1

Дьялог АПЛ, 39 байт

{⍺←0⋄∨/(⍕⍵)⍷⍕x←1∧+∘÷/0,⍺/1:⍺,x⋄(1+⍺)∇⍵}

Использование хвостовой рекурсии. Не пытайтесь 72, это сломает вашу машину, потому что она пересчитывает фибоначчи во всем вызове.

Попробуйте онлайн!



1

На самом деле , 13 байтов

╗1⌠F$╜@c⌡╓i;F

Попробуйте онлайн!

Объяснение:

╗1⌠F$╜@c⌡╓i;F
╗              save input in register 0
 1⌠F$╜@c⌡╓     smallest non-negative integer n where the following function returns truthy:
   F$            nth Fibonacci number, stringified
     ╜@c         count occurrences of input
          i;F  flatten the list, duplicate the index, and push the Fibonacci number at that index

1

R 65 байт

f=function(x,n=1,a=1,b=0)`if`(grepl(x,b),c(b,n-1),f(x,n+1,a+b,a))

Стандартная рекурсия для генерации Fibnums, но вместо завершения на основе n, завершается, когда bсоответствует регулярному выражению x. Это на самом деле работает на удивление хорошо. Я предполагал, что использование регулярных выражений с числами потребует много хлопот, конвертируя их в строки, но в этом нет необходимости :)

Это также должно перескочить рекурсию на 1 шаг, включив bвместо нее aи затем вычтя 1из n. Это чтобы убедиться, что f(0)работает правильно.

Это терпит неудачу для большинства значений, когда ввод превышает 1001, из-за maxint. Если мы заменим aи bдля bigints, это работает для более высоких входных данных (текущее тестирование в x = 11451)

f=function(x,n=1,a=gmp::as.bigz(1),b=gmp::as.bigz(0))`if`(grepl(x,b),c(b,n-1),f(x,n+1,a+b,a))

1

JavaScript ES6, 79 78 75 байт

-1 байт от Step Hen

-3 байта Нилом

i=>eval('d=a=b=1;while(!~(a+"").indexOf(i)){c=b;b=a+b;a=c;‌​d++};d+": "+a')

1
Вы можете использовать eval()вместо того, { return}чтобы сохранить байт, и вы можете удалить, t=так как вы не используете рекурсию:i=>eval('d=a=b=1;while(!~(a+"").indexOf(i+""){c=b;b=a+b;a=c;d++};d+": "+a')
Стивен

1
String.prototype.indexOfавтоматически преобразует свой параметр в строку, нет необходимости делать это явно. Также вы, похоже, скопировали опечатку @ StepHen (у вас больше (s, чем )s).
Нил

@ Нейл дурачит меня
Стивен



1

PHP, 80 байт

<?php for($a=1,$b=$n=0;strpos($a=-$a+$b=$a+$b,"$argv[1]")<-1;$n++);echo"$n: $a";

Сценарий довольно прост, просто хранит текущие и последующие члены последовательности в $ a и $ b на всем протяжении. Чтобы учесть 0-й член 0, $ a и $ b изначально присваиваются значения для -1-го члена (1) и 0-го члена (0) соответственно.

Оба значения пересчитываются в одном выражении, которое представляет собой два присваивания в одном; эффективно:

$b = $a + $b; // The next term is the sum of the two previous terms
$a = $b - $a; // The current term is now recalculated from the next and the previous

Если входное значение совпадает с началом термина, функция strpos () вернет 0 (что неверно и даст ложный отрицательный результат), но в Wonderphul World of PHP, хотя false == 0это правда и false < 0ложно, false < -1это правда! И так, использование этого сравнения экономит пять байтов по сравнению с !==false.


1

Japt , 17 14 байт

Сохранено 3 байта благодаря @JustinMariner

_ŬøU}a@[XMgX]

Попробуйте онлайн!

объяснение

_ŬøU}a@[XMgX]      Implicit: U = input integer
      a@            For each integer X in [0, 1, 2, ...]:
        [XMgX]        take [X, Fibonacci(X)].
_    }a             Return the first pair where
 Å                    all but the first item
  ¬                   joined on the empty string (simply returns Fibonacci(X) as a string)
   øU                 contains U.
                    Implicit: output result of last expression

14 байт: _ŬøU}a@[XMgX]. Используется s1 q для получения последнего предмета, который позволяет бросить<space>s
Джастин Маринер

@JustinMariner Это ... это гениально :-)
ETHproductions

0

PHP , 163 141 байт

<?php $x=fgets(STDIN);$b=[0,1];if($x<1)$b=[0];for(;($c=count($b)-1)&&strpos($b[$c],$x)===false;){$b[]=$b[$c]+$b[$c-1];}die($c.': '.$b[$c]);?>

Попробуйте онлайн!

Использует $b[0] = 0;и $b[1] = 1;для начала последовательности FIB



0

PHP , 93 байта

for($a[0]=$a[1]++;!strpos(" $a[$i]","$argv[1]");$a[$i+2]=$a[$i+1]+$a[$i++]);echo"$i: $a[$i]";

Простой цикл по последовательности Фибоначчи. Проверка нашего входного номера выполняется в strpos(" $a[$i]","$argv[1]"); дополнительный пробел потому, strposчто вернет false-y, если в начале строки найдена «игла». Мы заканчиваем, если вход найден и выводим требуемую строку.

Попробуйте онлайн!


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