¡Esto fue divertido! Sin embargo, con solo tres dígitos, la diversión terminó demasiado pronto. Este desafío es similar, pero mantendremos la diversión.
El reto
Imprima tantos dígitos de la Proporción Dorada φ como sea posible. La proporción áurea se define como el número que satisface φ = (φ + 1) / φ y los primeros 100 dígitos están dados por:
1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375 ...
Este desafío no se trata de computación φ! Se trata de imprimir tantos dígitos como sea posible sin usar ningún método para hacerlo dos veces. ¡Así que encuentra tantas formas creativas de obtener tus dígitos como puedas!
Restricciones
Por sí solo, imprimir los dígitos de φ sería demasiado simple, así que aquí están las reglas:
- Debe construir el número en orden de izquierda a derecha , ya sea imprimiéndolo pieza por pieza o construyendo una cadena de izquierda a derecha e imprimiéndolo al final; incluso podría generar una matriz de caracteres de dígitos y luego unirlos y imprímalo, siempre que lo haga en orden. En las siguientes reglas, "imprimir" y "salida" pueden referirse a cualquiera de esos procesos (por ejemplo, si está creando una cadena, y la cadena contiene 
1.6que cuenta que1.6ya se ha impreso). - Para su código , obtiene un presupuesto de 15 caracteres por dígito . El período no cuenta para ese presupuesto, pero también debe imprimirse. Tenga en cuenta que la restricción solo se aplica al tamaño total del código: puede usar más de 15 caracteres para cualquier dígito, siempre que no use más en promedio. De hecho, puede acumular una "deuda" en los personajes y "pagarla" más adelante. Por ejemplo, para imprimir 
1.618tienes 60 caracteres. - La biblioteca estándar incluye / importa no cuenta para el tamaño del código. ¡Pero no puedes dar esos alias abreviados de forma gratuita!
 - No debe usar el dígito que está generando actualmente, ni ninguno que ya haya impreso. Por ejemplo, 
1puede no aparecer en ninguna parte de su código fuente, porque es el primer dígito. El código que da salida a la8de1.618puede utilizar cualquiera o todos los dígitos[0234579], pero ninguno de[168]. Para este propósito, todos los literales que son equivalentes a un solo dígito se tratan como ese dígito . Entonces, si su idioma puede representarlo,9ya'\t'que no puede usarlo en ningún lugar, donde no podría usar uno9. - No debe producir varios dígitos a la vez. Debería ser posible dividir claramente su código en fragmentos que generen un dígito a la vez.
 No se debe hacer referencia a cualquier incorporada la función, el operador / secuencia matemática / boolean / bits sabia, variable o constante que se ha utilizado en el código que genera un dígito anterior. Las excepciones son la conversión de entero a cadena, la concatenación de cadenas y las funciones de impresión que puede necesitar para cada dígito. Tenga en cuenta que no importa con qué nombre se refiera a cualquier incorporado: solo porque alias un incorporado
PIa ambospyqno significa que pueda usarlopuna yqotra vez. Del mismo modo, está permitido el uso de un nombre dos veces si se refiere a dos muebles empotrados diferentes, como cadenalengthy la matrizlength.Si su lenguaje de programación no tiene funciones, use su mejor criterio sobre cuál sería el equivalente, por ejemplo, para bash scripting, la invocación de otros programas debe seguir las reglas impuestas a las funciones
- Su envío debe estar escrito en un solo idioma. Por lo tanto, no ejecutar el intérprete de otro idioma para obtener acceso a las funciones integradas de ese idioma también.
 
Trascendencia
Los siguientes puntos están implícitos en las reglas anteriores, pero los agrego aquí para evitar preguntas que ya han surgido en el sandbox ::
- No está permitido sobrescribir partes de su salida imprimiendo algunos espacios (generalmente 
'\b') en el medio. - Los bucles que generan / generan múltiples dígitos están prohibidos. (Sin embargo, los bucles que calculan un solo dígito están bien).
 (1 + √5)/2Está prohibido usar una versión ofuscada o dividir números de Fibonacci para obtener más de un solo dígito.- No puede calcular previamente los 10 dígitos y almacenarlos en 10 variables y luego solo referirse a ellos, porque esas referencias de variables no generan el dígito; el código que llena la variable sí lo hace, por lo que esto es una violación de la regla 6.
 - De hecho, no puede reutilizar ningún resultado anterior (o intermedio), porque eso significaría que dos dígitos compartirían el código para ser generado .
 - De lo contrario, puede utilizar cualquier medio (que no sea puramente matemático) para generar los dígitos. (¡Y deberías!)
 - De hecho, no es necesario calcular nada, si puede extraer los dígitos correctos de muchos lugares diferentes utilizando su biblioteca estándar.
 - Usted puede utilizar un operador varias veces mientras se genera un solo dígito, por lo que 
