Trong số Fibonacci


20

Các thách thức

Đưa ra một đầu vào số nguyên, trả về số Fibonacci đầu tiên có chứa đầu vào bên trong cùng với chỉ số của số Fibonacci đó (các chỉ số bắt đầu từ 0 hoặc 1 - tùy theo bạn, nhưng vui lòng đề cập đến câu trả lời của bạn). Ví dụ, nếu được đưa vào đầu vào là 12, chương trình sẽ trả về 26: 121393là 12 được tìm thấy trong số ( 12 1393) và nó nằm ở chỉ số 26 của các số Fibonacci.

Ví dụ

Đưa ra đầu vào:

45

Chương trình của bạn sẽ xuất ra:

33: 3524578

Đầu vào:

72

Đầu ra:

54: 86267571272

Đầu vào:

0

Đầu ra:

0: 0

Đầu vào:

144

Đầu ra:

12: 144

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng.


Thay vào đó chúng ta có thể chọn lập chỉ mục 1 không?
Ông Xcoder

1
Không phải là một bản sao, nhưng khá gần với thử thách này .
Lynn

1
Chủ đề về toán học liên quan đến việc liệu chuỗi Fibonacci có bình thường hay không (câu hỏi này giả định là như vậy).
admBorkBork

1
Chúng ta có phải sử dụng dấu hai chấm làm dấu phân cách không? Chúng ta có thể xuất một mảng / danh sách không?
Shaggy

Câu trả lời:


8

Thạch , 10 byte

0ÆḞ©w¥1#;®

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Bạn đã sử dụng thủ thuật tương tự như của tôi. :)
Erik the Outgolfer 28/07/17

@EriktheOutgolfer Là của bạn?
Dennis

Không đăng nó, nhưng nói chung tôi cũng không sử dụng D...
Erik the Outgolfer 28/07/17


4

Perl 6 , 30 byte

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

Hãy thử trực tuyến!

firstlà một hàm trả về phần tử đầu tiên của chuỗi vượt qua kiểm tra và nó thuận tiện lấy một :kvtrạng từ chỉ cho nó trả về cả khóa (chỉ mục) và giá trị khớp.


Giả sử bạn có thể trả về một đối tượng Ghép đôi , bạn có thể sử dụng :ptrạng từ thay vì :kv.
Brad Gilbert b2gills

3

Hàng loạt, 104 byte

@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%

Hoạt động n=0..45do phạm vi số học nguyên của Batch giới hạn. Giải thích: Batch không có kiểm tra đối sánh tích hợp, nhưng nó có một toán tử có thể thay thế các chuỗi ký tự bằng các chuỗi ký tự khác, vì vậy, ví dụ if "%s:l=%"=="%s%"là đúng nếu %s%không trống nhưng không chứa l. Việc sử dụng callsau đó là một mẹo để thay thế %1(đầu vào) vào toán tử thay thế, tuy nhiên callkhông hoạt động trên các câu lệnh luồng điều khiển nên việc gán tạm thời trung gian là cần thiết.



2

Javascript ES6, 68 ký tự

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

Kiểm tra:

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 byte

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 Dyalog, 39 byte

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

Sử dụng đệ quy đuôi. Đừng thử 72, nó sẽ làm hỏng máy của bạn vì tính toán lại trên tất cả các cuộc gọi.

Hãy thử trực tuyến!



1

Trên thực tế , 13 byte

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

Hãy thử trực tuyến!

Giải trình:

╗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 byte

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

Đệ quy tiêu chuẩn để tạo Fibnums, nhưng thay vì chấm dứt dựa trên n, chấm dứt khi bkhớp với biểu thức chính quy x. Điều này thực sự hoạt động tốt đáng ngạc nhiên. Tôi giả định rằng việc sử dụng regex với số sẽ đòi hỏi rất nhiều rắc rối khi chuyển chúng thành chuỗi, nhưng điều đó dường như không cần thiết :)

Điều này cũng phải vượt qua đệ quy 1 bước, bằng cách kiểm tra bthay vì avà sau đó trừ 1đi n. Điều này là để đảm bảo f(0)hoạt động đúng.

Điều này không thành công cho hầu hết các giá trị khi đầu vào vượt quá 1001, vì tối đa. Nếu chúng tôi thay thế abcho các vấn đề lớn, điều này hoạt động cho các đầu vào cao hơn (thử nghiệm hiện tại là tại 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 byte

-1 byte bởi Step Hen

-3 byte bởi Neil

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

1
Bạn có thể sử dụng eval()thay vì { return}để lưu một byte và bạn có thể loại bỏ t=vì bạn không sử dụng đệ quy:i=>eval('d=a=b=1;while(!~(a+"").indexOf(i+""){c=b;b=a+b;a=c;d++};d+": "+a')
Stephen

1
String.prototype.indexOftự động chuyển đổi tham số của nó thành một chuỗi, không cần phải làm rõ ràng. Ngoài ra, bạn dường như đã sao chép lỗi đánh máy của @ StepHen (bạn có nhiều (s hơn )s).
Neil

@Neil woops my bad
Stephen



1

PHP, 80 byte

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

Kịch bản khá đơn giản, chỉ đơn giản là lưu trữ các điều khoản hiện tại và tiếp theo của chuỗi trong $ a và $ b trong suốt. Để cho phép số hạng 0 bằng 0, $ a và $ b ban đầu được gán các giá trị cho số hạng thứ 1 (1) và số hạng 0 (0) tương ứng.

Cả hai giá trị được tính toán lại trong một biểu thức, đó là hai phép gán trong một; có hiệu quả:

$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

Nếu giá trị đầu vào khớp với đầu của thuật ngữ, hàm strpose () sẽ trả về 0 (là falsey và sẽ cho âm sai), nhưng trong Thế giới kỳ diệu của PHP, mặc dù false == 0là đúng và false < 0là sai, false < -1là đúng! Và do đó, sử dụng so sánh này tiết kiệm năm byte so với !==false.


1

Japt , 17 14 byte

Đã lưu 3 byte nhờ @JustinMariner

_ŬøU}a@[XMgX]

Hãy thử trực tuyến!

Giải trình

_Ŭø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 byte : _ŬøU}a@[XMgX]. Sử dụng s1 q để có được vật phẩm cuối cùng, cho phép thả<space>s
Justin Mariner

@JustinMariner Đó là ... đó là thiên tài :-)
Sản phẩm điện tử

0

PHP , 163 141 byte

<?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]);?>

Hãy thử trực tuyến!

Sử dụng $b[0] = 0;$b[1] = 1;bắt đầu chuỗi sợi



0

PHP , 93 byte

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

Vòng lặp đơn giản thông qua chuỗi Fibonacci. Việc kiểm tra số đầu vào của chúng tôi được thực hiện trong strpos(" $a[$i]","$argv[1]"); không gian thêm là vì strpossẽ trả về false-y nếu tìm thấy 'kim' ở đầu chuỗi. Chúng tôi kết thúc nếu đầu vào được tìm thấy và lặp lại chuỗi yêu cầu.

Hãy thử trực tuyến!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.