Durée du programme Fibonacci

14

Écrivez un programme de longueur n qui génère un autre programme dont la longueur est le prochain numéro de Fibonacci après n. Le nouveau programme doit faire la même chose - la sortie d' un autre programme dont la longueur est le numéro suivant Fibonacci, etc.
n lui - même (la longueur du programme original) ne doit pas être un certain nombre de Fibonacci, bien que ce serait bien si elle est.

Le code le plus court gagne.

Aucune ressource externe, ASCII uniquement, compilateur / interprète gratuit requis.
Si votre sortie se termine par une nouvelle ligne, elle est également comptée.

aditsu quitte parce que SE est MAL
la source
Est-ce que cela doit continuer indéfiniment? ( intou BigInteger)
Justin
1
@Quincunx c'est ok s'il cesse de fonctionner à la limite de int ou à la limite du compilateur / interprète, selon la première éventualité. Je m'attends cependant à ce qu'il atteigne 10000+.
aditsu quitte car SE est EVIL
1
Y a-t-il des restrictions sur l'utilisation des espaces ou des commentaires ou des noms de variable / fonction / classe arbitrairement longs dans les programmes originaux ou produits par la suite?
Jonathan Pullano
1
Le programme peut-il lire son propre code source, ou recherchez-vous une véritable quasi-quine?
histocrate
@JonathanPullano aucune restriction, ils doivent juste être des programmes valides
aditsu quitte car SE est EVIL

Réponses:

5

CJam, 26 23

Je viens de faire un essai avec votre langue.

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

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

Il calcule sa propre longueur *1.618au lieu d'ajouter plusieurs fois les deux nombres. Dans la première version, il remplira la sortie avant {like 1))))))))), qui compte ces caractères eux-mêmes. Dites le résultat n. La longueur totale est n+22et la nouvelle longueur avant {doit être (n+22)*1.618-22arrondie. Diminuez-le de un pour compter le nombre de ). Il sera alors approximativement égal à (n+8)*1.618.

Ancienne version:

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

Le nombre 14 est 24*0.618 + 0.5 - 1.

jimmy23013
la source
Très impressionnant!
Dennis
Je pense que nous avons un nouveau gagnant :)
aditsu quitte car SE est EVIL
7

