Então, você estava sentado à sua mesa, jogando golfe em um programa para calcular os primeiros 20 dígitos de pi, e aí vem seu chefe e joga sua maçã pela janela. Agora você está trabalhando em um novo projeto e este computador ainda não possui nenhum recurso de texto. Nenhum. Sem fontes. Nada.
Agora vamos terminar esse programa. Calcular e exibir os 20 primeiros caracteres de pi sem usar nenhuma fonte que não faça parte do seu programa. Sua saída pode ser exibida ou gravada como padrão como um arquivo de imagem (jpeg, png, gif, svg (contanto que você não use caracteres), bmp, xpm). Você pode usar qualquer idioma, mas não pode usar as funções de fonte, exibição de texto ou similares do seu idioma.
bônus pequeno (10 caracteres) Se funcionar em uma Lisa.
Edit: para quem não descobriu, minha inspiração foi o primeiro mac, e o título é um trocadilho. Um grande parabéns para @Sukminder, cujo gif animado é simplesmente legal. O concurso não termina se surgir uma resposta melhor.
fonte
Respostas:
Python, 222 caracteres
A primeira linha calcula os dígitos de pi usando a aproximação
pi-3 ~= 277991633/1963319607
. As próximas três linhas produzem 20 caracteres de pi usando o ASCII art Nemeth Braille.Estou empurrando os limites em duas direções aqui, tanto nos sentidos "calculando Pi" quanto "legível por humanos".
fonte
*
espaços e os espaços sem uma fonte?*
como um pixel preto 1x1 e `` como um pixel branco 1x1.*
sem o uso de fontes, eu acho que você está desclassificadoPython, 217 bytes
Requer a biblioteca de imagens Python
A contagem de bytes supõe que o caractere de escape
\177
seja substituído por seu equivalente literal (caractere 127 ).A saída será exibida da seguinte forma (será aberta no seu visualizador * .bmp padrão):
Observe que isso pode ser facilmente parametrizado para imprimir qualquer número de dígitos que você desejar. A seguir, será aceita uma entrada inteira do stdin e exibirá muitos dígitos:
Saída para n = 80 :
Cálculo Pi
Sim, é isso. A fórmula usada é o resultado da aplicação da Transformada de Euler à Série Leibniz e, em seguida, fatorando cada termo do restante da soma. A fórmula converge linearmente; cada dígito requer log 2 (10) ≈ 3,32 iterações. Para os interessados na derivação, consulte o Apêndice A.
Exibição
O PIL é usado para geração de imagens, porque é a biblioteca mais conveniente que eu conheço. Um bitmap em branco e preto e branco de 141 × 11 é criado e, em seguida, são desenhadas linhas brancas em uma forma de sete segmentos, um pixel de cada vez. As posições necessárias para desenhar cada segmento são armazenadas em uma sequência de máscaras de bits, com os bits correspondentes às seguintes posições:
O bit de mágica
(j%7/5*4-~j%7/4*~j/7+p,j%7*3%14%8+j%14/10+2)
produz cada pixel na seguinte ordem (base-18):Apêndice A
A transformação de Euler é uma técnica de aceleração de convergência que funciona para qualquer série que exibe convergência monotônica absoluta. A série resultante convergirá linearmente, normalmente na taxa de um bit por termo (observe que, se a série original já era super-linear, a série resultante realmente convergirá mais lentamente). A descrição puramente matemática é um pouco difícil de seguir, portanto, adotarei uma abordagem processual.
Vamos começar com a série Leibniz:
Em seguida, divida cada termo ao meio, combinando termos vizinhos:
Simplificado:
Generalizado:
Observe que o líder ½ não tinha um termo de parceiro e, portanto, foi excluído do restante da soma. Este é o primeiro termo da série transformada. Para encontrar o próximo termo, repetimos o processo novamente:
E de novo:
E de novo:
E mais uma vez, para uma boa medida:
Neste ponto, temos os cinco primeiros termos e o sexto termo é evidente. Isso deve ser suficiente para generalizar, então vamos parar por aqui. Começaremos fatorando os numeradores e denominadores:
Os denominadores evidentemente contêm um fatorial duplo de 2n + 1 ; portanto, corrigiremos isso em:
Tudo se encaixa, exceto os dois primeiros termos que não são contabilizados como 2 no denominador. Podemos corrigir isso multiplicando a expressão inteira por 2 :
2 3 = 2 , 4 , então:
O numerador agora pode ser facilmente identificado como n! .
Observe que o fator adicionado a cada termo sucessivo, n / (2n + 1) , se aproxima de ½ quando n se torna grande, implicando uma convergência linear na taxa de um bit por termo - isso é de fato por design. Um bom resultado, mas seria ainda melhor sem os fatoriais presentes. O que podemos fazer aqui é fatorar cada termo sucessivo do restante da soma, o que gerará uma expressão aninhada:
Isso pode ser reescrito como uma relação de recorrência:
Onde n conta inversamente a partir de ⌈ log 2 (10) · d ⌉ .. 0 , onde d é o número de dígitos necessários.
Pode ser interessante notar que o ponto estável dessa recorrência é exatamente 2 (ou 4, se você o dobrou, como eu fiz na implementação acima), para que você possa salvar várias iterações ao inicializar corretamente. No entanto, inicializar com um valor aleatório necessário em outro lugar e lançar algumas iterações extras no topo geralmente são mais baratas em bytes.
fonte
p
emp/2 * x/p + ...
está fazendo .. AIUI Python suporta promoção automática para um tipo de dados BigInteger-ish, por isso não deve ser uma coisa precisão, mas de alguma forma aquelesp
é matéria e não cancelar fora, como eu imagino eles para ... o que estou perdendo aqui?p
inicializou ímpar, de modo quep/2/p
é equivalente - na divisão inteira - a((p-1)/2)/p
. Isto produz o1/3
,2/5
,3/7
, etc. termos derivado acima.#C - 777 caracteresC - 731 caracteres
Imprime GIF para
stdout
.3
.Costurando GIF a partir do cabeçalho pré-configurado + cada dígito representado pela fonte caseira (incorporada) de 5x5 pixels.
Observe que o GIF desaparece, às vezes, no Chrome após uma execução.
Breve introdução:
Cálculo de PI
O Pi é calculado usando uma versão ligeiramente modificada da implementação de Din Winter e Achim Flammenkamp do algoritmo de Rabinowitz e Wagon para calcular dígitos de π.
Geração de GIF
Imagens GIF tem uma
canvas
propriedade no cabeçalho. Podemos usar isso em combinação com a exibição de várias imagens, configurando aleft
propriedade para cada dígito de acordo - onde cada dígito é uma imagem (incorporada) em si mesma.Documentação.
Exemplo:
Código expandido (com muitos comentários)
Confuso, mas isso faz parte da minimização :
Procurando usar um algoritmo mais curto / outro para calcular π.
fonte
JavaScript, 680 caracteres
Isso pode ser visualizado em um navegador da web; os números são exibidos como caminhos SVG.
Ele não calcula pi de uma maneira interessante, e JS não possui um tipo de número com precisão para exibir 20 dígitos.
Para salvar os caracteres, omiti os dados do caminho para "0", pois eles não aparecem na sequência.
fonte
Java -
866860857853 caracteres, além de uma versão fraudulenta com 574 caracteresUsando a fórmula de Simon Plouffe de 1996, gera um
x.png
arquivo com números brancos do tipo relógio digital em fundo preto:Este é o código compactado:
Isso, com identing e alguns espaços em branco, seria este:
Trapaceando as regras e considerando que o cálculo do PI pode ser feito como "a representação numérica da String 3.1415926535897934384", isso pode ser reduzido para 574 caracteres:
fonte
Java -
642622 caracteresCopiando da minha resposta anterior, usando a fórmula de Simon Plouffe de 1996. Mas produz ASCII-art:
Tudo isso, com algumas identificações e espaços, e um pouco de ajuda para o leitor entender o significado dos números mágicos:
Resultado:
fonte
C,
253250 caracteresAproxima pi usando o algoritmo no código do @ Sukminder (emprestando e refatorando descaradamente o código deles um pouco). Produz uma imagem PBM binária , que pode, por exemplo, ser convertida com o ImageMagick.
Veja como é a saída do meu renderizador PPM baseado em Braille:
Tem a mesma peculiaridade da resposta de @ Sukminder, na medida em que falta um separador decimal. Além disso, a saída da minha é vertical, e se é legível por humanos é discutível ...
Editar: aplicou as sugestões de @ ugoren.
fonte
puts
para afor
inicialização, definaL[5]
e omita,0
. Façad
um parâmetro paramain
(salve uma vírgula).PHP 380
requer gd ativado para saída de imagem
cálculo do pi: como o php base tem uma precisão padrão de 14 e eu não queria recompilar o servidor com as extensões de precisão arbitrárias ativadas, eu não conseguia nem aproximar o PI com as casas decimais necessárias, portanto, calcula tau / 2 e depois o resto das casas decimais
como o gráfico é composto de 0 e 1, posso tentar usar o WBMP como o formato mais tarde para ver se consigo remover o gd
fonte
3x5 with 1 px between chars
. a cor é vermelha apenas para reduzir de 4 caracteres, mas considerando que eu não vou ganhar, eu vou mudá-lo para branco para facilitar a leituraimagecreate
), a primeira chamada deimagecolorallocate
define a cor do plano de fundo e uma segunda é necessária para definir a cor da escrita. para que termine mais tempoImpressora C + LaserWriter 599 - 10 = 589
Canalize a saída para o seu LaserWriter! :) Isso deve funcionar em uma Lisa (com um compilador C).
Ele calcula
pi
na impressora calculando a soma dos comprimentos dos segmentos de linha que se aproximam de uma sequência da curva de Bezier que se aproxima de um semicírculo, dividido pelo diâmetro, vezes 2.Ungolfed Level-1 (compatível com 1985) PostScript:
Resultado:
fonte
Java,
157426431934 caracteres1934 caracteres compactados :
2643 caracteres expandidos :
Método Pi reunido em: /programming/8343977/calculate-pi-on-an-android-phone?rq=1
fonte
throws Exception
emmain
e remover o bloco try-catch. Além disso, você pode renomearpi
esqrt
métodos eloc
,args
,SCALE
,x0
ex1
variáveis para 1 identificadores de char. E, a propósito, você deve adicionar a classe completa, isso inclui aclass Foo{
declaração e as importações.