ใช้ Fibonacci-quine


13

ควินเป็นโปรแกรมที่เอาท์พุทแหล่งที่มาของมันเมื่อวิ่ง

ในการท้าทายนี้คุณควรสร้าง Fibonacci-quine ซึ่งเป็นตัวแปรของควิน


Fibonacci-quine คืออะไร

Fibonacci-quine เป็นโปรแกรมที่ให้ผลลัพธ์ของการดัดแปลงแหล่งข้อมูลตามกฎต่อไปนี้:

...2...แหล่งที่มาเริ่มต้นที่ควรจะเป็น ในคำอื่น ๆ 2ที่มาควรมี (เพราะเหตุใด 2 ถ้าเป็น 1 ไม่มีใครจะรู้ว่ามันเป็น 1 หรือสองแรกแม้แต่โปรแกรมเอง)

เมื่อทำงานคุณควรส่งออกแหล่งที่มา แต่เพียงจำนวนที่เฉพาะเจาะจง (ในขั้นตอนนี้2) เปลี่ยนไปเป็นจำนวนต่อไปของ fibonacci ลำดับ ตัวอย่างเช่น...3.... กันไปสำหรับเอาท์พุทและเอาท์พุทของเอาท์พุท ฯลฯ คุณอาจรองรับจำนวนเต็มได้ถึง 2 ^ 32-1 สำหรับจำนวนเต็มที่เกินขีด จำกัด นั้นเอาต์พุตถัดไปจะเป็นตัวเลือกของคุณ

หมายเหตุของ OP

ฉันอยากเห็นโซลูชันที่สร้างสรรค์สำหรับสิ่งนี้ ฉันไม่สามารถคิดวิธีแก้ปัญหาเดียวสำหรับเรื่องนี้เนื่องจากทั้งสองแง่มุมที่สำคัญของความท้าทายฟีโบนักชีและควินินนั้นไม่ใช่เรื่องง่าย ฉันจะรอแล้ว!


ที่เกี่ยวข้อง
Leun Nun

4
ส่วนที่เป็นควินินไม่ได้เพิ่มความท้าทายนี้มากนัก นี่เป็นเพียง "มูลค่าต่อไปในลำดับฟีโบนักชี" บวกกับตัวสร้างควินสากลตามคำตอบที่แสดง

ฉันเห็นด้วย. ฉันต้องการเห็นโซลูชันที่สร้างสรรค์สำหรับสิ่งนี้เช่นกัน แต่ถ้าคุณต้องการโซลูชันเชิงสร้างสรรค์ที่แย่มากทำไมไม่ลองใช้รหัสแทนการเล่นกอล์ฟ เกณฑ์การชนะอาจเป็นคะแนนโหวตสูงสุดหลังจากผ่านช่วงเวลาหรือบางสิ่งไป
จุดคงที่

@FixedPoint แล้ว 'หลักเกณฑ์ที่สอง' ล่ะ? ใครบางคนสร้างโซลูชันที่สร้างสรรค์ฉันให้รางวัลแก่พวกเขา
Matthew Roh

@FixedPoint นั่นคือการประกวดความนิยม
boboquack

คำตอบ:


8

Mathematica, 61 ไบต์

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

โปรดทราบว่ามีช่องว่างต่อท้าย นี่คือฟังก์ชั่นควินคือโค้ดข้างต้นจะประเมินฟังก์ชั่นที่ไม่มีชื่อซึ่งถ้าเรียกว่าส่งคืนรหัสตัวเองเป็นสตริง (ด้วยการ2เปลี่ยนเป็นหมายเลขฟีโบนักชีต่อไป)

