Длина программы Фибоначчи

14

Напишите программу с длиной n, которая выводит другую программу, длина которой является следующим числом Фибоначчи после n. Новая программа должна сделать то же самое - вывести другую программу, длина которой равна следующему числу Фибоначчи и т. Д.
Сама по себе (длина исходной программы) не обязательно должна быть числом Фибоначчи, хотя было бы неплохо, если бы оно было.

Самый короткий код выигрывает.

Никаких внешних ресурсов, только ASCII, бесплатный компилятор / интерпретатор не требуется.
Если ваш вывод заканчивается новой строкой, он также считается.

уйти, потому что SE это зло
источник
Это должно продолжаться вечно? ( intили BigInteger)
Джастин
1
@Quincunx это нормально, если он перестает работать с пределом int или пределом компилятора / интерпретатора, в зависимости от того, что наступит раньше. Я ожидаю, что он достигнет 10000+, хотя.
Aditsu уйти, потому что SE зла
1
Существуют ли ограничения на использование пробелов или комментариев или произвольно длинных имен переменных / функций / классов в исходных или последующих программах?
Джонатан Пуллано
1
Может ли программа прочитать свой собственный исходный код, или вы ищете настоящий квазихин?
гистократ
@JonathanPullano никаких ограничений, они просто должны быть действительными программами
адицу ушел, потому что SE ЗЛО

Ответы:

5

CJam, 26 23

Я только что попробовал на вашем языке.

