Тривалість програми Фібоначчі


14

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

Найкоротший код виграє.

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


Чи потрібно це продовжувати назавжди? ( intабо BigInteger)
Джастін

1
@Quincunx це нормально, якщо він перестає працювати за межею int чи лімітом компілятора / інтерпретатора, залежно від того, що відбувається раніше. Я очікую, що він досягне 10000+.
aditsu кинути, тому що SE - EVIL

1
Чи існують обмеження у використанні пробілів чи коментарів або довільно довгих імен змін / функцій / класів в оригінальних або згодом створених програмах?
Джонатан Пуллано

1
Чи може програма читати власний вихідний код чи шукаєте справжню квазікінету?
гістократ

@JonathanPullano немає обмежень, вони просто повинні бути дійсними програмами
aditsu quit тому, що SE - EVIL

Відповіді:


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.


Дуже вражає!
Денніс

Я думаю, у нас є новий переможець :)
aditsu кинув, бо SE - EVIL

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 не підтримує). Виправлено


Я боюся, що вона перестане працювати після приблизно трьох ітерацій ...
aditsu кинув, бо SE

@aditsu Що? Python має обмеження на величину цілого числа ?! (чи це, що підрахунок не є полем / пропускає / щось інше?) О, зачекайте. Дух. Я забув змінити рядок 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 - EVIL

@aditsu: Ви не помічали, що ви редагували свій коментар. Справді, це повинно бути 37, дякую.
Денніс

6

Пітон - 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 символи.

EDIT : Тепер просто використовується більше #s замість 1s; На 12 символів коротше.

ЕДИТ 2 : 94 символів! Усунуто деяке повторення. >: 3

EDIT 3 : Коротша альтернатива перевидання для Python 2.

EDIT 4 : Вихід є символом коротшим.

EDIT 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.


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-char програма не працює з python 3, і має 145-знаковий вихід (не число Фібоначчі)
aditsu вийшов, тому що SE - EVIL

@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 - EVIL

1000 що? Ітерації?
Яків

Ні, тривалість програми
aditsu кинути, тому що SE - EVIL

Хм ... я тестував його в консолі Chrome, використовуючи, p = (my answer)а потім p = eval(p)пару разів, і потрапляв до 196418 ... після цього час обробки був> 1сек, тому я кинув з тестування: P Але я думаю, це може продовжуватися ще більше.
Яків

Ви не розумієте .. Я не сказав, що вона перестає працювати або це занадто повільно. Я сказав, що це працює не правильно. Не просто роби p=eval(p), також перевіряй p.length. Після досягнення 987 я отримую довжину 1598, а не число Фібоначчі.
aditsu кинути, тому що SE - EVIL

0

Математика

({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 (відкритий код) . Єдине, чого не вистачає в Mathics, це те InverseFunction, що можна замінити як тут (але я лінивий :).


Нічого собі, я не знав, що Mathematica безкоштовна для Pi, я повинен це перевірити. Однак програма повинна друкувати символи на стандартний вихід, і це те, що слід врахувати.
aditsu кинути, тому що SE - EVIL

@aditsu Насправді я робив це більше для розваги, ніж для змагання у виклику, і використання LeafCountздалося набагато цікавішим, ніж використання підрахунку символів (що означало б нудну маніпуляцію кодом як маніпуляцію з рядками). :-) Я не збираюся змінювати його на використання символів, але я можу видалити його без жодних поганих почуттів, якщо бажаєте.
Szabolcs

О Я бачу. Просто залиште його тоді, не потрібно видаляти.
aditsu кинути, тому що SE - EVIL

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