นี่เป็นเรื่องยุ่งยากอย่างมากที่จะทำงาน ความคิดพื้นฐานคือการใช้ฟังก์ชั่นของตัวเอง (กับ#0) /. v:2 :> nextFib[v]และแทนที่ตัวเลขในฟังก์ชั่นที่มีอย่างใดอย่างหนึ่งต่อไปโดยใช้ อย่างไรก็ตามnextFibจะไม่ได้รับการประเมินผลในขั้นตอนนี้ดังนั้นเราจะไม่ได้รับหมายเลขใหม่ในซอร์สโค้ด หลังจากการค้นหารอบในขณะที่จะคิดออกว่าจะบังคับให้การประเมินผลทันทีผมพบว่าการโพสต์ที่ยิ่งใหญ่นี้ใน Mathematica.SE เทคนิค "มาตรฐาน" ใช้Withบล็อกที่บังคับให้มีการประเมิน แต่คำตอบที่สองโดย WReach มีทางเลือกที่สั้นกว่าโดยใช้ built-in RuleConditionที่ไม่มีเอกสารซึ่งบังคับการประเมินผล

วิธีที่เราคำนวณจำนวนฟีโบนัชชีต่อไปคือการใช้ประโยชน์จากความจริงที่ว่าอัตราส่วนของตัวเลขติดต่อกันนั้นเป็นอัตราส่วนทองคำประมาณ1.618 ...และนี่แม่นยำจนถึงการปัดเศษ Round[GoldenRatio v]ดังนั้นเราจึงไม่จำเป็นต้องติดตามตัวเลขสองที่ผ่านมาและสามารถทำ สิ่งนี้จะไม่สูญเสียความแม่นยำเนื่องจาก Mathematica GoldenRationเป็นค่าสัญลักษณ์และRoundสามารถคำนวณผลลัพธ์ที่แม่นยำได้เสมอ

สรุป:

... #0 ... &

ฟังก์ชั่นที่ไม่มีชื่อซึ่ง#0หมายถึงวัตถุฟังก์ชั่นของตัวเอง

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

ค้นหา2ในต้นไม้นิพจน์ของฟังก์ชัน ( 2แน่นอนว่าตรงกับตัวเองเท่านั้น) เรียกมันvและแทนที่ด้วย ...

... RuleCondition[Round[GoldenRatio v]]

... หมายเลขฟีโบนักชีต่อไป

ToString[...]

และแปลงทรีนิพจน์ที่ได้รับเป็นตัวแทนสตริง


มันเป็นเรื่องดีที่จะรู้ว่าคุณต้องทำงานอย่างหนักที่เหล่านี้บางครั้ง :)
เกร็กมาร์ติน

ไม่มีสัญลักษณ์สำหรับอัตราส่วนทองคำใช่ไหม
Caird coinheringaahing

@cairdcoinheringaahing no
Martin Ender

7

CJam , 26 ไบต์

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

ลองออนไลน์!

อาจไม่เหมาะสมที่สุด เราวนลำดับฟีโบนักชีซ้ำไปเรื่อย ๆ จนกว่าค่าจะมากกว่าค่าสุดท้ายและใช้ผลลัพธ์เป็นค่าใหม่ที่จุดเริ่มต้นของโปรแกรม


6
ใช่ .. ต้นนี้เหรอ?
Matthew Roh





4

เยลลี่ 14 ไบต์

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

ลองออนไลน์! หรือตรวจสอบซ้ำที่จำเป็นทั้งหมด

มันทำงานอย่างไร

“×Ø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 ไบต์

verbose เล็กน้อยสำหรับฉัน แต่ฉันไม่สามารถหาวิธีทำให้สั้นลงได้:

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

Ungolfed:

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

ปัญหาของฉันคือการพยายามที่จะได้รับราคาที่อยู่รอบ ๆ sรุ่นใหม่ของ



1

Javascript (ES6), 151 60 ไบต์

เวอร์ชันใหม่ให้เครดิตกับ @ Leaky Nun

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

เวอร์ชั่นเก่า :

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)

บนพื้นฐานนี้


1
ยินดีต้อนรับสู่ PPCG! เราหวังว่าคุณจะมีช่วงเวลาที่ดีที่นี่
Leun Nun

@LeakyNun แก้ไขแล้วหวังว่าตอนนี้!
rbntd

รุ่น Golfed:x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
Nun

@LeakyNun ว้าวสั้นมาก! แต่มันไม่ได้ประมาณไว้เหรอ? ให้ผลลัพธ์ 50159 สำหรับ i = 31000 แม้ว่าคำตอบที่ถูกต้องควรเป็น
46368

ฉันไม่เข้าใจ 31000ไม่ใช่หมายเลขฟีโบนักชี
Leun Nun

1

dc , 35 ไบต์

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

รุ่นที่มีการวนซ้ำ (56 ไบต์):

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

1

Swift, 235 ไบต์

นี้เป็นรุ่นที่ดีขึ้นของคาเลบ 's คำตอบ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.