Реализовать Фибоначчи-Куайн

13

Куайн это программа , которая выводит его источник при запуске.

В этом задании Вы должны составить Фибоначчи-квин, вариант квин.


Что такое Фибоначчи-Куайн?

Fibonacci-quine - это программа, которая выводит модификацию источника по следующему правилу:

Первоначальный источник должен быть ...2.... Другими словами, источник должен содержать 2. (Почему 2? Если бы это был 1, никто бы не узнал, был ли это первый или второй, даже сама программа)

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

Примечание ОП

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

Мэтью Ро
источник
Относящиеся .
Дрянная Монахиня
4
Часть Quine не добавляет много к этой проблеме. Это просто «следующее значение в последовательности Фибоначчи» плюс универсальные конструкторы квин, как показывают ответы.
Я согласен. Я хотел бы видеть творческое решение для этого также. Но если вы так сильно хотите креативное решение, то почему бы не сделать его вызовом для кода вместо игры в гольф для кода. Критерием победы может быть наибольшее количество голосов через некоторый промежуток времени или что-то еще.
Фиксированная точка
@ FixedPoint А как насчет «Второго критерия»? Кто-то делает творческое решение, я даю им награду.
Мэтью Ро,
@FixedPoint Это конкурс популярности
бобаквак

Ответы:

8

Mathematica, 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

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

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)

На основании этого .

rbntd
источник
1
Добро пожаловать в PPCG! Мы надеемся, что вы прекрасно проведете время здесь.
Утренняя монахиня
@ 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не число Фибоначчи.
Утренняя монахиня
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))))
Натан Пирси
источник
0

Java (OpenJDK 8) , 239 байт

interface a{static void main(String[]p){int a=1,b=1;for(;a<2;a=b-a)b+=a;String s="interface a{static void main(String[]p){int a=1,b=1;for(;a<%d;a=b-a)b+=a;String s=%c%s%c;System.out.printf(s,b,34,s,34);}}";System.out.printf(s,b,34,s,34);}}

Попробуйте онлайн!

Дрянная Монахиня
источник