2+2+2es juego limpio para generar la primera6(aunque es poco probable que el más corto). - Usted puede utilizar cualquier literal con la frecuencia que desee, porque no son constantes integradas. Por lo tanto, siempre que no tenga que imprimir 
5, puede incluir tantos5s en su código como desee. - No puede codificar la salida, porque eso implicaría usar los dígitos que está generando.
 
En resumen: no use ningún método para generar dígitos dos veces y no use el dígito que está emitiendo actualmente o ninguno que ya haya impreso.
Si detecta un vacío que le permite obtener una puntuación (casi) infinita, no arruine el desafío explotándolo, pero avíseme para que pueda ver si el vacío puede solucionarse sin romper nada.
Tanteo
El programa que imprime el mayor número de dígitos gana correctamente. En caso de empate, el código más corto rompe el empate.
Agregue una versión comentada no escrita que identifica qué parte de su código genera qué dígito.
PD: Si alguien supera los 100 dígitos anteriores, aquí hay algunos más .
fuente

x = (x+1)/x(ox^2 = x+1) (ox^2-x+1).Respuestas:
PHP, 100 dígitos
Probablemente estoy doblando las reglas un poco aquí, pero PHP tiene docenas de constantes para elegir:
Probablemente este no sea un código muy portátil, pero funciona bien en mi sistema. Aquí está el código que lo generó:
fuente
<?for(;;);usa 9MB de memoria. Ahora sé por qué ... Sin embargo, me gusta la restricción autoimpuesta # 7 de @ kernigh, que cierra este tipo de escapatoria. Además, por lo que vale, la salida en mi sistema es la siguiente: codepad.org/wSrtJBcoPerl - 37 dígitos
392 bytes actualmente, (10.6 por dígito).
Salida:
Restricciones autoimpuestas
Agregué algunas restricciones adicionales para limitar el uso de las funciones del lenguaje que trivializarían el problema. Por ejemplo, la desreferencia de matriz
@{...}y el índice final de matriz$#{...}solo se usan una vez. Cada matriz utilizado se genera de una manera diferente (comparar[c,c,c,c],[b..j],split('',$~),map(glob,"{,,,}{,}")). Además, no se usa ningún símbolo ni palabra más de una vez, aunque esto está explícitamente permitido en la descripción del desafío. Creo que es una buena idea para Perl (o cualquier lenguaje con variables especiales solo int (¿hay alguna otra?)), Ya que limita el número de conversiones int implícitas.Piezas
fuente
Python 2.7, 19 dígitos, 231 caracteres relevantes
fuente
Ruby 2.1 para 54 dígitos, 808 caracteres
Este programa funciona con
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-openbsd]. Los sistemas que no sean OpenBSD 5.5 pueden tener valores diferentes para unos pocos dígitos.Interpretaciones
Las restricciones de este desafío, especialmente la restricción 6, no son precisas para Ruby. Entonces agrego mis propias interpretaciones:
$<.fileno, y el doble colon obtiene constantes, como enIO::LOCK_NB. El nombre del método o constante es parte de la operación. Como().::no somos operadores, no les aplico la restricción 6. Puedo reutilizarlos para generar más dígitos.Array#countyEnumerable#countno son la misma función para la restricción 6. Ambos métodos actúan igual, peroArray#countanulanEnumerable#countcon una implementación diferente. Si usoArray#countpara generar un dígito, puedo usarEnumerable#countpara generar otro dígito.Mutex.new,Random.new,Time.newy así sucesivamente se refieren al mismo método,Class#new. Yo usoSignalException.newpara generar un dígito. Debido a la restricción 6, es posible que nunca más vuelva a usarClass#new.FloatyIOson constantes! Yo usoIO::LOCK_NBpara generar un dígito. Debido a la restricción 6, es posible que nunca más vuelva a usarIO. Esta interpretación solo vincula a Ruby, y no a otros idiomas donde los nombres de paquetes no son constantes.[]{}//''. Siempre puedo usar tales literales para generar más dígitos.File::APPENDyIPSocket::LOCK_UNson dos nombres para el mismo número 8. La restricción 6 dice: "no importa con qué nombre se refiera a ninguno incorporado". DebidoFile::APPENDyIPSocket::LOCK_UNsólo se diferencian por su nombre, que debe ser la misma constante, por lo que no pueden utilizarlos para los dos dígitos.$SAFEes una variable global incorporada, no una función, operador, constante ni literal.$SAFEtiene el valor 0. Con la escapatoria, puedo reutilizar$SAFEpara generar cada dígito 0 en el programa. Cierro la escapatoria interpretando la restricción 6 para restringir también las variables globales.Comentarios
La primera línea es
#!ruby -rdate -rdigest -ropenssl -rprime -rset -rsocket. Ruby analiza esta línea y carga seis partes de su biblioteca estándar, como porrequire 'date',require 'digest'y así sucesivamente. No cuento estos 56 caracteres, porque la restricción 3 exime a "importación / inclusión de biblioteca estándar".El resto del programa llama
printcon una larga lista de argumentos, para convertirlos en cadenas e imprimirlos en orden. Los argumentos son estos:1from2/2: division Fixnum # /.from?.: cadena de un solo carácter literal6de9-3: resta Fixnum # -1desde3&5: bitwise y Fixnum # &3nuevo.8de2*4: multiplicación Fixnum # *0de2^2: bitwise exclusive-o Fixnum # ^3de7%4: módulo Fixnum #%3desde55>>4: desplazamiento a la derecha Fixnum # >>9de5+4: además Fixnum # +8desde2<<2: desplazamiento a la izquierda Fixnum # <<8de-~7: negación del complemento Fixnum # - @ Fixnum # ~7desde5|2: bitwise o Fixnum # |4de2**2: exponenciación Fixnum # **9de(2r+2+5).to_i: suma racional Racional # + Racional # to_i2rson nuevos en Ruby 2.1.2r+2llama a Rational # + y devuelve otro racional;2r+2+5llama a Rational # + nuevamente.2/1y flota como2.0. Para solucionar este problema, puedo convertir a entero: to_i rondas hacia cero, ceil rondas arriba, planta redondea hacia abajo.8desde(2.2+5).ceil: flotación adicional Float # + Float # ceil()y puntos.nuevamente.9de(55r/5-2).floor: división racional y resta Racional # / Racional # - Racional # piso4desde(2.2*2).to_i: multiplicación de flotación Float # * Float # to_i8de(2r*2*2).ceil: multiplicación racional # racional * * racional # ceil4de(2.2**2).floor: exponenciación racional Racional # **8desde2.to_bn<<2: desplazamiento a la izquierda con número grande de OpenSSL Fixnum # to_bn OpenSSL :: BN # <<2from__LINE__: constante mágica para el número de línea actual0from$<.to_i: descriptor de archivo de entrada estándar IO # to_i4fromIO::LOCK_NB: marca para bloqueo de archivo sin bloqueoIO. Por la interpretación 7, ya no puedo usar ninguna constante con el valor de 4.5fromErrno::EIO::Errno: número de error de entrada / salida8fromFile::APPEND: marca para agregar a un archivoIO, peroFilehereda constantes deIO, por lo queFile::APPENDes una forma diferente de obtenerIO::APPEND.6from'aaaaaa'.size: longitud de la cadena String # size8from?a.encoding.name.sub(/\D+/,''): parte del nombre de la codificación Cadena # codificación Codificación # nombre Cadena # sub3from%w[a a a].size: longitud de la matriz Array # size4from%w[a b c d].to_set.size: número de elementos en set Array # to_set Set # size3from%w[a a a].count: cuenta todos los elementos Array # count6deSocket::AF_NS: número para la familia de direcciones NS5desdeDate.jd(Date::ITALY).wday: número del día de la semana para el viernes 15 de octubre de 1582, cuando Italia cambió al calendario gregoriano Fecha :: fecha jd # día6de*Digest::MD5.digest(?j).scan(/\d/): primer dígito ASCII en el resumen binario MD5 del resumen "j" :: MD5 :: resumen String # scan*pasa los elementos de la matriz como argumentos aprint. Esta matriz es ["6"].3fromSet[?a,?b,?c].count: cuenta todos los elementos Set :: [] Enumerable # count8desdeSignalException.new('FPE').signo: número de SIGFPE Clase # nuevo SignalException # signo1desdeFloat::ROUNDS: modo de redondeo, aquí 1 para redondear al más cercano1frombegin(nueva línea)exit false(nueva línea)rescue Object(nueva línea)$!.status(nueva línea)end: estado de salida por fallaSystemExit.new(false).status, pero por la interpretación 3, ya no puedo llamar a Class # new . En cambio, levanto y rescato un SystemExit7fromProcess::RLIMIT_NPROC: número para límite de recursos para número de procesos para un usuario7desde:aaaaaaa.size: longitud del símbolo Símbolo # tamaño2desdePrime.first: primer número primo Enumerable # first0from?/.next: siguiente cadena después de "?" Cadena # siguiente3desde{a:p,b:p,c:p}.size: longitud del hash Hash # tamaño Cadena # p0fromSTDIN.lineno: número de línea actual para entrada estándar IO # lineno$<. Yo usoSTDIN. La diferencia es que$<es una variable global ySTDINes una constante. Un programa puede establecer$<una entrada diferente, peroSTDINsiempre es el valor original de$<.3from?a.crypt('at')[/\d/]: primer dígito ASCII en la contraseña cifrada String # crypt String # []0from{a: :a}.find_index([:a,:a]): índice de la primera clave: a, valor: a en hash Enumerable # find_index9from/b/=~'aaaaaaaaab': índice donde la cadena coincide / b / Regexp # = ~1from[?a,?b].index(?b): índice de la primera "b" en la matriz Array # index7from:aaaaaaab=~/b/: índice donde el símbolo coincide / b / Símbolo # = ~9from?\t.ord: valor ASCII de la pestaña "\ t" Cadena # ord8from'aaaaaaaab'=~/b/: índice donde la cadena coincide / b / String # = ~0fromopen(?/).pos: posición en el archivo después de abrir el directorio raíz "/" como un archivo Kernel # open IO # pos5from'aaaaab'.index(?b): índice de la primera "b" en la cadena String # index7from?\a.bytes{|b|break b}: valor ASCII de la alerta "\ a" Cadena # bytes6from'aaaaaaa'.rindex(?a): índice de la última "a" en la cadena String # rindex2from%w[a a].map.size: tamaño del enumerador que se asigna desde la matriz Array # map Enumerator # sizefuente
newRealmente siempre se llama la misma implementación o se anula en las subclases? [ctd.]Java, 21 dígitos, 276 caracteres
fuente
7-4y-4+7, eso es inteligente! :)7no es una constante sino un literalRubí, 74 caracteres, 10 dígitos.
Es solo un comienzo; Tengo que ir, así que lo mejoraré más tarde.
¡Tengo 76 caracteres guardados para más tarde, cuando será más difícil!
fuente
Ruby, 17 dígitos, 168 bytes
Sin golf:
Todavía no me he visto obligado a hacer nada particularmente inteligente, puedo volver y agregar dígitos.
fuente
succynextson alias.$.dos veces. Aunque, tengo que amar$....: DGolfscript , 17 dígitos
Un intento directo. ¡Golfscript puede tener muchas incorporaciones no alfanuméricas de una letra, pero no tiene muchas incorporaciones en su conjunto!
fuente
5,)\; # range, right uncons, flip, and pop.Bash, 5 dígitos en 65 caracteres
¡Actualizaré esto pronto! Por ahora, solo imprime
1.6180y no contiene ningún dígito.Explicación
Los siguientes métodos se utilizan para generar los dígitos:
1: estado de salida de
false6: longitud de la cuerda
1:
nlabuso8:
killnúmeros de señal0: valor numérico de una expresión vacía
fuente
Mathematica
98 dígitos, en868378 caracteres.Salida:
fuente
#con un dígito permitido y soltando uno de los guiones.Julia: 23 dígitos en 345 caracteres (15 por dígito exactamente)
Salida: 1.6180339887498948482045
Interpreté los caracteres y las cadenas como utilizables, siempre que no reutilizara un carácter o cadena específicos (los caracteres de una cadena podrían reutilizarse, siempre que la cadena no lo fuera); sin embargo, no me permití usar el valor int de un personaje directamente. Hay un carácter no ASCII (©).
De una manera más legible (código no real):
fuente
C ++ 12.4 caracteres por línea, fue de 14 caracteres por línea para cada dígito
Se corrigió mi error de reutilizar operadores.
¿No está seguro si usar caracteres como este cuenta como literales char o no? Si este código es aceptable, se puede continuar para siempre y se pagará la deuda.
fuente
-operador. Además, me gusta cómo contó el comentario para la longitud de la línea. : D1para producir un0(que está prohibido, porque1apareció antes en la proporción áurea). También es necesario contar el#define S(no el otro), ya que no es una inclusión sino que solo define un alias abreviado.