¡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.6
que cuenta que1.6
ya 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.618
tienes 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,
1
puede no aparecer en ninguna parte de su código fuente, porque es el primer dígito. El código que da salida a la8
de1.618
puede 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,9
ya'\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
PI
a ambosp
yq
no significa que pueda usarlop
una yq
otra vez. Del mismo modo, está permitido el uso de un nombre dos veces si se refiere a dos muebles empotrados diferentes, como cadenalength
y 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)/2
Está 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+2
es 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 tantos5
s 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#count
yEnumerable#count
no son la misma función para la restricción 6. Ambos métodos actúan igual, peroArray#count
anulanEnumerable#count
con una implementación diferente. Si usoArray#count
para generar un dígito, puedo usarEnumerable#count
para generar otro dígito.Mutex.new
,Random.new
,Time.new
y así sucesivamente se refieren al mismo método,Class#new
. Yo usoSignalException.new
para generar un dígito. Debido a la restricción 6, es posible que nunca más vuelva a usarClass#new
.Float
yIO
son constantes! Yo usoIO::LOCK_NB
para 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::APPEND
yIPSocket::LOCK_UN
son dos nombres para el mismo número 8. La restricción 6 dice: "no importa con qué nombre se refiera a ninguno incorporado". DebidoFile::APPEND
yIPSocket::LOCK_UN
sólo se diferencian por su nombre, que debe ser la misma constante, por lo que no pueden utilizarlos para los dos dígitos.$SAFE
es una variable global incorporada, no una función, operador, constante ni literal.$SAFE
tiene el valor 0. Con la escapatoria, puedo reutilizar$SAFE
para 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
print
con una larga lista de argumentos, para convertirlos en cadenas e imprimirlos en orden. Los argumentos son estos:1
from2/2
: division Fixnum # /.
from?.
: cadena de un solo carácter literal6
de9-3
: resta Fixnum # -1
desde3&5
: bitwise y Fixnum # &3
nuevo.8
de2*4
: multiplicación Fixnum # *0
de2^2
: bitwise exclusive-o Fixnum # ^3
de7%4
: módulo Fixnum #%3
desde55>>4
: desplazamiento a la derecha Fixnum # >>9
de5+4
: además Fixnum # +8
desde2<<2
: desplazamiento a la izquierda Fixnum # <<8
de-~7
: negación del complemento Fixnum # - @ Fixnum # ~7
desde5|2
: bitwise o Fixnum # |4
de2**2
: exponenciación Fixnum # **9
de(2r+2+5).to_i
: suma racional Racional # + Racional # to_i2r
son nuevos en Ruby 2.1.2r+2
llama a Rational # + y devuelve otro racional;2r+2+5
llama a Rational # + nuevamente.2/1
y flota como2.0
. Para solucionar este problema, puedo convertir a entero: to_i rondas hacia cero, ceil rondas arriba, planta redondea hacia abajo.8
desde(2.2+5).ceil
: flotación adicional Float # + Float # ceil()
y puntos.
nuevamente.9
de(55r/5-2).floor
: división racional y resta Racional # / Racional # - Racional # piso4
desde(2.2*2).to_i
: multiplicación de flotación Float # * Float # to_i8
de(2r*2*2).ceil
: multiplicación racional # racional * * racional # ceil4
de(2.2**2).floor
: exponenciación racional Racional # **8
desde2.to_bn<<2
: desplazamiento a la izquierda con número grande de OpenSSL Fixnum # to_bn OpenSSL :: BN # <<2
from__LINE__
: constante mágica para el número de línea actual0
from$<.to_i
: descriptor de archivo de entrada estándar IO # to_i4
fromIO::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.5
fromErrno::EIO::Errno
: número de error de entrada / salida8
fromFile::APPEND
: marca para agregar a un archivoIO
, peroFile
hereda constantes deIO
, por lo queFile::APPEND
es una forma diferente de obtenerIO::APPEND
.6
from'aaaaaa'.size
: longitud de la cadena String # size8
from?a.encoding.name.sub(/\D+/,'')
: parte del nombre de la codificación Cadena # codificación Codificación # nombre Cadena # sub3
from%w[a a a].size
: longitud de la matriz Array # size4
from%w[a b c d].to_set.size
: número de elementos en set Array # to_set Set # size3
from%w[a a a].count
: cuenta todos los elementos Array # count6
deSocket::AF_NS
: número para la familia de direcciones NS5
desdeDate.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ía6
de*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"].3
fromSet[?a,?b,?c].count
: cuenta todos los elementos Set :: [] Enumerable # count8
desdeSignalException.new('FPE').signo
: número de SIGFPE Clase # nuevo SignalException # signo1
desdeFloat::ROUNDS
: modo de redondeo, aquí 1 para redondear al más cercano1
frombegin
(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 SystemExit7
fromProcess::RLIMIT_NPROC
: número para límite de recursos para número de procesos para un usuario7
desde:aaaaaaa.size
: longitud del símbolo Símbolo # tamaño2
desdePrime.first
: primer número primo Enumerable # first0
from?/.next
: siguiente cadena después de "?" Cadena # siguiente3
desde{a:p,b:p,c:p}.size
: longitud del hash Hash # tamaño Cadena # p0
fromSTDIN.lineno
: número de línea actual para entrada estándar IO # lineno$<
. Yo usoSTDIN
. La diferencia es que$<
es una variable global ySTDIN
es una constante. Un programa puede establecer$<
una entrada diferente, peroSTDIN
siempre es el valor original de$<
.3
from?a.crypt('at')[/\d/]
: primer dígito ASCII en la contraseña cifrada String # crypt String # []0
from{a: :a}.find_index([:a,:a])
: índice de la primera clave: a, valor: a en hash Enumerable # find_index9
from/b/=~'aaaaaaaaab'
: índice donde la cadena coincide / b / Regexp # = ~1
from[?a,?b].index(?b)
: índice de la primera "b" en la matriz Array # index7
from:aaaaaaab=~/b/
: índice donde el símbolo coincide / b / Símbolo # = ~9
from?\t.ord
: valor ASCII de la pestaña "\ t" Cadena # ord8
from'aaaaaaaab'=~/b/
: índice donde la cadena coincide / b / String # = ~0
fromopen(?/).pos
: posición en el archivo después de abrir el directorio raíz "/" como un archivo Kernel # open IO # pos5
from'aaaaab'.index(?b)
: índice de la primera "b" en la cadena String # index7
from?\a.bytes{|b|break b}
: valor ASCII de la alerta "\ a" Cadena # bytes6
from'aaaaaaa'.rindex(?a)
: índice de la última "a" en la cadena String # rindex2
from%w[a a].map.size
: tamaño del enumerador que se asigna desde la matriz Array # map Enumerator # sizefuente
new
Realmente siempre se llama la misma implementación o se anula en las subclases? [ctd.]Java, 21 dígitos, 276 caracteres
fuente
7-4
y-4+7
, eso es inteligente! :)7
no 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
succ
ynext
son 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.6180
y no contiene ningún dígito.Explicación
Los siguientes métodos se utilizan para generar los dígitos:
1: estado de salida de
false
6: longitud de la cuerda
1:
nl
abuso8:
kill
nú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. : D1
para producir un0
(que está prohibido, porque1
apareció 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.