Python 2, 160 octets

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`

C'est une véritable quasi-quine; il ne lit pas sa propre source, mais il la génère. Première sortie (a une nouvelle ligne de fin):

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

Seconde:

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

Edit: Oups. J'ai oublié de changer la chaîne lorsque je suis passé de ;s à 1s, donc la deuxième sortie produisait des points-virgules supplémentaires (que Python ne prend pas en charge). Fixé

Justin
la source
J'ai peur que ça cesse de fonctionner après environ 3 itérations ...
aditsu quitte car SE est EVIL
@aditsu Quoi? Python a une limite sur la taille d'un entier?! (ou est-ce que le compte n'est pas un fibonacci / saute / autre chose?) Oh, attendez. Duh. J'ai oublié de changer la chaîne XD
Justin
7

CJam, 41 31 octets

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

Essayez-le en ligne.

Production

$ 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

Comment ça fonctionne

{       "                                                   {…} 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
la source
2
Sympa, confirmé jusqu'à 1 million :) Je pense que c'est 37 au lieu de 39 dans l'explication.
aditsu quitte car SE est EVIL
@aditsu: Je n'ai pas remarqué que vous avez modifié votre commentaire jusqu'à présent. Il devrait en effet être 37, merci.
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)#####

Mon nombre de personnages parfait est parti . ; _; Merci à TheRare pour avoir souligné la nouveauté et Quincunx pour avoir suggéré d'utiliser Python 2, en rasant 2 caractères.

EDIT : utilise maintenant plus de #s au lieu de 1s; 12 caractères plus courts.

EDIT 2 : 94 caractères! Élimine certaines répétitions. >: 3

EDIT 3 : Alternative de représentation plus courte pour Python 2.

EDIT 4 : La sortie est un caractère plus court maintenant.

EDIT 5 : L'utilisation de%r pour le raccourcir a été tirée d'une réponse à une autre question de @primo.

EDIT 6 : Plus court. :RÉ

Voici une version 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)####

Cette réponse est similaire à celle de @Quincunx.

cjfaure
la source
printajoute toujours une nouvelle ligne, sauf si vous spécifiez un end=''argument.
seequ
Pourquoi ne pas utiliser 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 je le ferai! Merci: D
cjfaure
Votre programme de 90 caractères ne fonctionne pas avec python 3 et a une sortie de 145 caractères (pas un numéro de Fibonacci)
aditsu quitte car SE est EVIL
@aditsu Fixed. : 3
cjfaure
2

JavaScript, 94

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

Basé sur un Quine JavaScript bien connu , cela retourne presque la même fonction, suivie seulement par une quantité de barres obliques, de sorte qu'elle résume jusqu'à 144 qui est le prochain numéro de Fibonacci après N. Et ainsi de suite ...

N n'est pas un numéro de Fibonacci, mais c'était seulement "agréable à avoir".

Jacob
la source
Il ne semble pas fonctionner correctement quand il passe 1000
aditsu quitte parce que SE est EVIL
1000 quoi? Itérations?
Jacob
Non, durée du programme
aditsu quitte car SE est EVIL
Hmm ... Je le testais dans la console de Chrome, en utilisant p = (my answer)puis p = eval(p)plusieurs fois, et j'ai obtenu jusqu'en 196418 ... après que le temps de traitement était> 1 seconde, j'ai donc arrêté de tester: P Mais je suppose que cela peut continuer encore plus.
Jacob
Vous ne comprenez pas .. Je n'ai pas dit que ça s'arrête ou que c'est trop lent. J'ai dit que ça ne fonctionnait pas correctement. Ne vous contentez pas de le faire p=eval(p), vérifiez également p.length. Après avoir atteint 987, j'obtiens la longueur 1598, pas un numéro de Fibonacci.
aditsu quitte car SE est EVIL
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]
 ]) &

Il s'agit d'une implémentation très simple (c.-à-d. Pas d'obscurcissement ici). Il s'agit d'une fonction anonyme qui se retourne avec un peu de rembourrage pour obtenir la bonne longueur. Mathematica est homoiconique: le code et les données sont tous deux représentés sous la forme d'expressions Mathematica, ce qui facilite la modification / génération de code à la volée. Cela signifie également que le nombre de caractères n'est pas une mesure naturelle de la longueur du code. La taille d'épaisseur ( "nombre de feuilles" ) est. Cette version est basée sur le nombre de feuilles comme mesure de longueur de code.

Si nous assignons cette fonction anonyme à une variable f(pour que je puisse montrer ce qui se passe de manière lisible), et continuons à l'appeler 1, 2, 3, ... fois, en mesurant chaque fois la longueur de la valeur de retour, c'est ce que on a:

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

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

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

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

Concernant l'exigence d'interprète gratuit: Mathematica est gratuit pour le Raspberry Pi. Sinon, ce code devrait être simple à porter en mathématiques (open source) . La seule chose qui manque aux mathématiques est InverseFunction, qui peut être remplacée comme ici (mais je suis paresseux :).

Szabolcs
la source
Wow, je ne savais pas que Mathematica était gratuit pour le Pi, je devrais le vérifier. Cependant, le programme est censé imprimer des caractères sur la sortie standard, et c'est ce qui doit être compté.
aditsu quitte car SE est EVIL
@aditsu En fait, je l'ai fait plus pour le plaisir que pour participer au défi, et l'utilisation LeafCountsemblait beaucoup plus intéressante que l'utilisation du nombre de caractères (ce qui impliquerait une manipulation de code ennuyeuse comme une manipulation de chaîne). :-) Je ne vais pas le changer pour utiliser le nombre de caractères, mais je peux le supprimer sans aucune mauvaise impression si vous le souhaitez.
Szabolcs
Oh je vois. Laissez-le simplement alors, pas besoin de le supprimer.
aditsu quitte car SE est EVIL