Реалізуйте фібоначчину


13

Куайн це програма , яка виводить його джерело при запуску.

У цьому виклику вам слід скласти квіну Фібоначчі, варіант квіни.


Що таке фібоначчина-квінт?

Фібоначчі-квін - це програма, яка виводить модифікацію джерела за наступним правилом:

Початкове джерело повинно бути ...2.... Іншими словами, джерело повинно містити 2. (Чому 2? Якби це було 1, ніхто б не знав, чи це перший чи другий, Навіть сама програма)

Під час запуску слід вивести джерело, але тільки конкретне число (На цьому етапі 2) змінилося на наступне число послідовності поля. Наприклад, ...3.... Те саме стосується і виводу, і виходу виходу, і т.д. Ви можете підтримувати цілі числа до 2 ^ 32-1. Для цілих чисел, що перевищують цю межу, наступний вихід залежить від вашого вибору.

Примітка ОП

Я дуже хотів би побачити для цього творче рішення. Я не міг придумати єдиного рішення для цього, оскільки обидва обох важливих аспекту виклику, фіналу та квіне, непрості. Я тоді буду чекати!



4
Частина квита не додає великої кількості цьому виклику. Це лише "наступне значення в послідовності Фібоначчі" плюс універсальні конструктори quine, як показують відповіді.

Я згоден. Я також хотів би бачити творче рішення для цього. Але якщо ви хочете, щоб творче рішення було настільки погане, то чому б не зробити це кодовим викликом замість коду-гольфу. Критеріями виграшу може бути найбільша кількість голосів через деякий проміжок часу чи щось таке.
Фіксована точка

@FixedPoint Що з "Другими критеріями"? Хтось приймає креативне рішення, я даю їм щедрість.
Меттью Ро

@FixedPoint Ось такий конкурс популярності
boboquack

Відповіді:


8

Математика, 61 байт

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

Зверніть увагу, що є простір. Це функція quine, тобто вищевказаний код оцінює неназвану функцію, яка, якщо викликається, повертає сам код у вигляді рядка (із 2зміною на наступне число Фібоначчі).

Це було напрочуд складно, щоб приступити до роботи. Основна ідея - взяти саму функцію (з #0) і замінити число в цій функції на наступне за допомогою /. v:2 :> nextFib[v]. Однак nextFibна цьому етапі не було б оцінено, тому ми насправді не отримаємо нове число у вихідному коді. Провівши деякий час, щоб зрозуміти, як змусити негайно оцінити, я знайшов цей чудовий пост на Mathematica.SE . "Стандартна" методика використовує Withблок, який змушує оцінювати, але друга відповідь WReach містить більш коротку альтернативу, використовуючи незадокументований вбудований модуль, RuleConditionякий також змушує оцінювати.

Як ми обчислимо наступне число Фібоначчі, використовуючи той факт, що відношення послідовних чисел приблизно є золотим відношенням 1,618 ... і це точно до округлення. Тож нам не потрібно слідкувати за останніми двома номерами, а можна просто зробити Round[GoldenRatio v]. Це ніколи не втратить точності, оскільки Mathematica GoldenRationє символічним значенням, і тому Roundзавжди може обчислити точний результат.

Підсумовуючи:

... #0 ... &

Безіменна функція, де #0посилається на сам об’єкт функції.

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

Знайдіть 2у дереві виразів функції (це 2звичайно відповідає собі), назвіть її vта замініть на ...

... RuleCondition[Round[GoldenRatio v]]

... наступне число Фібоначчі

ToString[...]

І перетворити отримане дерево виразів у його рядкове подання.


Приємно знати, що над цим треба потрудитися іноді :)
Грег Мартін

Хіба немає символу золотого відношення?
caird coinheringaahing

@cairdcoinheringaahing ні.
Мартін Ендер

7

CJam , 26 байт

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

Спробуйте в Інтернеті!

Напевно, не зовсім оптимально. Ми просто повторюємо послідовність Фібоначчі до тих пір, поки значення не перевищить останнє, і використаємо результат як нове значення на початку програми.


6
Це..Це рано?
Меттью Ро





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

Швидкий, 251 байт

Трохи багатослівний для мене, але я не можу зрозуміти, як скоротити його:

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

Безголівки:

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! Ми сподіваємось, що ви тут будете чудово провести час.
Leaky Nun

@LeakyNun Сподіваємось виправлено зараз!
rbntd

Версія для гольфу:x=i=>console.log('x='+x+';x('+(i*(5**.5+1)/2+.5|0)+')');x(2)
Leaky Nun

@LeakyNun Ух, це коротко! Але хіба це не занадто приблизно? він видає 50159 для i = 31000, хоча правильна відповідь повинна бути 46368
rbntd

Я не розумію. 31000не число Фібоначчі
Leaky Nun


1

Швидкий, 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))))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.