Entonces, estabas sentado en tu escritorio, jugando un programa para calcular los primeros 20 dígitos de pi, y luego viene tu jefe y arroja tu manzana IIe por la ventana. Ahora está trabajando en un nuevo proyecto y esta computadora aún no tiene ninguna capacidad de texto. Ninguna. No hay fuentes Nada.
Ahora terminemos ese programa. Calcule y muestre los primeros 20 caracteres de pi sin usar ninguna fuente que no forme parte de su programa. Su salida se puede mostrar o escribir en un archivo de imagen estándar (jpeg, png, gif, svg (siempre que no use ningún carácter), bmp, xpm). Puede usar cualquier idioma, pero no puede usar las funciones de fuente, visualización de texto o similar de su idioma.
pequeño bono (10 caracteres) si funcionará en una Lisa.
Editar: para aquellos que no lo descubrieron, mi inspiración fue el primer mac, y el título es un juego de palabras. Un gran saludo a @Sukminder cuyo gif animado es genial. El concurso no termina si aparece una mejor respuesta.
fuente
Respuestas:
Python, 222 caracteres
La primera línea calcula los dígitos de pi usando la aproximación
pi-3 ~= 277991633/1963319607
. Las siguientes tres líneas generan 20 caracteres de pi usando el arte ASCII Nemeth Braille.Aquí estoy empujando los límites en dos direcciones, tanto en el sentido de "cálculo de Pi" como en el de "lectura humana".
fuente
*
's y los espacios sin una fuente?*
en un píxel negro 1x1 y `` como un píxel blanco 1x1.*
sin usar fuentes, creo que estás descalificadoPython, 217 bytes
Requiere la biblioteca de imágenes de Python
El recuento de bytes supone que el carácter escapado
\177
se reemplaza con su equivalente literal (char 127 ).La salida aparecerá de la siguiente manera (se abrirá en su visor predeterminado * .bmp):
Tenga en cuenta que esto podría parametrizarse fácilmente para imprimir cualquier número de dígitos que desee. Lo siguiente aceptará una entrada entera de stdin y mostrará esa cantidad de dígitos:
Salida para n = 80 :
Cálculo de pi
SIP eso es. La fórmula utilizada es el resultado de aplicar la Transformada de Euler a la Serie Leibniz y luego deducir cada término del resto de la suma. La fórmula converge linealmente; cada dígito requiere log 2 (10) ≈ 3.32 iteraciones. Para aquellos interesados en la derivación, vea el Apéndice A.
Monitor
PIL se usa para generar imágenes, porque es la biblioteca más conveniente que conozco. Se crea un mapa de bits en blanco y negro 141 × 11 en blanco, y luego se dibujan líneas blancas en forma de siete segmentos, un píxel a la vez. Las posiciones requeridas para dibujar cada segmento se almacenan en una cadena de máscara de bits, con bits correspondientes a las siguientes posiciones:
El bit de magia
(j%7/5*4-~j%7/4*~j/7+p,j%7*3%14%8+j%14/10+2)
produce cada píxel en el siguiente orden (base-18):Apéndice A
La transformación de Euler es una técnica de aceleración de convergencia que funciona para cualquier serie que muestre una convergencia monotónica absoluta. La serie resultante convergerá linealmente, típicamente a una velocidad de un bit por término (tenga en cuenta que si la serie original ya era superlineal, la serie resultante en realidad convergerá más lentamente). La descripción puramente matemática es un poco difícil de seguir, por lo que adoptaré un enfoque de procedimiento.
Comenzaremos con la serie Leibniz:
Luego divide cada término por la mitad, combinando términos vecinos:
Simplificado:
Generalizado:
Observe que la ½ inicial no tenía un término asociado, y por lo tanto se excluyó del resto de la suma. Este es el primer término de la serie transformada. Para encontrar el siguiente término, repetimos el proceso nuevamente:
Y otra vez:
Y otra vez:
Y una vez más por si acaso:
En este punto tenemos los primeros cinco términos, y el sexto término es evidente. Esto debería ser suficiente para generalizar, así que pararemos aquí. Comenzaremos factorizando los numeradores y denominadores:
Los denominadores evidentemente contienen un Factorial doble de 2n + 1 , por lo que lo repararemos en:
Todo encaja, excepto los dos primeros términos que tienen un 2 no contabilizado en el denominador. Podemos arreglar eso multiplicando la expresión completa por 2 :
2 3 = 2 · 4 , entonces:
El numerador ahora se puede identificar fácilmente como n! .
Observe que el factor agregado a cada término sucesivo, n / (2n + 1) , se aproxima a ½ a medida que n se hace grande, lo que implica una convergencia lineal a una tasa de un bit por término; esto es, de hecho, por diseño. Un buen resultado, pero sería aún mejor sin los factoriales allí. Lo que podemos hacer aquí es factorizar cada término sucesivo del resto de la suma, lo que generará una expresión anidada:
Esto puede reescribirse como una relación de recurrencia:
Donde n cuenta hacia atrás desde ⌈ log 2 (10) · d ⌉ .. 0 , donde d es el número de dígitos requerido.
Puede ser interesante observar que el punto estable de esta recurrencia es exactamente 2 (o 4 si lo ha duplicado, como lo hice en la implicación anterior), por lo que puede guardar una serie de iteraciones inicializando correctamente. Sin embargo, inicializar a un valor aleatorio que necesita en otro lugar y lanzar algunas iteraciones adicionales en la parte superior es generalmente más barato en bytes.
fuente
p
enp/2 * x/p + ...
está haciendo .. AIUI Python admite la promoción automática a un tipo de datos BigInteger-ish, por lo que no debe ser una cosa precisión, pero de alguna manera losp
es la materia y no cancela fuera como me imagino ellos a ... ¿qué me estoy perdiendo aquí?p
inicializó impar, por lo quep/2/p
es equivalente, bajo división entera, a((p-1)/2)/p
. Esto produce el1/3
,2/5
,3/7
, etc. términos derivados anteriormente.#C - 777 PersonajesC - 731 caracteres
Imprime GIF en
stdout
.3
.Unir GIF desde un encabezado preconfigurado + cada dígito representado por una fuente casera (incrustada) de 5x5 píxeles.
Tenga en cuenta que GIF desaparece, a veces, en Chrome después de una ejecución.
Breve introducción:
Cálculo de PI
Pi se calcula utilizando una versión ligeramente modificada de la implementación de Dik Winter y Achim Flammenkamp del algoritmo de Rabinowitz y Wagon para calcular dígitos de π.
Generación de GIF
Las imágenes GIF tienen una
canvas
propiedad en el encabezado. Podemos usar esto en combinación con la visualización de múltiples imágenes estableciendo laleft
propiedad para cada dígito en consecuencia, donde cada dígito es una imagen (incrustada) en sí misma.Documentación.
Ejemplo:
Código ampliado (con muchos comentarios)
Desordenado, pero eso es parte de la minimización :
Buscando usar un algoritmo más corto / otro para calcular π.
fuente
JavaScript, 680 caracteres
Esto se puede ver en un navegador web; los números se muestran como rutas SVG.
No calcula pi de una manera interesante, y JS carece de un tipo de número con precisión para mostrar 20 dígitos.
Para guardar caracteres, omití los datos de ruta para "0", ya que no aparece en la secuencia.
fuente
Java:
866860857853 caracteres, más una versión trampa con 574 caracteresUsando la fórmula Simon Plouffe de 1996, genera un
x.png
archivo con números blancos tipo reloj digital en un fondo negro:Este es el código comprimido:
Eso, con identificación y algunos espacios en blanco sería esto:
Hacer trampa en las reglas y considerar que el cálculo de PI se puede hacer como "la representación numérica de la Cadena 3.1415926535897934384", esto se puede reducir a 574 caracteres:
fuente
Java -
642622 caracteresCopiando de mi respuesta anterior, usando la fórmula Simon Plouffe de 1996. Pero en cambio saca el arte ASCII:
Todo eso, con algunas identificaciones y espacios, y un poco de ayuda para que el lector entienda el significado de los números mágicos:
Salida:
fuente
C,
253250 caracteresAproxima pi usando el algoritmo en el código de @ Sukminder (tomando prestado y refactorizando su código un poco descaradamente). Emite una imagen binaria PBM , que luego podría, por ejemplo, convertirse con ImageMagick.
Así es como se ve la salida con mi renderizador PPM basado en Braille:
Tiene el mismo capricho que la respuesta de @ Sukminder, ya que carece de un separador decimal. Además, la producción mía es vertical, y si es legible para los humanos es discutible ...
Editar: se aplicaron las sugerencias de @ ugoren.
fuente
puts
a lafor
inicialización, definirL[5]
y omitir,0
. Hagad
un parámetro paramain
(guardar una coma).PHP 380
requiere gd habilitado para salida de imagen
cálculo pi: dado que la base php tiene una precisión predeterminada de 14 y no quería volver a compilar el servidor con las extensiones de precisión arbitrarias habilitadas, ni siquiera pude aproximar PI con los decimales requeridos, por lo que calcula tau / 2 y luego el resto de los decimales
Como el gráfico está hecho de 0 y 1, puedo intentar usar WBMP como formato más adelante para ver si puedo eliminar gd
fuente
3x5 with 1 px between chars
. el color es rojo solo para reducir 4 caracteres, pero teniendo en cuenta que no ganaré, lo cambiaré a blanco paraimagecreate
), la primera invocación deimagecolorallocate
establece el color de fondo, y se necesita una segunda para establecer el color de escritura. así que termina más tiempoImpresora C + LaserWriter 599-10 = 589
¡Canalice la salida a su LaserWriter! :) Esto debería funcionar en una Lisa (con un compilador de C).
Calcula
pi
en la impresora calculando la suma de las longitudes de los segmentos de línea que se aproximan a una secuencia de curva de Bezier que se aproxima a un semicírculo, dividido por el diámetro, multiplicado por 2.PostScript Ungolfed Nivel-1 (compatible con 1985):
Salida:
fuente
Java,
157426431934 caracteresCaracteres comprimidos de 1934 :
2643 caracteres expandidos :
Método Pi recopilado de: /programming/8343977/calculate-pi-on-an-android-phone?rq=1
fuente
throws Exception
enmain
y retirar el bloque try-catch. Además, es posible cambiar el nombrepi
ysqrt
los métodos y losloc
,args
,SCALE
,x0
yx1
las variables a 1 identificadores de carbonilla. Y, por cierto , debe agregar la clase completa, esto incluye laclass Foo{
declaración y las importaciones.