Thực hiện các chỉ số Fibonacci


13

Một Quine là một chương trình mà kết quả đầu ra nguồn của nó khi chạy.

Trong thử thách này, Bạn nên tạo ra một chỉ số Fibonacci-quine, một biến thể của quine.


Một chỉ số Fib-quine là gì?

Một chỉ số Fibonacci là một chương trình, đưa ra sự điều chỉnh nguồn theo quy tắc sau:

Các nguồn ban đầu nên được ...2.... Nói cách khác, nguồn nên chứa 2. (Tại sao là 2? Nếu là 1, Không ai biết đó là lần đầu tiên hay lần thứ hai, Ngay cả chính chương trình)

Khi chạy, Bạn nên xuất nguồn, nhưng chỉ số cụ thể (Trong giai đoạn này, 2) thay đổi thành số tiếp theo của chuỗi Wikipedia. Ví dụ , ...3.... Tương tự với đầu ra và đầu ra của đầu ra, v.v. Bạn có thể hỗ trợ các số nguyên cho tối đa 2 ^ 32-1. Đối với các số nguyên vượt quá giới hạn đó, đầu ra tiếp theo là lựa chọn của bạn.

Ghi chú của OP

Tôi thực sự muốn thấy một giải pháp sáng tạo cho việc này. Tôi không thể nghĩ ra một giải pháp duy nhất cho việc này, vì Cả hai khía cạnh quan trọng của thử thách, MySpace và quine, đều không dễ dàng. Tôi sẽ đợi!



4
Phần quine không thêm nhiều vào thử thách này. Đây chỉ là "giá trị tiếp theo trong chuỗi Fibonacci" cộng với các hàm tạo quine phổ quát, như các câu trả lời cho thấy.

Tôi đồng ý. Tôi muốn thấy một giải pháp sáng tạo cho điều này là tốt. Nhưng nếu bạn muốn một giải pháp sáng tạo quá tệ, vậy thì tại sao không biến nó thành một thử thách mã thay vì chơi golf. Các tiêu chí chiến thắng có thể là số phiếu bầu cao nhất sau một khoảng thời gian hoặc một cái gì đó.
Điểm cố định

@FixedPoint Điều gì về một 'Tiêu chí thứ hai'? Ai đó làm cho một giải pháp sáng tạo, tôi cho họ tiền thưởng.
Matthew Roh

@FixedPoint Đó là một cuộc thi phổ biến
boboquack

Câu trả lời:


8

Toán học, 61 byte

