C'était amusant! Cependant, avec seulement trois chiffres, le plaisir était trop tôt. Ce défi est similaire, mais nous continuerons à nous amuser.
Le défi
Imprimez autant de chiffres du nombre d' or Golden que possible. Le Golden Ratio est défini comme le nombre qui satisfait φ = (φ + 1) / φ et les 100 premiers chiffres sont donnés par:
1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375 ...
Ce défi ne concerne pas l' informatique! Il s'agit d'imprimer autant de chiffres que possible sans utiliser aucune méthode pour le faire deux fois. Alors, trouvez autant de façons créatives d'obtenir vos chiffres que vous le pouvez!
Restrictions
En soi, imprimer les chiffres de φ serait un peu trop simple, voici donc les règles:
- Vous devez construire le nombre dans l'ordre de gauche à droite , soit en l'imprimant pièce par pièce, soit en construisant une chaîne de gauche à droite et en l'imprimant à la fin - vous pouvez même générer un tableau de caractères numériques, puis le joindre et imprimez-le, tant que vous le faites dans l'ordre. Dans les règles suivantes, "print" et "output" peuvent faire référence à n'importe lequel de ces processus (par exemple, si vous créez une chaîne et que la chaîne contient
1.6
qui compte comme ayant1.6
déjà été imprimée). - Pour votre code, vous obtenez un budget de 15 caractères par chiffre . La période ne compte pas dans ce budget, mais doit également être imprimée. Notez que la restriction concerne uniquement la taille totale du code: vous pouvez utiliser plus de 15 caractères pour n'importe quel chiffre tant que vous n'en utilisez pas plus en moyenne. En fait, vous pouvez accumuler une "dette" en caractères et "la rembourser" plus tard. Par exemple, pour imprimer,
1.618
vous avez 60 caractères. - Les inclusions / importations de la bibliothèque standard ne comptent pas dans la taille du code. Mais vous ne pouvez pas donner ces alias raccourcis gratuitement!
- Vous ne devez pas utiliser le chiffre que vous générez actuellement, ni aucun que vous avez déjà imprimé. Par exemple, il ne
1
peut apparaître nulle part dans votre code source, car il s'agit du tout premier chiffre. Le code qui émet le8
en1.618
peut utiliser tout ou partie des chiffres[0234579]
, mais aucun d' entre[168]
. À cette fin, tous les littéraux équivalents à un seul chiffre sont traités comme ce chiffre . Donc, si votre langue peut représenter9
car'\t'
vous n'êtes pas autorisé à l'utiliser n'importe où, où vous ne pouvez pas utiliser un à la9
place. - Vous ne devez pas produire plusieurs chiffres à la fois. Il devrait être possible de diviser clairement votre code en morceaux qui génèrent un chiffre à la fois.
Vous ne devez pas se référer à tout intégré dans lequel vous avez la fonction, opérateur / chaîne mathématique / booléenne / bit-wise, variable ou constante utilisée dans le code qui a généré un chiffre plus tôt. Les exceptions sont la conversion d'entier en chaîne, la concaténation de chaîne et les fonctions d'impression dont vous pourriez avoir besoin pour chaque chiffre. Notez que peu importe le nom auquel vous faites référence à n'importe quel intégré: simplement parce que vous alias un intégré
PI
aux deuxp
etq
ne signifie pas que vous pouvez l'utiliserp
uneq
fois. De même, vous êtes autorisé à utiliser un nom deux fois s'il fait référence à deux éléments intégrés différents, comme une chaînelength
et un tableaulength
.Si votre langage de programmation n'a pas de fonctions, utilisez votre meilleur jugement sur ce que serait l'équivalent - par exemple pour les scripts bash, invoquer d'autres programmes devrait suivre les règles imposées aux fonctions
- Votre soumission doit être rédigée dans une seule langue. Il n'est donc pas nécessaire d'exécuter l'interpréteur d'une autre langue pour accéder également aux fonctions intégrées de cette langue.
Implications
Les points suivants sont tous impliqués par les règles ci-dessus, mais je les ajoute ici pour éviter les questions qui se sont déjà posées dans le bac à sable:
- Vous n'êtes pas autorisé à écraser des parties de votre sortie en imprimant des espaces arrière (généralement
'\b'
) entre les deux. - Les boucles qui génèrent / produisent plusieurs chiffres sont interdites. (Les boucles qui calculent un seul chiffre sont bien, cependant.)
- Il
(1 + √5)/2
est interdit d' utiliser une version obscurcie ou de diviser des nombres de Fibonacci pour obtenir plus d'un chiffre. - Vous ne pouvez pas précalculer les 10 chiffres et les stocker dans 10 variables, puis vous y référer, car ces références de variables ne génèrent pas le chiffre - le code qui remplit la variable le fait, c'est donc une violation de la règle 6.
- En fait, vous ne pouvez pas réutiliser les résultats précédents (ou intermédiaires), car cela signifierait que deux chiffres partageraient le code pour être généré .
- Sinon, vous pouvez utiliser n'importe quel moyen (qui ne doit pas être purement mathématique) pour générer les chiffres. (Et vous devriez!)
- En fait, il n'est pas nécessaire de calculer quoi que ce soit, si vous pouvez extraire les chiffres corrects de nombreux endroits différents en utilisant votre bibliothèque standard.
- Vous pouvez utiliser un opérateur plusieurs fois tout en générant un seul chiffre, il
2+2+2
est donc juste de générer le premier6
(bien qu'il soit peu probable qu'il soit le plus court). - Vous pouvez utiliser n'importe quel littéral aussi souvent que vous le souhaitez, car ce ne sont pas des constantes intégrées. Donc, tant que vous n'avez pas à imprimer
5
, vous pouvez autant de5
s dans votre code que vous le souhaitez. - Vous ne pouvez pas coder en dur la sortie, car cela impliquerait d'utiliser les chiffres que vous sortez.
En bref: n'utilisez aucune méthode de génération de chiffres deux fois et n'utilisez pas le chiffre que vous êtes en train de produire ou que vous avez déjà imprimé.
Si vous repérez une faille qui vous permet d'obtenir un score (quasi-) infini, veuillez ne pas gâcher le défi en l'exploitant, mais faites-le moi savoir afin que je puisse voir si la faille peut être corrigée sans rien casser.
Notation
Le programme qui imprime correctement le plus grand nombre de chiffres gagne. En cas d'égalité, le code le plus court rompt l'égalité.
Veuillez ajouter une version commentée non golfée qui identifie quelle partie de votre code génère quel chiffre.
PS: Si quelqu'un bat les 100 chiffres ci-dessus, en voici d'autres .
la source
x = (x+1)/x
(oux^2 = x+1
) (oux^2-x+1
).Réponses:
PHP, 100 chiffres
Je plie probablement les règles un peu ici, mais PHP a des dizaines de constantes parmi lesquelles choisir:
Ce code n'est probablement pas très portable, mais il fonctionne très bien sur mon système. Voici le code qui l'a généré:
la source
<?for(;;);
utilise 9 Mo de mémoire. Maintenant, je sais pourquoi ... J'aime bien la restriction auto-imposée # 7 de @ kernigh, qui ferme ce genre d'échappatoire. De plus, pour ce que ça vaut, la sortie sur mon système est la suivante: codepad.org/wSrtJBcoPerl - 37 chiffres
392 octets actuellement (10,6 par chiffre).
Sortie:
Restrictions auto-imposées
J'ai ajouté quelques restrictions supplémentaires pour limiter l'utilisation des fonctionnalités linguistiques qui banaliseraient le problème. Par exemple, le déréférencement de tableau
@{...}
et l'index final de tableau$#{...}
ne sont utilisés qu'une seule fois. Chaque réseau utilisé est généré d'une manière différente (comparer[c,c,c,c]
,[b..j]
,split('',$~)
,map(glob,"{,,,}{,}")
). De plus, aucun symbole ou mot nu n'est utilisé plus d'une fois, bien que cela soit explicitement autorisé dans la description du défi. Je pense que c'est une bonne idée pour perl (ou tout langage avec des variables spéciales uniquement int (y en a-t-il d'autres?)), Car cela limite le nombre de conversions int implicites.Pièces
la source
Python 2.7, 19 chiffres, 231 caractères pertinents
la source
Ruby 2.1 pour 54 chiffres, 808 caractères
Ce programme fonctionne avec
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-openbsd]
. Les systèmes autres qu'OpenBSD 5.5 peuvent avoir des valeurs différentes pour quelques chiffres.Interprétations
Les restrictions de ce défi, en particulier la restriction 6, ne sont pas précises pour Ruby. J'ajoute donc mes propres interprétations:
$<.fileno
, et le double signe deux points obtient des constantes, comme dansIO::LOCK_NB
. Le nom de la méthode ou de la constante fait partie de l'opération. Parce que ce()
.
::
ne sont pas des opérateurs, je ne leur applique pas la restriction 6. Je peux les réutiliser pour générer plus de chiffres.Array#count
etEnumerable#count
ne sont pas la même fonction pour la restriction 6. Les deux méthodes agissent de la même manière, maisArray#count
remplacentEnumerable#count
avec une implémentation différente. Si j'utiliseArray#count
pour générer un chiffre, je peux utiliserEnumerable#count
pour générer un autre chiffre.Mutex.new
,Random.new
,Time.new
et ainsi de suite se référer à la même méthode,Class#new
. J'utiliseSignalException.new
pour générer un chiffre. En raison de la restriction 6, je ne pourrai plus jamais l'utiliserClass#new
.Float
etIO
sont des constantes! J'utiliseIO::LOCK_NB
pour générer un chiffre. En raison de la restriction 6, je ne pourrai plus jamais l'utiliserIO
. Cette interprétation ne lie que Ruby et pas d'autres langages où les noms de package ne sont pas des constantes.[]
{}
//
''
. Je peux toujours utiliser ces littéraux pour générer plus de chiffres.File::APPEND
etIPSocket::LOCK_UN
sont deux noms pour le même numéro 8. La restriction 6 dit, "peu importe le nom auquel vous vous référez à n'importe quel intégré." Parce queFile::APPEND
etIPSocket::LOCK_UN
ne diffèrent que par leur nom, ils doivent être la même constante, donc je ne peux pas les utiliser pour deux chiffres.$SAFE
est une variable globale intégrée, pas une fonction, un opérateur, une constante ni un littéral.$SAFE
a la valeur 0. Avec l'échappatoire, je peux réutiliser$SAFE
pour générer chaque chiffre 0 dans le programme. Je ferme l'échappatoire en interprétant la restriction 6 pour restreindre également les variables globales.commentaires
La première ligne est
#!ruby -rdate -rdigest -ropenssl -rprime -rset -rsocket
. Ruby analyse cette ligne et charge six parties de sa bibliothèque standard, comme sirequire 'date'
,require 'digest'
et ainsi de suite. Je ne compte pas ces 56 caractères, car la restriction 3 exempte les "importations / inclusions de bibliothèque standard".Le reste du programme appelle
print
avec une longue liste d'arguments, pour les convertir en chaînes et les afficher dans l'ordre. Les arguments sont les suivants:1
from2/2
: division Fixnum # /.
from?.
: chaîne littérale à un caractère6
de9-3
: soustraction Fixnum # -1
de3&5
: au niveau du bit et Fixnum # &3
nouveau.8
de2*4
: multiplication Fixnum # *0
de2^2
: bitwise exclusive-ou Fixnum # ^3
de7%4
: module Fixnum #%3
de55>>4
: décalage à droite Fixnum # >>9
de5+4
: addition Fixnum # +8
de2<<2
: décalage à gauche Fixnum # <<8
de-~7
: négation du complément Fixnum # - @ Fixnum # ~7
de5|2
: au niveau du bit ou Fixnum # |4
de2**2
: exponentiation Fixnum # **9
de(2r+2+5).to_i
: addition rationnelle Rational # + Rational # to_i2r
sont nouveaux dans Ruby 2.1.2r+2
appelle Rational # + et renvoie un autre rationnel;2r+2+5
appelle Rational # + .2/1
et flotte comme2.0
. Pour résoudre ce problème, je convertis en entier: to_i arrondit vers zéro, ceil arrondit vers le haut, sol arrondit vers le bas.8
de(2.2+5).ceil
: ajout de flotteur Float # + Float # ceil()
à.
nouveau des parenthèses et des points .9
de(55r/5-2).floor
: division et soustraction rationnelles Rational # / Rational # - Rational # floor4
de(2.2*2).to_i
: float multiplication Float # * Float # to_i8
de(2r*2*2).ceil
: multiplication rationnelle Rational # * Rational # ceil4
de(2.2**2).floor
: exponentiation rationnelle rationnelle # **8
de2.to_bn<<2
: décalage à gauche avec un grand nombre OpenSSL Fixnum # to_bn OpenSSL :: BN # <<2
de__LINE__
: constante magique pour le numéro de ligne actuel0
from$<.to_i
: descripteur de fichier de l'entrée standard IO # to_i4
fromIO::LOCK_NB
: indicateur de verrouillage de fichier non bloquantIO
. Selon l'interprétation 7, je ne peux plus utiliser de constante de valeur 4.5
deErrno::EIO::Errno
: numéro pour l'erreur d'entrée / sortie8
deFile::APPEND
: indicateur à ajouter à un fichierIO
, maisFile
hérite des constantes deIO
,File::APPEND
est donc une façon différente d'obtenirIO::APPEND
.6
from'aaaaaa'.size
: longueur de la chaîne String # taille8
from?a.encoding.name.sub(/\D+/,'')
: partie du nom de l'encodage String # encoding Encoding # name String # sub3
à partir de%w[a a a].size
: longueur du tableau Taille du tableau #4
from%w[a b c d].to_set.size
: nombre d'éléments dans set Array # to_set Set # size3
de%w[a a a].count
: compter tous les éléments Tableau # count6
deSocket::AF_NS
: numéro pour la famille d'adresses NS5
à partir deDate.jd(Date::ITALY).wday
: numéro de semaine du vendredi 15 octobre 1582, date à laquelle l'Italie est passée au calendrier grégorien Date :: jd Date # wday6
de*Digest::MD5.digest(?j).scan(/\d/)
: premier chiffre ASCII dans le résumé binaire MD5 du résumé "j" :: MD5 :: digest String # scan*
passe les éléments du tableau comme arguments àprint
. Ce tableau est ["6"].3
fromSet[?a,?b,?c].count
: compter tous les éléments Set :: [] Enumerable # count8
deSignalException.new('FPE').signo
: nombre de SIGFPE Classe # nouveau SignalException # signo1
deFloat::ROUNDS
: mode d'arrondi, ici 1 pour arrondir au plus proche1
debegin
(nouvelle ligne)exit false
(nouvelle ligne)rescue Object
(nouvelle ligne)$!.status
(nouvelle ligne)end
: quitter l'état pour échecSystemExit.new(false).status
, mais selon l'interprétation 3, je ne peux plus appeler Class # new . Au lieu de cela, je lève et sauve un SystemExit.7
deProcess::RLIMIT_NPROC
: nombre pour la limite de ressources pour le nombre de processus pour un utilisateur7
de:aaaaaaa.size
: longueur du symbole Symbole # taille2
dePrime.first
: premier nombre premier Enumerable # first0
de?/.next
: chaîne suivante après "?" Chaîne # suivante3
à partir de{a:p,b:p,c:p}.size
: longueur du hachage Hash # taille String # p0
deSTDIN.lineno
: numéro de ligne actuel pour l'entrée standard IO # lineno$<
. J'utiliseSTDIN
. La différence est qu'il$<
s'agit d'une variable globale et d'STDIN
une constante. Un programme peut être réglé$<
sur une entrée différente, mais ilSTDIN
s'agit toujours de la valeur d'origine de$<
.3
de?a.crypt('at')[/\d/]
: premier chiffre ASCII dans le mot de passe crypté String # crypt String # []0
from{a: :a}.find_index([:a,:a])
: index de la première clé: a, valeur: a in hash Enumerable # find_index9
from/b/=~'aaaaaaaaab'
: index où la chaîne correspond à / b / Regexp # = ~1
from[?a,?b].index(?b)
: index du premier "b" du tableau Array # index7
from:aaaaaaab=~/b/
: index où le symbole correspond / b / Symbol # = ~9
from?\t.ord
: valeur ASCII de l'onglet "\ t" String # ord8
from'aaaaaaaab'=~/b/
: index où la chaîne correspond à / b / String # = ~0
fromopen(?/).pos
: position dans le fichier après ouverture du répertoire racine "/" en tant que fichier Kernel # open IO # pos5
from'aaaaab'.index(?b)
: index du premier "b" dans la chaîne String # index7
de?\a.bytes{|b|break b}
: valeur ASCII de l'alerte "\ a" chaîne # octets6
from'aaaaaaa'.rindex(?a)
: index du dernier "a" dans la chaîne String # rindex2
from%w[a a].map.size
: taille de l'énumérateur qui mappe à partir du tableau Array # map Enumerator # sizela source
new
Appelle- t-on vraiment toujours la même implémentation ou est-elle remplacée dans les sous-classes? [ctd.]Java, 21 chiffres, 276 caractères
la source
7-4
&-4+7
, c'est intelligent! :)7
n'est pas une constante mais un littéralRuby, 74 caractères, 10 chiffres
Ce n'est qu'un début; Je dois y aller donc je vais l'améliorer plus tard.
J'ai 76 caractères enregistrés pour plus tard, quand cela deviendra plus difficile!
la source
Ruby, 17 chiffres, 168 octets
Non golfé:
Je n'ai pas encore été obligé de faire quelque chose de particulièrement intelligent, je peux revenir et ajouter des chiffres.
la source
succ
etnext
sont des alias.$.
deux fois. Bien, je dois aimer$....
: DGolfscript , 17 chiffres
Une tentative simple. Golfscript peut avoir beaucoup de fonctions intégrées non alphanumériques à une lettre, mais il n'a pas beaucoup de fonctions intégrées dans leur ensemble!
la source
5,)\; # range, right uncons, flip, and pop
.Bash, 5 chiffres en 65 caractères
Je mettrai cela à jour bientôt! Pour l'instant, il imprime juste
1.6180
et ne contient aucun chiffre.Explication
Les méthodes suivantes sont utilisées pour générer les chiffres:
1: état de sortie de
false
6: longueur de chaîne
1:
nl
abus8:
kill
numéros de signaux0: valeur numérique d'une expression vide
la source
Mathematica
98 chiffres, en868378 caractères.Sortie:
la source
#
par un chiffre permis, et laisser tomber l' un des tirets.Julia - 23 chiffres en 345 caractères (15 par chiffre exactement)
Sortie: 1.6180339887498948482045
J'ai interprété les caractères et les chaînes comme utilisables, tant que je n'ai pas réutilisé un caractère ou une chaîne spécifique (les caractères d'une chaîne pouvaient être réutilisés, tant que la chaîne ne l'était pas); cependant, je ne me suis pas permis d'utiliser directement la valeur int d'un caractère. Il y a un caractère non ASCII (©).
De manière plus lisible (pas de code réel):
la source
C ++ 12,4 caractères par ligne, soit 14 caractères par ligne pour chaque chiffre
Correction de mon erreur de réutilisation des opérateurs.
Vous ne savez pas si l'utilisation de caractères comme celui-ci compte comme des littéraux de caractères ou non? Si ce code est acceptable, il peut être poursuivi indéfiniment et la dette d'omble sera remboursée.
la source
-
opérateur. De plus, j'aime la façon dont vous avez compté le commentaire pour la longueur de la ligne. : D1
pour produire un0
(ce qui est interdit, car il1
est apparu plus tôt dans le nombre d'or). Vous devez également compter le#define S
(pas l'autre), car ce n'est pas une inclusion mais juste la définition d'un alias abrégé.