7{9\@5mq)2/*')*\"_~"}_~

9 есть (22*0.618 + 0.5 - 1)/1.618 + 1.

Он вычисляет свою собственную длину *1.618вместо того, чтобы повторно добавлять два числа. В первой версии он будет заполнять вывод до {лайка 1))))))))), который подсчитывает сами символы. Скажи результат n. Общая длина n+22и новая длина {должны быть (n+22)*1.618-22округлены. Уменьшите его на единицу, чтобы посчитать число )s. Тогда это будет примерно равно (n+8)*1.618.

Старая версия:

-3{1\@5mq)2/*E+')*\"_~"}_~

Число 14 есть 24*0.618 + 0.5 - 1.

jimmy23013
источник
Очень впечатляюще!
Деннис
Я думаю, что у нас новый победитель :)
Адицу ушел, потому что SE это ЗЛО
7

Python 2, 160 байт

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=1'
c=s
l=len(s%c)+4
a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1)
print s%`c`

Это настоящий квазихин; он не читает собственный источник, но генерирует его. Первый вывод (завершающий перевод строки):

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=111111111111111111111111111111111111111111111111111111111111111111111';c=s;l=len(s%c)+4;a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1);print s%`c`;a=1

Во-вторых:

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111';c=s;l=len(s%c)+4;a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1);print s%`c`;a=111111111111111111111111111111111111111111111111111111111111111111111

Редактировать: Ой. Забыл изменить строку, когда я изменил с ;s на 1s, поэтому во втором выводе были выведены дополнительные точки с запятой (которые Python не поддерживает). Исправлена

Джастин
источник
Я боюсь, что он перестает работать после примерно 3 итераций ...
Aditsu выйти, потому что SE зла
@aditsu Что? Python имеет ограничение на размер целого числа ?! (или это счет не Фибоначчи / пропуски / что-то еще?) Ой, подождите. Duh. Я забыл изменить строку XD
Джастин
7

CJam, 41 31 байт

{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~

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

Выход

$ cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'); echo
{1$+S@]_1=4+1$`,-S*"2$~"}34 21 2$~
$ cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~') | wc -c
34
$ cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~')); echo
{1$+S@]_1=4+1$`,-S*"2$~"}55 34                      2$~
$ cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~')) | wc -c
55
$ cjam (cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))); echo
bash: syntax error near unexpected token `cjam'
$ cjam <(cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))); echo
{1$+S@]_1=4+1$`,-S*"2$~"}89 55                                                        2$~
$ cjam <(cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))) | wc -c
89

Как это устроено

{       "                                                   {…} 21 13                     ";
  1$+   " Duplicate the higher number and add.              {…} 21 34                     ";
  S@    " Push a space and rotate the lower number on top.  {…} 34 ' ' 21                 ";
  ]     " Wrap the stack into an array.                     [ {…} 34 ' ' 21 ]             ";
  _1=   " Push the second element of the array.             [ {…} 34 ' ' 21 ] 34          ";
  4+    " Add 4 to it.                                      [ {…} 34 ' ' 21 ] 38          ";
  1$`,  " Push the length of the stringified array.         [ {…} 34 ' ' 21 ] 38 37       ";
  -S*   " Subtract and push that many spaces.               [ {…} 34 ' ' 21 ] ' '         ";
  "2$~" " Push the string '2$~'.                            [ {…} 34 ' ' 21 ] ' ' '2$~'   ";
}       "                                                   {…}                           ";

21D     " Push 21 and 13.                                   {…} 21 13                     ";
2$~     " Copy the code block an evaluate.                  [ {…} 34 ' ' 21 ] ' ' '2$~'   ";
Деннис
источник
2
Хороший, подтвержденный до 1 миллиона :) Я думаю, что это 37 вместо 39, хотя в объяснении.
Aditsu уйти, потому что SE зла
@aditsu: Не заметил, что вы редактировали свой комментарий до сих пор. Должно быть 37 действительно, спасибо.
Деннис
6

Python - 89

g="%(s,b,a+b);print o.ljust(b-1)";s,a,b="s,a,b=%r,%i,%i;o=s%"+g,89,144;exec("o=s"+g)#####

Мой идеальный счет персонажа исчез . ; _; Спасибо TheRare за указание на новую строку и Quincunx за предложение использовать Python 2, сбривая 2 символа.

РЕДАКТИРОВАТЬ : теперь просто использует больше #s вместо 1s; 12 символов короче.

РЕДАКТИРОВАТЬ 2 : 94 символов! Устранено некоторое повторение. >: 3

РЕДАКТИРОВАТЬ 3 : более короткая альтернатива repr для Python 2.

РЕДАКТИРОВАТЬ 4 : Вывод теперь короче.

РЕДАКТИРОВАТЬ 5 : Использование, %rчтобы сократить его было взято из ответа на другой вопрос @primo.

РЕДАКТИРОВАТЬ 6 : короче. : D

Вот версия Python 3:

g="%(s,b,a+b);print(o.ljust(b-1))";s,a,b="s,a,b=%r,%i,%i;o=s%"+g,89,144;exec("o=s"+g)####

Этот ответ похож на ответ @Quincunx.

cjfaure
источник
printвсегда добавляет новую строку, если вы не укажете end=''аргумент.
Seequ
Почему бы не использовать Python 2 ?:s,a,b="s,a,b=%s,%i,%i;o=s%%(`s`,b,a+b)+'#';print o+(b-len(o)-1)*'1'",89,144;o=s%(`s`,b,a+b)+'#';print o+(b-len(o)-1)*'1'
Джастин
@ Quincunx я буду! Спасибо: D
cjfaure
Ваша программа с 90 символами не работает с Python 3 и имеет вывод из 145 символов (не число Фибоначчи)
aditsu выход, потому что SE - ЗЛО
@aditsu Исправлено. : 3
cjfaure
2

JavaScript, 94

(function q(w,e){return ('('+q+')('+e+','+(s=w+e)+')'+Array(s).join('/')).substr(0,s)})(55,89)

Основанный на известном JavaScript Quine , он возвращает почти ту же функцию, за которой следует только количество слешей, так что он суммирует до 144, что является следующим числом Фибоначчи после N. И так далее ...

N не является числом Фибоначчи, но это было только «приятно иметь».

Иаков
источник
Кажется, он не работает правильно, когда проходит 1000
aditsu прекратил работу, потому что SE ЗЛО
1000 что? Итерации?
Джейкоб
Нет, продолжительность программы
aditsu уйти, потому что SE ЗЛО
Хм ... Я тестировал его в консоли Chrome, использовал, p = (my answer)а затем p = eval(p)пару раз, и получил до 196418 года ... после этого время обработки составило> 1 сек, поэтому я прекратил тестирование: P Но я думаю, что оно может продолжаться еще дольше.
Джейкоб
Вы не понимаете .. Я не говорил, что он перестает работать или он слишком медленный. Я сказал, что это не работает правильно. Не просто делай p=eval(p), а проверяй p.length. После того, как он достигает 987, я получаю длину 1598, а не число Фибоначчи.
Aditsu уйти, потому что SE зла
0

Mathematica

({0};
 With[{n = Ceiling[ InverseFunction[Fibonacci]@LeafCount@#0 ], l = Length[#0[[1, 1]]]},
    #0 /. {0..} -> ConstantArray[0, Fibonacci[n+1] - LeafCount[#0] + l]
 ]) &

Это очень простая реализация (т. Е. Здесь нет обфускации). Это анонимная функция, которая возвращает себя с небольшим дополнением для достижения правильной длины. Mathematica гомоична: код и данные представлены в виде выражений Mathematica, что позволяет реально легко модифицировать / генерировать код на лету. Это также означает, что количество символов не является естественной мерой длины кода. Размер выражения ( «число листьев» ) есть. Эта версия основана на подсчете количества листьев в качестве меры длины кода.

Если мы назначим эту анонимную функцию переменной f(чтобы я мог показать, что происходит в удобочитаемой форме), и продолжаем вызывать ее 1, 2, 3, ... раз, каждый раз измеряя длину возвращаемого значения, это то, что мы получаем:

In[]:= f // LeafCount
Out[]= 42

In[]:= f[] // LeafCount
Out[]= 89

In[]:= f[][] // LeafCount
Out[]= 144

In[]:= f[][][] // LeafCount
Out[]= 233

Относительно требования бесплатного переводчика: Mathematica бесплатна для Raspberry Pi. В противном случае этот код должен быть простым для переноса на Mathics (с открытым исходным кодом) . Единственное, чего не хватает в математике, это то InverseFunction, что можно заменить, как здесь (но я ленивый :).

Сабольч
источник
Вау, я не знал, что Mathematica была бесплатной для Пи, я должен проверить это. Тем не менее, программа должна печатать символы на стандартный вывод, и это то, что следует учитывать.
Aditsu уйти, потому что SE зла
@aditsu На самом деле я сделал это больше для удовольствия, чем для участия в соревновании, и использование LeafCountпоказалось мне гораздо более интересным, чем использование количества символов (что подразумевало бы скучную манипуляцию кодом как манипулирование строками). :-) Я не собираюсь менять его, чтобы использовать количество символов, но я могу удалить его без каких-либо плохих чувств, если хотите.
Сабольч
А ну понятно. Просто оставьте это тогда, нет необходимости удалять.
Aditsu уйти, потому что SE зла