Isso foi divertido! No entanto, com apenas três dígitos, a diversão acabou cedo demais. Esse desafio é semelhante, mas continuaremos com a diversão.
O desafio
Imprima o maior número possível de dígitos da Proporção áurea .. A Proporção áurea é definida como o número que satisfaz φ = (φ + 1) / φ e os 100 primeiros dígitos são dados por:
1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375 ...
Esse desafio não é sobre a computação! Trata-se de imprimir o maior número possível de dígitos sem usar nenhum método para fazer isso duas vezes. Portanto, encontre o maior número possível de maneiras criativas de obter seus dígitos!
Restrições
Por si só, imprimir os dígitos de φ seria um pouco simples demais, então aqui estão as regras:
- Você precisa construir o número na ordem da esquerda para a direita , imprimindo-a peça por peça ou construindo uma string da esquerda para a direita e imprimindo-a no final - você pode até gerar uma matriz de caracteres de dígito e, em seguida, imprima, desde que faça em ordem. Nas regras a seguir, "print" e "output" podem se referir a qualquer um desses processos (por exemplo, se você está construindo uma string, e a string contém o
1.6
que conta como1.6
já foi impresso). - Para o seu código, você recebe um orçamento de 15 caracteres por dígito . O período não conta para esse orçamento, mas deve ser impresso também. Observe que a restrição é apenas no tamanho total do código: você pode usar mais de 15 caracteres para qualquer dígito, desde que não use mais, em média. De fato, você pode criar uma "dívida" em caracteres e "pagar" mais tarde. Por exemplo, para imprimir
1.618
você tem 60 caracteres. - As inclusões / importações da biblioteca padrão não contam para o tamanho do código. Mas você não pode fornecer esses aliases abreviados de graça!
- Você não deve usar o dígito que está gerando no momento nem o que já imprimiu. Por exemplo,
1
pode não aparecer em nenhum lugar no seu código-fonte, porque é o primeiro dígito. O código que gera o8
no1.618
pode usar qualquer um ou todos os dígitos[0234579]
, mas nenhum[168]
. Para esse propósito, todos os literais equivalentes a um único dígito são tratados como esse dígito . Portanto, se o seu idioma puder representar9
como'\t'
você não está autorizado a usá-lo em qualquer lugar, onde você não poderá usar um9
. - Você não deve produzir vários dígitos ao mesmo tempo. Deve ser possível dividir claramente seu código em partes que geram um dígito por vez.
Você não deve se referir a qualquer built-in função, operador / string matemática / boolean / bit-wise, variável ou constante que você usou no código que gerou um dígito antes. Exceções são funções de conversão de número inteiro para string, concatenação de strings e impressão, que você pode precisar para cada dígito. Observe que não importa com que nome você se refere a nenhum built-in: apenas porque você alias um built-in
PI
para ambosp
eq
não significa que você pode usarp
umaq
vez. Da mesma forma, você está autorizado a usar um nome duas vezes se refere a dois diferentes built-ins, como cordaslength
e variedadelength
.Se a sua linguagem de programação não tiver funções, use seu melhor julgamento sobre qual seria o equivalente - por exemplo, para scripts bash, a chamada de outros programas deve seguir as regras impostas às funções
- Seu envio deve ser escrito em um único idioma. Portanto, não é necessário executar o intérprete de outro idioma para obter acesso aos recursos internos desse idioma.
Implicações
Os pontos a seguir estão todos implícitos nas regras acima, mas eu os adiciono aqui para evitar perguntas que já surgiram na sandbox:
- Você não tem permissão para substituir partes de sua saída imprimindo alguns backspaces (geralmente
'\b'
) no meio. - São proibidos os loops que geram / geram vários dígitos. (Os loops que calculam um único dígito são bons, no entanto.)
(1 + √5)/2
É proibida a utilização de uma versão ofuscada ou a divisão dos números de Fibonacci para obter mais de um dígito.- Você não pode pré-calcular os 10 dígitos e armazená-los em 10 variáveis e depois apenas se referir a eles, porque essas referências a variáveis não geram o dígito - o código que preenche a variável, portanto, isso é uma violação da regra 6.
- Na verdade, você não pode reutilizar nenhum resultado anterior (ou intermediário), porque isso significaria que dois dígitos compartilhariam código para serem gerados .
- Caso contrário, você pode usar qualquer meio (que não precise ser puramente matemático) para gerar os dígitos. (E você deveria!)
- De fato, não há necessidade de calcular nada, se você puder obter os dígitos corretos de muitos lugares diferentes usando sua biblioteca padrão.
- Você pode usar um operador várias vezes enquanto gera um único dígito; portanto,
2+2+2
é justo jogar o primeiro6
(embora seja improvável o menor). - Você pode usar qualquer literal quantas vezes quiser, porque elas não são constantes internas. Contanto que você não precise imprimir
5
, você pode quantos5
s em seu código quiser. - Você não pode codificar a saída, porque isso envolveria o uso dos dígitos que você está produzindo.
Resumindo: não use nenhum método para gerar dígitos duas vezes e não use o dígito que você está produzindo no momento ou se já foi impresso.
Se você encontrar uma brecha que permita obter uma pontuação (quase) infinita, não estrague o desafio explorando-a, mas avise-me para que eu possa ver se a brecha pode ser corrigida sem quebrar nada.
Pontuação
O programa que imprime o maior número de dígitos vence corretamente. Em caso de empate, o código mais curto quebra o empate.
Por favor, adicione uma versão comentada não destruída que identifique qual parte do seu código gera qual dígito.
PS: Se alguém ultrapassar os 100 dígitos acima, aqui estão mais alguns .
x = (x+1)/x
(ou x^2 = x+1
) (ou x^2-x+1
).