ToString[#0 /. v:2 :> RuleCondition[Round[GoldenRatio v]]] & 

Lưu ý rằng có một không gian dấu. Đây là một hàm quine, tức là đoạn mã trên ước tính thành một hàm không tên, nếu được gọi sẽ trả về chính mã đó dưới dạng một chuỗi (được 2thay đổi thành số Fibonacci tiếp theo).

Điều này là cực kỳ khó khăn để đi làm. Ý tưởng cơ bản là lấy chính hàm (với #0) và thay thế một số trong hàm đó bằng hàm tiếp theo bằng cách sử dụng /. v:2 :> nextFib[v]. Tuy nhiên, nextFibsẽ không được đánh giá ở giai đoạn này vì vậy chúng tôi sẽ không thực sự kết thúc với số mới trong mã nguồn. Sau khi tìm kiếm xung quanh một lúc để tìm ra cách buộc đánh giá ngay lập tức, tôi đã tìm thấy bài đăng tuyệt vời này trên Mathematica.SE . Kỹ thuật "tiêu chuẩn" sử dụng một Withkhối buộc đánh giá, nhưng câu trả lời thứ hai của WReach chứa một giải pháp thay thế ngắn hơn bằng cách sử dụng tích hợp không có giấy tờ RuleConditioncũng buộc phải đánh giá.

Cách chúng ta tính toán số Fibonacci tiếp theo là bằng cách sử dụng thực tế là tỷ lệ của các số liên tiếp gần bằng tỷ lệ vàng 1.618 ... và điều này là chính xác cho đến làm tròn. Vì vậy, chúng ta không cần phải theo dõi hai số cuối và chỉ có thể làm Round[GoldenRatio v]. Điều này sẽ không bao giờ mất độ chính xác vì Mathicala GoldenRationlà một giá trị tượng trưng và do đó Roundluôn có thể tính toán một kết quả chính xác.

Tóm tắt:

... #0 ... &

Một hàm không tên, trong đó #0đề cập đến chính đối tượng hàm.

... /. v:2 :> ...

Tìm một 2trong cây biểu thức của hàm (điều này 2tất nhiên chỉ khớp với chính nó), gọi nó vvà thay thế nó bằng ...

... RuleCondition[Round[GoldenRatio v]]

... số Fibonacci tiếp theo.

ToString[...]

Và chuyển đổi cây biểu thức kết quả thành biểu diễn chuỗi của nó.


Thật vui khi biết bạn đôi khi phải làm việc chăm chỉ :)
Greg Martin

Không có biểu tượng cho tỷ lệ vàng sao?
caird coinheringaahing

@cairdcoinheringaahing không.
Martin Ender

7

CJam , 26 byte

2{0X{_@+_W$>!}go;\;"_~"}_~

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

Có lẽ không hoàn toàn tối ưu. Chúng tôi chỉ đơn giản lặp lại chuỗi Fibonacci cho đến khi giá trị lớn hơn giá trị cuối cùng và sử dụng kết quả làm giá trị mới ở đầu chương trình.


6
Thi..Điều này sớm?
Matthew Roh





4

Thạch , 14 byte

“×Øp+.ḞṭØv”Ṙv2

Hãy thử trực tuyến! hoặc xác minh tất cả các lần lặp được yêu cầu .

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

“×Øp+.ḞṭØv”Ṙv2  Main link. No arguments.

“×Øp+.ḞṭØv”     Set the left argument and return value to the string "×Øp+.ḞṭØv".
           Ṙ    Print a string representation of the return value and yield the
                unaltered return value.
            v2  Evaluate the return value as a Jelly program with left argument 2.
 ×Øp                Multiply the left argument by the golden ratio.
    +.              Add 0.5 to the resulting product.
      Ḟ             Floor; round the resulting sum down to the nearest integer.
        Øv          Yield the string "Øv".
       ṭ            Tack; append the result to the left to the result to the right.

1

Swift, 251 byte

Một chút dài dòng cho tôi, nhưng tôi không thể tìm ra cách làm cho nó ngắn hơn:

import Foundation;var n="\"";var u="\\";var s="import Foundation;var n=%@%@%@%@;var u=%@%@%@%@;var s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))";print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))

Ung dung:

import Foundation
var n="\""
var u="\\"
var s="import Foundation;var n=%@%@%@%@;var u=%@%@%@%@;var s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))"
print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))

Rắc rối của tôi là cố gắng để có được báo giá xung quanh phiên bản mới của s.



1

Javascript (ES6), 151 60 byte

Phiên bản mới, ghi có vào @ Leaky Nun

x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)

Phiên bản cũ :

x=i=>{var s=Math.sqrt(5),a=1;f=n=>{return Math.ceil((((1+s)/2)**n-((1-s)/2)**n)/s)};while(f(++a)<=i);console.log('x='+String(x)+';x('+f(a)+')');};x(2)

Dựa trên điều này .


1
Chào mừng đến với PPCG! Chúng tôi hy vọng rằng bạn sẽ có một thời gian tuyệt vời ở đây.
Leaky Nun

@LeakyNun Hy vọng đã sửa!
rbntd

Phiên bản chơi gôn:x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
Leaky Nun

@LeakyNun wow, thật ngắn! Nhưng nó không quá gần đúng sao? nó xuất ra 50159 cho i = 31000 mặc dù câu trả lời đúng phải là 46368
rbntd

Tôi không hiểu 31000không phải là số Fibonacci.
Leaky Nun

1

dc , 35 byte

2[r9k5v1+2/*.5+0k1/n91PP93P[dx]P]dx

Một phiên bản có số lần lặp (56 byte):

2[rsP1dsN[lN+lNrsNdlP[s.q]s.=.lFx]dsFxlNn91PP93P[dx]P]dx

1

Swift, 235 byte

Đây là phiên bản cải tiến của Caleb 's câu trả lời .

import Foundation;var n="\"",u="\\",s="import Foundation;var n=%@%@%@%@,u=%@%@%@%@,s=%@%@%@;print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(%f*(1+sqrt(5))/2))))";print(String(format:s,n,u,n,n,n,u,u,n,n,s,n,(round(2*(1+sqrt(5))/2))))

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.