В межах чисел Фібоначчі


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.

Ви використовували ту саму хитрість, що і моя. :)
Erik the Outgolfer

@EriktheOutgolfer Як ваш?
Денніс

Не опублікував, але, як правило, я не використав Dжодного ...
Ерік Аутгольфер


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внаслідок обмеженого діапазону цілої арифметики Патча. Пояснення: Пакет не має вбудованого тесту на відповідність, але у нього є оператор, який може замінювати прямолінійні рядки іншими літеральними рядками, тому, наприклад if "%s:l=%"=="%s%", вірно, якщо %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

Діалог APL, 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для bigint, це працює для більш високих входів (поточне тестування знаходиться на 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 байт крок Хен

-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')
Stephen

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

@Neil вигукує мого поганого
Stephen



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 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;для початку послідовності фіб



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.