Długości programu Fibonacciego

14

Napisz program o długości n, który wypisze inny program, którego długość jest następną liczbą Fibonacciego po n. Nowy program musi zrobić to samo - wypisać inny program, którego długość jest następną liczbą Fibonacciego itp.
N sam (długość oryginalnego programu) nie musi być liczbą Fibonacciego, chociaż byłoby miło, gdyby tak było.

Najkrótszy kod wygrywa.

Brak zasobów zewnętrznych, tylko ASCII, wymagany bezpłatny kompilator / interpreter.
Jeśli twój wynik kończy się na nowej linii, jest również liczony.

aditsu zrezygnowało, ponieważ SE jest ZŁEM
źródło
Czy to musi trwać wiecznie? ( intlub BigInteger)
Justin
1
@Quincunx jest ok, jeśli przestanie działać na limicie int lub limicie kompilatora / tłumacza, w zależności od tego, co nastąpi wcześniej. Oczekuję jednak, że osiągnie ponad 10000.
Aditsu zakończyło się, ponieważ SE jest EVIL
1
Czy istnieją ograniczenia w stosowaniu białych znaków lub komentarzy lub dowolnie długich nazw zmiennych / funkcji / klas w oryginalnych lub później wyprodukowanych programach?
Jonathan Pullano
1
Czy program może odczytać własny kod źródłowy, czy szukasz prawdziwej quasi-quine?
histocrat
@JonathanPullano bez ograniczeń, muszą być tylko poprawnymi programami
aditsu zakończyło się, ponieważ SE to EVIL

Odpowiedzi:

5

CJam, 26 23

Właśnie spróbowałem z twoim językiem.

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

9 jest (22*0.618 + 0.5 - 1)/1.618 + 1.

Oblicza własną długość *1.618zamiast wielokrotnie dodawać dwie liczby. W pierwszej wersji wypełni dane wyjściowe przed {polubieniem 1))))))))), co zlicza same postacie. Powiedz wynik n. Całkowita długość jest n+22, a nowa długość {powinna być (n+22)*1.618-22zaokrąglona. Zmniejsz go o jeden, aby policzyć liczbę ). Wtedy będzie w przybliżeniu równy (n+8)*1.618.

Starsza wersja:

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

Liczba 14 to 24*0.618 + 0.5 - 1.

jimmy23013
źródło
Bardzo imponujące!
Dennis
Myślę, że mamy nowego zwycięzcę :)
Aditsu zrezygnowało, ponieważ SE jest EVIL
7

Python 2, 160 bajtów

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`

To jest prawdziwa quasi-quine; nie odczytuje własnego źródła, ale je generuje. Pierwsze wyjście (ma końcowy znak nowej linii):

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

Druga:

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

Edycja: Ups. Zapomniałem zmienić ciąg, kiedy zmieniłem ;s na 1s, więc drugie wyjście wyświetlało dodatkowe średniki (których Python nie obsługuje). Naprawiony

Justin
źródło
Obawiam się, że przestaje działać po około 3 iteracjach ...
Aditsu zrezygnowało, ponieważ SE to EVIL
@aditsu Co? Python ma limit rozmiaru liczby całkowitej ?! (czy jest tak, że liczba nie jest fibonacci / pomija / coś innego?) Och, czekaj. Duh. Zapomniałem zmienić ciąg XD
Justin
7

CJam, 41 31 bajtów

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

Wypróbuj online.

Wynik

$ 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

Jak to działa

{       "                                                   {…} 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$~'   ";
Dennis
źródło
2
Fajnie, potwierdzono do 1 miliona :) Myślę, że to 37 zamiast 39, chociaż w wyjaśnieniu.
Aditsu zakończyło się, ponieważ SE to EVIL
@aditsu: Dopiero teraz zauważyłem, że edytowałeś swój komentarz. Dzięki, powinno być 37.
Dennis
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)#####

Moja idealna liczba postaci zniknęła . ; _; Dzięki TheRare za wskazanie nowej linii i Quincunx za zasugerowanie, że używam Pythona 2, goląc 2 znaki.

EDYCJA : Teraz używa więcej #s zamiast 1s; 12 znaków krótszy.

EDYCJA 2 : 94 znaków! Wyeliminowano niektóre powtórzenia. >: 3

EDYCJA 3 : Krótsza repr alternatywa dla Python 2.

EDYCJA 4 : Wyjście jest teraz postacią krótszą.

EDYCJA 5 : Zastosowanie %rskrótu zostało zaczerpnięte z odpowiedzi na inne pytanie @primo.

EDYCJA 6 : Krótsza. :RE

Oto wersja 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)####

Ta odpowiedź jest podobna do tej udzielonej przez @Quincunx.

cjfaure
źródło
printzawsze dodaje nowy wiersz, chyba że podasz end=''argument.
patrz
Dlaczego nie użyć 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'
Justin
@Quincunx I will! Dzięki: D
cjfaure
Twój 90-znakowy program nie działa z Pythonem 3 i ma wynik 145-znakowy (nie liczbę Fibonacciego)
aditsu zostało zakończone, ponieważ SE to EVIL
@aditsu Naprawiono. : 3
cjfaure
2

JavaScript, 94

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

Oparty na dobrze znanej Quinie JavaScript , zwraca prawie tę samą funkcję, po której następuje tylko liczba ukośników, tak że sumuje się do 144, co jest kolejną liczbą Fibonacciego po N. I tak dalej ...

N nie jest liczbą Fibonacciego, ale było tylko „miło mieć”.

Jakub
źródło
Wygląda na to, że nie działa poprawnie, gdy
przekroczy
1000 co? Iteracje
Jacob
Nie, długość programu
zakończenie aditsu, ponieważ SE to EVIL
Hmm ... Ja testowałem go w konsoli Chrome, używając p = (my answer), a następnie p = eval(p)kilka razy i dostał aż 196418 ... potem był czas obróbki> 1sek więc rzuciłem testowania: P Ale myślę, że może kontynuować nawet więcej.
Jacob
Nie rozumiesz ... Nie powiedziałem, że przestaje działać lub jest zbyt wolny. Powiedziałem, że to nie działa poprawnie. Nie tylko rób p=eval(p), sprawdź także p.length. Po osiągnięciu 987 otrzymuję długość 1598, a nie liczbę Fibonacciego.
Aditsu zakończyło się, ponieważ SE jest EVIL
0

Matematyka

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

Jest to bardzo prosta implementacja (tzn. Brak zaciemnienia tutaj). Jest to anonimowa funkcja, która zwraca się z odrobiną dopełnienia, aby osiągnąć odpowiednią długość. Mathematica jest homoikoniczna: zarówno kod, jak i dane są reprezentowane jako wyrażenia Mathematica, co sprawia, że ​​naprawdę łatwo jest modyfikować / generować kod w locie. Oznacza to również, że liczba znaków nie jest naturalną miarą długości kodu. Rozmiar epxresji ( „liczba liści” ) wynosi. Ta wersja opiera się na liczeniu liści jako miary długości kodu.

Jeśli przypiszemy tę anonimową funkcję do zmiennej f(abym mógł pokazać, co dzieje się w czytelny sposób) i będziemy ją wywoływać 1, 2, 3, ... razy, za każdym razem mierząc długość zwracanej wartości, to jest to, co otrzymujemy:

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

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

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

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

Jeśli chodzi o wymóg bezpłatnego tłumacza: Mathematica jest darmowa dla Raspberry Pi. W przeciwnym razie kod ten powinien być prosty do przeniesienia do Mathics (open source) . Brakuje tylko matematyki InverseFunction, którą można wymienić tak jak tutaj (ale jestem leniwy :).

Szabolcs
źródło
Wow, nie wiedziałem, że Mathematica jest darmowa dla Pi, powinienem to sprawdzić. Jednak program ma wypisywać znaki na standardowe wyjście i to należy liczyć.
Aditsu zakończyło się, ponieważ SE jest EVIL
@aditsu Właściwie zrobiłem to bardziej dla zabawy niż rywalizacji w wyzwaniu, a używanie LeafCountwydawało się o wiele bardziej interesujące niż liczenie znaków (co oznaczałoby nudną manipulację kodem jako manipulację ciągiem znaków). :-) Nie zamierzam go zmieniać, aby używać liczby znaków, ale mogę go usunąć bez żadnych złych uczuć, jeśli chcesz.
Szabolcs
Rozumiem. Po prostu zostaw to, nie trzeba usuwać.
Aditsu zostało zakończone, ponieważ SE to EVIL